The sample shop database

Every lesson uses this web-shop database, with customers, a product catalogue, orders, and staff data. Its roughly 50,000 rows are enough to show how grouping and indexes behave with realistic data.

Use this page to check table and column names while working through the examples or writing queries of your own.

The information below is read from the sample file, so it matches the database you open in the app.

Column names in monospace are the ones you type. The notes column marks what the database knows about each one:

  • primary key — identifies the row. Never repeated, never empty.
  • required — the column cannot be left empty (NOT NULL). Anything without this mark can hold NULL, which is what the filtering lesson is about.
  • → table.column — a foreign key: this column holds a value from that other table. Joins follow these.
  • unique — no two rows may share this value. An upsert detects a conflict on this.
  • indexed — the database keeps a sorted copy of this column, so filtering and sorting on it is fast. The last lesson explains what that means.

Catalogue

categories 33 rows

ColumnTypeNotes
idINTEGERprimary key
nameTEXTrequired, unique
descriptionTEXT
parent_idINTEGER→ categories.id, indexed
sort_orderINTEGERrequired, default 0
is_activeINTEGERrequired, default 1

products 400 rows

ColumnTypeNotes
idINTEGERprimary key
category_idINTEGER→ categories.id, required, indexed
nameTEXTrequired
descriptionTEXT
skuTEXTrequired, unique
priceREALrequired, indexed, default 0
costREALrequired, default 0
stock_quantityINTEGERrequired, default 0
weight_kgREAL
attributesTEXT
is_activeINTEGERrequired, default 1
created_atTEXTrequired
updated_atTEXTrequired

product_images 1,024 rows

ColumnTypeNotes
idINTEGERprimary key
product_idINTEGER→ products.id, required, indexed
urlTEXTrequired
alt_textTEXT
sort_orderINTEGERrequired, default 0
is_primaryINTEGERrequired, default 0

tags 15 rows

ColumnTypeNotes
idINTEGERprimary key
nameTEXTrequired, unique

product_tags 624 rows

ColumnTypeNotes
product_idINTEGERprimary key, → products.id
tag_idINTEGERprimary key, → tags.id

suppliers 12 rows

ColumnTypeNotes
idINTEGERprimary key
nameTEXTrequired
contact_nameTEXT
emailTEXT
phoneTEXT
countryTEXT
ratingREAL
is_activeINTEGERrequired, default 1

product_suppliers 579 rows

ColumnTypeNotes
product_idINTEGERprimary key, → products.id
supplier_idINTEGERprimary key, → suppliers.id
supplier_skuTEXT
unit_costREALrequired
lead_time_daysINTEGERrequired, default 7

inventory_logs 11,547 rows

ColumnTypeNotes
idINTEGERprimary key
product_idINTEGER→ products.id, required, indexed
change_qtyINTEGERrequired
reasonTEXTrequired
referenceTEXT
employee_idINTEGER→ employees.id
logged_atTEXTrequired, indexed

Customers

customers 1,500 rows

ColumnTypeNotes
idINTEGERprimary key
first_nameTEXTrequired, indexed
last_nameTEXTrequired, indexed
emailTEXTrequired, unique
phoneTEXT
birth_dateTEXT
countryTEXTrequired, indexed, default 'US'
marketing_opt_inINTEGERrequired, default 0
loyalty_pointsINTEGERrequired, default 0
created_atTEXTrequired
updated_atTEXTrequired

addresses 1,959 rows

ColumnTypeNotes
idINTEGERprimary key
customer_idINTEGER→ customers.id, required, indexed
labelTEXTrequired, default 'home'
line1TEXTrequired
line2TEXT
cityTEXTrequired
postal_codeTEXT
countryTEXTrequired
is_defaultINTEGERrequired, default 0

wishlists 2,493 rows

ColumnTypeNotes
customer_idINTEGERprimary key, → customers.id
product_idINTEGERprimary key, → products.id
added_atTEXTrequired

reviews 2,992 rows

ColumnTypeNotes
idINTEGERprimary key
product_idINTEGER→ products.id, required, unique
customer_idINTEGER→ customers.id, required, unique
ratingINTEGERrequired
titleTEXT
bodyTEXT
is_verifiedINTEGERrequired, default 0
helpful_votesINTEGERrequired, default 0
created_atTEXTrequired

