datasets real and made-up data to practise on
Datasets
Data for the Playground, Database Lab and Performance Lab. Pick one and open its files.
Two years of a fictional online shop: customers, products, orders, order lines, payments and reviews.
300 orders7 tablesJan 2024 – Dec 2025
what to watch for
Tricky rows
- Emails with uppercase letters or surrounding spaces6 rows
- City names with inconsistent case or stray spaces9 rows
- The same person signed up twice: a second customer_id with the same email in different case2 rows
- Exact duplicate order rows from a retried export6 rows
files
Open a file to see what one row means, its columns and a preview. Open in Playground starts a new file there with code that loads it.
customers150 rows · 9 columns · CSV
One row per customer account. Some customers never ordered.
In your code: data/customers.csv
- customer_id
C + 5 digits
- first_name
Invented first name
- last_name
Invented last name
- email
Unique, lowercase in the clean table
- city
Profile city; empty when the customer never filled it in
- state
Two-letter US state
- segment
consumer or business
- signup_at
Account creation, UTC (YYYY-MM-DD HH:MM:SS). Some accounts predate 2024
- marketing_opt_in
Agreed to marketing email
sellers60 rows · 6 columns · CSV
Marketplace sellers who list products.
In your code: data/sellers.csv
- seller_id
S + 3 digits
- name
Store name
- city
Seller city
- state
Two-letter US state
- joined_on
Date the seller joined
- tier
standard, plus or enterprise
products328 rows · 10 columns · CSV
The catalogue. Products can launch during the period or be discontinued.
In your code: data/products.csv
- product_id
P + 4 digits
- sku
Stock code (SKU)
- name
Product name
- category
One of 8 categories
- subcategory
Subcategory within the category
- seller_id
Seller who lists it
- list_price
Current shelf price in USD; order lines record the price paid
- weight_kg
Shipping weight; missing for some products
- launched_on
First day the product could be ordered
- discontinued_on
Last listing date; empty if still sold
orders300 rows · 15 columns · CSV
One row per order. Totals are subtotal + shipping_fee + tax.
In your code: data/orders.csv
- order_id
O + 6 digits. Increases day by day, but not by time within a day: sort by ordered_at for time order
- customer_id
Who ordered
- ordered_at
Order time, UTC
- channel
web, app, phone or marketplace
- status
processing, shipped, delivered, cancelled or returned (as of 2025-12-31)
- promo_code
Promotion applied, if any
- subtotal
Sum of line totals after discount
- shipping_fee
0 at $50+ or with FREESHIP, else 5.99
- tax
7% of subtotal
- total
Amount charged
- ship_city
Delivery city
- ship_state
Delivery state
- shipped_at
Empty for processing and cancelled orders
- delivered_at
Empty until delivered
- estimated_delivery
Promised delivery date (order date + 6 days)
order_items454 rows · 7 columns · CSV
Order lines. unit_price is the price at order time, which can differ from today's list_price.
In your code: data/order_items.csv
- order_id
Order
- line_no
Line number in the order, starting at 1
- product_id
Product
- quantity
Units ordered
- unit_price
Price per unit when ordered
- discount_rate
Promotion discount, 0–0.25
- line_total
quantity × unit_price × (1 − discount_rate), rounded to cents
payments334 rows · 7 columns · CSV
Payment events. An order can have a failed attempt, a split gift-card payment, a cancelled card hold or a refund (negative amount).
In your code: data/payments.csv
- payment_id
PAY + 7 digits
- order_id
Order
- attempt
Attempt number within the order
- method
card, paypal, apple_pay, gift_card or bank_transfer
- status
captured, failed, voided or refunded
- amount
USD; refunds are negative
- created_at
Event time, UTC
reviews119 rows · 9 columns · CSV
Product reviews written after delivery. Late deliveries and returns get lower ratings.
In your code: data/reviews.csv
- review_id
R + 6 digits
- order_id
Order the product came in
- product_id
Product reviewed
- customer_id
Reviewer
- rating
1–5 stars
- title
Short headline; often empty
- body
Review text; often empty
- created_at
When the review was posted
- verified_purchase
Always true here
relationships
How to join these tables. Left column matches the right column.
- products.seller_id → sellers.seller_id
- orders.customer_id → customers.customer_id
- order_items.order_id → orders.order_id
- order_items.product_id → products.product_id
- payments.order_id → orders.order_id
- reviews.order_id → orders.order_id
- reviews.product_id → products.product_id
- reviews.customer_id → customers.customer_id