Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
SQL / POSTGRESQL / Learn / LESSON 08
A CTE (Common Table Expression) is written WITH name AS (SELECT ...) followed by a main query that uses the name. It gives the same result as a subquery in FROM, but steps read top to bottom, like named intermediate results.
Important: a CTE is for structure and readability, not an automatic speedup. PostgreSQL decides how to execute the query; do not expect a CTE to make anything faster. These lessons use only plain (non-recursive) CTEs and read-only queries.
Use descriptive names (customer_totals, big_orders) and select only the columns you need.
Common mistakes: a comma before the main SELECT; omitting AS; trying to reuse a CTE in a later separate query (it lives for one statement); expecting a speedup.
Small example:
WITH big_orders AS (SELECT id, total FROM orders WHERE total >= 100) SELECT COUNT(*) AS big_count FROM big_orders;
Working tables for this task. Grading also uses other datasets with the same schema.
| id | name | category | price |
|---|---|---|---|
| 1 | Atlas | books | 30 |
| 2 | Novel | books | 15 |
| 3 | Comic | books | 14.99 |
| 4 | Lamp | home | 29.99 |
| 5 | Vase | home | 30 |
| 6 | Rug | home | 45 |
| 7 | Hammer | tools | 15 |
| 8 | Drill | tools | 60 |
| 9 | Tape | tools | 15 |
| 10 | Candle | NULL | 8.5 |
| 11 | Gift Card | NULL | 25 |
| id | name | city |
|---|---|---|
| 1 | Mira | Sofia |
| 2 | Niko | Varna |
| 3 | Iva | Sofia |
| 4 | Alex | NULL |
| 5 | Boris | Plovdiv |
| 6 | Lena | Varna |
| 7 | Petya | Sofia |
| id | customer_id | total | order_date |
|---|---|---|---|
| 1 | 1 | 120 | 2024-01-05 |
| 2 | 1 | 35.5 | 2024-01-20 |
| 3 | 2 | 40 | 2024-01-20 |
| 4 | 3 | 99.99 | 2024-01-31 |
| 5 | NULL | 60 | 2024-02-01 |
| 6 | 1 | 40 | 2024-02-01 |
| 7 | 2 | 75.25 | 2024-02-14 |
| 8 | 3 | 100 | 2024-02-15 |
| 9 | 5 | 22 | 2024-02-15 |
| 10 | 1 | 39.99 | 2024-02-29 |
| 11 | 2 | 55 | 2024-03-01 |
| 12 | 3 | 18 | 2024-03-10 |
| 13 | 1 | 130 | 2024-03-15 |
| 14 | 2 | 40 | 2024-03-15 |
| 15 | 2 | 12.5 | 2024-03-31 |
| 16 | 3 | 47 | 2024-04-01 |
Expected columns: name, spent · row order is not required
Expected result (displayed data):
Loading…A CTE (Common Table Expression) is written WITH name AS (SELECT ...) followed by a main query that uses the name. It gives the same result as a subquery in FROM, but steps read top to bottom, like named intermediate results. Important: a CTE is for structure and readability, not an automatic speedup. PostgreSQL decides how to execute the query; do not expect a CTE to make anything faster. These lessons use only plain (non-recursive) CTEs and read-only queries. Use descriptive names (customer_totals, big_orders) and select only the columns you need. Common mistakes: a comma before the main SELECT; omitting AS; trying to reuse a CTE in a later separate query (it lives for one statement); expecting a speedup.
QUERY STANDBY
›