Skip to content
Datasets / Garden Shop
Dataset

Garden Shop SQL Practice Dataset

Orders, products, inventory, suppliers, and customers for store-operations SQL practice.

Tables
6
Rows
130
Size
Small
Level
Beginner
Domain
Ecommerce
Formats
CSV · SQL

Download this dataset, free

No account, no email, no attribution required: dedicated to the public domain under CC0 1.0, so commercial use and redistribution are fine. Open it in the browser playground, take the single garden_shop.sql file to load every table into PostgreSQL, MySQL, SQLite, DuckDB, or SQL Server, or grab the raw CSV files below.

garden_shop.sql All 6 tables, 130 rows, as CREATE TABLE and INSERT statements. Download →

Garden Shop is the main SQLShed business dataset. It connects customers, orders, order line items, products, categories, and suppliers, so it works well for practicing the joins and aggregate reports people write in real operational databases.

The data includes shipped, pending, processing, and cancelled orders; products with price and cost; inventory quantities; reorder levels; and a few intentional gaps such as null shipped dates and missing supplier email addresses. Those details make it useful for learning how SQL behaves when the data is imperfect.

Schema

How the Garden Shop tables join customerscategoriessuppliersordersproductsorder_items customer_idcategory_idsupplier_idorder_idcustomer_idproduct_idcategory_idsupplier_idorder_item_idorder_idproduct_id PKPKPKPKFKPKFKFKPKFKFK + 8 more columns+ 1 more column+ 3 more columns+ 4 more columns+ 6 more columns+ 2 more columns
Arrows point from a column to the key it references. PK marks a table's key and FK a column that references another table.
Join conditions
  • orders.customer_id = customers.customer_id
  • order_items.order_id = orders.order_id
  • order_items.product_id = products.product_id
  • products.category_id = categories.category_id
  • products.supplier_id = suppliers.supplier_id
Schema · Garden Shop View dataset schema 6 tables
Table · customers

One row per customer. Some customers have no phone on file.

9 columns · 20 rows
customer_id int first_name text last_name text email text phone text city text state text signup_date date is_active bool
Table · products

One row per product, with price, cost, and inventory levels.

9 columns · 24 rows
product_id int product_name text category_id int supplier_id int price decimal cost decimal quantity_on_hand int reorder_level int discontinued bool
Table · categories

Lookup table of product categories.

2 columns · 8 rows
category_id int category_name text
Table · orders

One row per order. Unshipped orders have a null shipped_date.

6 columns · 24 rows
order_id int customer_id int order_date date shipped_date date status text coupon_code text
Table · order_items

One row per line item within an order.

5 columns · 48 rows
order_item_id int order_id int product_id int quantity int unit_price decimal
Table · suppliers

One row per supplier. Some suppliers have no contact email.

4 columns · 6 rows
supplier_id int supplier_name text contact_email text state text

Best for

  • Multi-table joins from orders to line items and products.
  • Revenue, margin, customer value, and inventory reports.
  • NULL handling for unshipped orders and missing supplier contacts.

Starter questions

  • Which products are below their reorder level?
  • How much shipped revenue did each month produce?
  • Which suppliers have the highest gross margin?

Practice lessons