notifications 3,000 rows

ColumnTypeNotes
idINTEGERprimary key
customer_idINTEGER→ customers.id, required, indexed
typeTEXTrequired
titleTEXTrequired
bodyTEXT
is_readINTEGERrequired, indexed, default 0
created_atTEXTrequired

Orders

orders 4,000 rows

ColumnTypeNotes
idINTEGERprimary key
order_numberTEXTrequired, unique
customer_idINTEGER→ customers.id, required, indexed
address_idINTEGER→ addresses.id
shipping_method_idINTEGER→ shipping_methods.id
coupon_idINTEGER→ coupons.id
statusTEXTrequired, indexed
subtotalREALrequired, default 0
discountREALrequired, default 0
shipping_costREALrequired, default 0
totalREALrequired, default 0
notesTEXT
ordered_atTEXTrequired, indexed
updated_atTEXTrequired

order_items 12,091 rows

ColumnTypeNotes
idINTEGERprimary key
order_idINTEGER→ orders.id, required, unique
product_idINTEGER→ products.id, required, unique
quantityINTEGERrequired
unit_priceREALrequired

payments 3,651 rows

ColumnTypeNotes
idINTEGERprimary key
order_idINTEGER→ orders.id, required, indexed
methodTEXTrequired
amountREALrequired
currencyTEXTrequired, default 'USD'
statusTEXTrequired
transaction_refTEXT
paid_atTEXT

shipments 2,319 rows

ColumnTypeNotes
idINTEGERprimary key
order_idINTEGER→ orders.id, required, indexed
carrierTEXTrequired
tracking_numberTEXT
shipped_atTEXT
delivered_atTEXT

shipping_methods 5 rows

ColumnTypeNotes
idINTEGERprimary key
nameTEXTrequired, unique
base_costREALrequired
est_daysINTEGERrequired
is_activeINTEGERrequired, default 1

coupons 10 rows

ColumnTypeNotes
idINTEGERprimary key
codeTEXTrequired, unique
discount_typeTEXTrequired
discount_valueREALrequired
min_orderREALrequired, default 0
starts_atTEXTrequired
ends_atTEXTrequired
max_usesINTEGER
used_countINTEGERrequired, default 0

Staff

departments 10 rows

ColumnTypeNotes
idINTEGERprimary key
nameTEXTrequired, unique
descriptionTEXT
created_atTEXTrequired

employees 120 rows

ColumnTypeNotes
idINTEGERprimary key
department_idINTEGER→ departments.id, required, indexed
manager_idINTEGER→ employees.id, indexed
first_nameTEXTrequired
last_nameTEXTrequired
emailTEXTrequired, unique
phoneTEXT
hire_dateTEXTrequired
salaryREALrequired, default 0
positionTEXT
is_activeINTEGERrequired, default 1

audit_logs 2,000 rows

ColumnTypeNotes
idINTEGERprimary key
employee_idINTEGER→ employees.id
actionTEXTrequired
table_nameTEXTrequired, indexed
record_idINTEGERindexed
old_valuesTEXT
new_valuesTEXT
ip_addressTEXT
created_atTEXTrequired

Settings

settings 8 rows

ColumnTypeNotes
keyTEXTprimary key
valueTEXTrequired
descriptionTEXT
updated_atTEXTrequired

Views

A view is a saved query that behaves like a table: you can SELECT from it, but there are no rows of its own stored anywhere. These four summarize the tables above.

v_customer_lifetime 1,500 rows

ColumnTypeNotes
customer_idINTEGER
customerTEXT
countryTEXT
ordersTEXT
revenueTEXT
first_orderTEXT
last_orderTEXT

v_low_stock 44 rows

ColumnTypeNotes
idINTEGER
skuTEXT
nameTEXT
stock_quantityINTEGER
categoryTEXT

v_order_summary 4,000 rows

ColumnTypeNotes
order_idINTEGER
order_numberTEXT
statusTEXT
ordered_atTEXT
customerTEXT
countryTEXT
itemsTEXT
totalREAL

v_product_sales 400 rows

ColumnTypeNotes
product_idINTEGER
nameTEXT
skuTEXT
categoryTEXT
units_soldTEXT
revenueTEXT
avg_ratingTEXT
review_countTEXT