lesson 28 Dates, strings & subqueries · intermediate
Subqueries
Use the result of one query inside another.
the idea
A subquery is a query inside another query. A scalar subquery produces one value, which can be used in a comparison. Parentheses separate the inner query.
tables in this lesson
The challenges use this data. Each column shows its type underneath; → marks a link to another table.
products4 columns · 6 rows
| idinteger · key | nametext | categorytext | pricereal |
|---|---|---|---|
| 1 | Notebook | Stationery | 12 |
| 2 | Desk lamp | Home | 45 |
| 3 | Keyboard | Tech | 80 |
| 4 | Pen set | Stationery | 8 |
| 5 | Headphones | Tech | 120 |
showing 5 of 6 rows
orders6 columns · 12 rows
| idinteger · key | customer_idinteger | product_idinteger | quantityinteger | statustext | ordered_attext |
|---|---|---|---|---|---|
| 101 | 1 | 1 | 2 | paid | 2025-01-01 |
| 102 | 2 | 3 | 1 | paid | 2025-01-02 |
| 103 | 1 | 2 | 1 | paid | 2025-01-05 |
| 104 | 3 | 5 | 2 | pending | 2025-01-08 |
| 105 | 4 | 4 | 5 | paid | 2025-02-01 |
showing 5 of 12 rows
example
The idea in one query. Press Run to see what it returns; running examples never affects your progress.
SELECT name, price FROM products WHERE price > ( SELECT AVG(price) FROM products );
Watch for: The inner average summarizes the entire table; it is not a per-row calculation.
build it step by step
Each step changes one thing. Run them in order and watch the result change.
Compute the comparison value. A subquery can produce the average price once. The outer query will compare each product to that single number.
step-1.sqlSELECT AVG(price) AS avg_price FROM products;
Filter rows against the subquery. The parenthesized SELECT runs as a scalar subquery. Rows with price above that average remain.
step-2.sqlSELECT name, price FROM products WHERE price > ( SELECT AVG(price) FROM products );