Step 1 of 4 in Analytics Engineer
Learn the SQL you need for analytics — SELECT to JOINs — using DuckDB, the in-process analytics database.
Everything in this course is free to read — no account needed. Sign in to track your progress and earn the certificate.
Analysts, engineers, and anyone data-adjacent who wants to stop copy-pasting SQL and start writing it. If spreadsheets are getting too small for your questions, you're in the right place.
No SQL experience needed — we start from the first SELECT. You should be comfortable in a browser and curious about data; everything else is provided, nothing to install.
SQL is the working language of analytics, and DuckDB is the fastest way to practice it for real: a full analytics database that runs right here in your browser. This course takes you from your first SELECT to confident JOINs and aggregations — every concept lands in a runnable lab against real data, checked as you go.
This is a real lab from lesson 5, “Lab: Filtering practice” — press Run.
Run the starter query first — 12 orders. Now narrow it down to the big ones: orders over €200.
Add a WHERE clause to the starter query.
Keep only rows where amount is greater than 200.
WHERE filters rows before SELECT picks columns.
CREATE OR REPLACE TABLE orders (
order_id INTEGER, country VARCHAR, status VARCHAR, amount DOUBLE
);
INSERT INTO orders VALUES
(1, 'FR', 'shipped', 120.0),
(2, 'DE', 'shipped', 80.5),
(3, 'FR', 'pending', 250.0),
(4, 'NL', 'shipped', 310.75),
(5, 'DE', 'shipped', 145.0),
(6, 'FR', 'shipped', 99.99),
(7, 'NL', 'cancelled', 180.0),
(8, 'DE', 'shipped', 220.1),
(9, 'FR', 'shipped', 175.25),
(10, 'NL', 'shipped', 65.0),
(11, 'DE', 'pending', 400.0),
(12, 'FR', 'shipped', 130.4);
SELECT * FROM orders;
The clause goes after FROM: SELECT … FROM orders WHERE <condition>.
Hint 2 unlocks once you sign in and check your work