runtime
28 / 88

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 returns one value, such as an overall average, that the outer WHERE can compare with. A correlated subquery refers to the outer row, so it is evaluated for each row, such as the average of that product’s own category.

Dataset: Retail

The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.

products6 columns · 5,304 rows
stock_codetext · unique iddescriptiontextcategory_idnumber · links to categorieslist_pricedecimalfirst_sold_atdate & timeis_merchandisenumber
10002INFLATABLE POLITICAL GLOBE170.852009-12-01 09:08:001
10002RROBOT PENCIL SHARPNER85.172009-12-02 14:43:001
10080GROOVY CACTUS INFLATABLE170.392009-12-02 16:02:001
10109BENDY COLOUR PENCILS80.422009-12-03 12:31:001
10120DOGGY RUBBER170.212009-12-01 16:17:001
10123CHEARTS WRAPPING TAPE80.652009-12-01 14:28:001
stock_codetext · unique id
10002
descriptiontext
INFLATABLE POLITICAL GLOBE
category_idnumber · links to categories
17
list_pricedecimal
0.85
first_sold_atdate & time
2009-12-01 09:08:00
is_merchandisenumber
1
stock_codetext · unique id
10002R
descriptiontext
ROBOT PENCIL SHARPNER
category_idnumber · links to categories
8
list_pricedecimal
5.17
first_sold_atdate & time
2009-12-02 14:43:00
is_merchandisenumber
1
stock_codetext · unique id
10080
descriptiontext
GROOVY CACTUS INFLATABLE
category_idnumber · links to categories
17
list_pricedecimal
0.39
first_sold_atdate & time
2009-12-02 16:02:00
is_merchandisenumber
1
stock_codetext · unique id
10109
descriptiontext
BENDY COLOUR PENCILS
category_idnumber · links to categories
8
list_pricedecimal
0.42
first_sold_atdate & time
2009-12-03 12:31:00
is_merchandisenumber
1
stock_codetext · unique id
10120
descriptiontext
DOGGY RUBBER
category_idnumber · links to categories
17
list_pricedecimal
0.21
first_sold_atdate & time
2009-12-01 16:17:00
is_merchandisenumber
1
stock_codetext · unique id
10123C
descriptiontext
HEARTS WRAPPING TAPE
category_idnumber · links to categories
8
list_pricedecimal
0.65
first_sold_atdate & time
2009-12-01 14:28:00
is_merchandisenumber
1

first 6 of 5,304 rows · your queries use all of them

worked example

Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.

  1. Compute one benchmark value. Run this. The subquery returns a single average price for all merchandise.

    step-1.sql
    SELECT ROUND(AVG(list_price), 2) AS avg_price
    FROM products
    WHERE is_merchandise = 1 AND list_price IS NOT NULL;
  2. Find rows that match an extreme. Run this. WHERE list_price equals the scalar subquery’s MAX picks the most expensive merchandise item.

    step-2.sql
    SELECT stock_code, description, list_price
    FROM products
    WHERE list_price = (
      SELECT MAX(list_price)
      FROM products
      WHERE is_merchandise = 1
    );
  3. Put it together. The lesson's pattern in one query.the pattern

    example.sql
    SELECT stock_code, list_price
    FROM products
    WHERE list_price = (
      SELECT MAX(list_price)
      FROM products
      WHERE is_merchandise = 1
    );

common mistake

Comparing with the overall average answers a different question from comparing with the product’s own category average.

challenge 1

Return stock_code, description and list_price for merchandise products priced above the average list price of all merchandise products.

what to return

Columns
stock_codedescriptionlist_price in this order
Rows
any order
challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.
Subqueries — Dates, strings & subqueries · Runtime