Ga naar inhoud

Header

Subqueries introductie

Introductie

Een subquery is een query die in een andere query wordt uitgevoerd.

Waarom dit handig is, bekijken we vanuit enkele voorbeelden.




1. Subquery in WHERE statement

We gaan een voorbeeld bekijken vanuit tabellen movies en roles.

Header




1.1. Vraagstelling

In dit voorbeeld willen we het volgende:

  • Een selectie van films uit tabel movies.
  • Daar waar de lengte van de naam van een film, groter is dan de gemiddelde lengte van de namen van filmrollen.




1.2. Gemiddelde lengte van de namen van filmrollen

Tabel roles bevat details van filmrollen.

  • We gebruiken functies ROUND() (afronden), AVG() (gemiddelde) en LENGTH().
  • Om de gemiddelde lengte van namen van filmrollen te berekenen.
SELECT
  ROUND(AVG(LENGTH(role)))
FROM
  roles;
round
14

De gemiddelde lengte bedraagt 14 tekens.




1.3. Filteren op lengte van filmnamen

Tabel movies bevat details van films.

  • We gebruiken een WHERE statement.
  • Om een selectie te maken op de lengte van filmnamen.
    • Daar waar de naam groter is dan 14 tekens.
SELECT
  id,
  name,
  LENGTH(name) AS name_length
FROM
  movies
WHERE
  LENGTH(name) > 14
ORDER BY
  name_length;
id name name_length
111813 Few Good Men, A 15
238072 Ocean”s Eleven 16
176711 Kill Bill: Vol. 1 17
176712 Kill Bill: Vol. 2 17
192017 Little Mermaid, The 19
194874 Lost in Translation 19
256630 Pirates of the Caribbean 24
297838 Shawshank Redemption, The 25
237431 O Brother, Where Art Thou? 26
257264 Planes, Trains & Automobiles 28
Columns: 3
Rows: 10
  • We zien dat alleen films met een naam met meer dan 14 tekens zijn geslecteerd.




1.4. Probleem

In plaats van getal 14 hardcoded te benoemen, zou het mooi zijn om dit met een query te verkrijgen.

Dit kan echter niet zomaar.

Hier hebben we een subquery voor nodig.




1.5. Oplossing met subquery in WHERE statement

We gebruikten de volgende query:

SELECT
  id,
  name,
  LENGTH(name) AS name_length
FROM
  movies
WHERE
  LENGTH(name) > 14
ORDER BY
  name_length;

Met hierin getal 14 hardcoded.

In onderstaande query vervangen we getal 14 door een andere query.

  • De query die we eerder gebruikten om het getal 14 te berekenen.
SELECT
  id,
  name,
  LENGTH(name) AS name_length
FROM
  movies
WHERE
  LENGTH(name) > (
    SELECT
      ROUND(AVG(LENGTH(role)))
    FROM
      roles
  )
ORDER BY
  name_length;
id name name_length
111813 Few Good Men, A 15
238072 Ocean”s Eleven 16
176711 Kill Bill: Vol. 1 17
176712 Kill Bill: Vol. 2 17
192017 Little Mermaid, The 19
194874 Lost in Translation 19
256630 Pirates of the Caribbean 24
297838 Shawshank Redemption, The 25
237431 O Brother, Where Art Thou? 26
257264 Planes, Trains & Automobiles 28
Columns: 3
Rows: 10
  • We zien hetzelfde resultaat als eerder.
  • Je ziet hier mee dat we een query binnen een query uit kunnen voeren.
    • Dit heet een subquery.




2. Subquery in FROM statement

Zojuist hebben we een subquery vanuit het WHERE statement bekeken.

Hiermee konden we de uitkomst van een subquery gebruiken in een filtering.




2.1. Vraagstelling en probleem

We hebben de lengte van een filmnaam vergeleken met de gemiddele lengte van filmrolnamen.

  • Nu willen we die gemiddelde lengte toevoegen als kolom.
  • Dit kan echter niet zomaar.
    • Omdat dit alleen beschikbaar is in het WHERE statement.




2.2. Oplossing met subquery in FROM statement

We gebruikten de volgende query:

SELECT
  m.id,
  m.name,
  LENGTH(m.name) AS name_length,
  r.*
FROM
  movies AS m,
  (
    SELECT
      ROUND(AVG(LENGTH(role))) AS role_avg_length
    FROM
      roles
  ) AS r
WHERE
  LENGTH(m.name) > r.role_avg_length;
id name name_length role_avg_length
111813 Few Good Men, A 15 14
176711 Kill Bill: Vol. 1 17 14
176712 Kill Bill: Vol. 2 17 14
192017 Little Mermaid, The 19 14
194874 Lost in Translation 19 14
237431 O Brother, Where Art Thou? 26 14
238072 Ocean”s Eleven 16 14
256630 Pirates of the Caribbean 24 14
257264 Planes, Trains & Automobiles 28 14
297838 Shawshank Redemption, The 25 14
Columns: 3
Rows: 10
  • We zien dat de gemiddelde lengte nu als kolom is toegevoegd.
  • Dit door een subquery vanuit het FROM statement.




Samenvatting

  • Je kunt een query binnen een andere query uitvoeren.
    • Dit heet een subquery.
  • Dit kan op allerlei plaatsen, bijvoorbeeld in:
    • WHERE statement: bij een selectie gebaseerd op een query.
    • FROM statement: om de uitkomst van een query bijvoorbeeld ook te kunnen tonen in het eindresultaat.
    • SELECT statement: om bijvoorbeeld een uitkomstwaarde uit een query in een nieuwe kolom te tonen.