Practise SQL with a real database engine
This page runs SQLite, the most widely deployed database engine in the world, compiled to WebAssembly with the sql.js project and served from this site. When you press Run, a brand-new in-memory database is created on your device, your whole script is executed from top to bottom, and the result of every statement that returns rows is shown as a table. Because the database starts empty each time, a typical script creates its tables, inserts sample rows and then queries them, exactly like the examples in the menu.
What you can write
SQLite supports the core of standard SQL: CREATE TABLE with primary and foreign keys, INSERT, UPDATE, DELETE, SELECT with WHERE, ORDER BY, LIMIT, GROUP BY and HAVING, inner and left joins, subqueries, UNION, common table expressions with WITH (including recursive ones), views, indexes, triggers, and window functions such as ROW_NUMBER(), RANK() and running SUM() OVER. Built-in functions include string, date and maths helpers. Error messages come straight from SQLite, so a syntax mistake points at the word it did not expect.
Differences from MySQL, PostgreSQL and SQL Server
SQL dialects differ in the details. SQLite uses flexible typing, so a column declared INTEGER can still hold text; it has no RIGHT JOIN in older versions, uses || for string concatenation, and has its own date functions such as date() and strftime(). Queries written for interviews and courses usually run unchanged, but vendor-specific features like stored procedures will not. For learning SELECT logic, joins and aggregation, the differences rarely matter.
Private by design
No query and no data leaves your browser, which makes it safe to paste a schema from work to test a query. Results are limited to the first 500 rows per table for display. The time limit and Stop button end a runaway recursive query without freezing the page.