
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.

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) enLENGTH(). - Om de gemiddelde lengte van namen van filmrollen te berekenen.
| round |
|---|
| 14 |
De gemiddelde lengte bedraagt 14 tekens.
1.3. Filteren op lengte van filmnamen
Tabel movies bevat details van films.
- We gebruiken een
WHEREstatement. - 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 |
- 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
14te 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 |
- 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
WHEREstatement.
- Omdat dit alleen beschikbaar is in het
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 |
- We zien dat de gemiddelde lengte nu als kolom is toegevoegd.
- Dit door een subquery vanuit het
FROMstatement.
Samenvatting
- Je kunt een query binnen een andere query uitvoeren.
- Dit heet een subquery.
- Dit kan op allerlei plaatsen, bijvoorbeeld in:
WHEREstatement: bij een selectie gebaseerd op een query.FROMstatement: om de uitkomst van een query bijvoorbeeld ook te kunnen tonen in het eindresultaat.SELECTstatement: om bijvoorbeeld een uitkomstwaarde uit een query in een nieuwe kolom te tonen.