Expected columns and rows
Checks compare column names, values and row order against this fixture. They do not prove the query generalizes to every dataset.
SQL & DATABASE EXPLORER / ASK BETTER DATA QUESTIONS
Explore a real practice database. Build queries, see the results and learn why joins and totals sometimes surprise you.
Loading the local SQL engine…
SELECT category,
COUNT(*) AS products
FROM products
GROUP BY category
ORDER BY category;Checks compare column names, values and row order against this fixture. They do not prove the query generalizes to every dataset.
One read-only statement per run. Every query starts from the same fictional database. Runs stop after 3 seconds; results are capped at 500 rows. Ctrl/⌘ + Enter runs your query.
Write a query, then inspect its result.
What does one output row represent? Which records were excluded? Would a different dataset change your answer?
KNOW THE SHAPE BEFORE THE QUERY
All records are fictional. Prices and revenue are integer cents. Some customers have no orders; some products have no sales.
FOLLOW THE MATCHES
This fixed visualizer joins customers to orders on matching customer IDs. It models the relationship independently of your editor query.
One output row represents a customer–order match, or an unmatched customer preserved by LEFT JOIN. A customer can appear several times. Counting rows is not the same as counting customers.
Drafts, notes and completion checks save in this browser when storage is available. Query results are session-only. Export progress to move devices.
Download the 30-workshop handbook ↓
Download the practice database SQL ↓
These lessons use SQLite. PostgreSQL, MySQL and SQL Server differ in types, date functions and syntax. Production systems also require permissions, parameterized queries, indexing and backup practices beyond this read-only course.