
Subqueries
Introductie
Een subquery is een query die in een andere query wordt uitgevoerd.
Waarom dit handig is, bekijken we vanuit een voorbeeld.
Voorbeeld

In dit voorbeeld willen we het volgende:
- Een selectie van films uit tabel
movies. - Alleen de films met genre
Horror.
Mogelijke oplossing
Dit zouden we als volgt op kunnen lossen:
- Tabellen
moviesenmovies_genressamenvoegen met eenLEFT JOIN. - Filteren op genre
Horror. - Alleen kolommen uit tabel
moviesselecteren.
SELECT
movies.*
FROM
movies
LEFT JOIN movies_genres ON movies_genres.movie_id = movies.id
WHERE
genre = 'Horror';
| id | name | year | rank |
|---|---|---|---|
| 10920 | Aliens | 1986 | 8.2 |
| 147603 | Hollow Man | 2000 | 5.3 |
| 314965 | Stir of Echoes | 1999 | 7 |
Belemmeringen
We tonen hier echter geen data uit tabel movies_genres.
- Hierdoor is het minder netjes om een
JOINte gebruiken. - Je hebt de gekoppelde data immers niet nodig.
- Netter is het om een subquery te gebruiken.
We gaan verschillende soorten subqueries bekijken.
1. Toepassing van EXISTS met subquery
In het voorbeeld wilden we alleen films met genre Horror.
Met een subquery en het EXISTS statement kunnen we dit vraagstuk oplossen.
- Zonder dat een
JOINnodig is.
Onderstaande query doet dit:
SELECT
*
FROM
movies
WHERE
EXISTS (
SELECT
*
FROM
movies_genres
WHERE
movies.id = movies_genres.movie_id
AND genre = 'Horror'
);
| id | name | year | rank |
|---|---|---|---|
| 10920 | Aliens | 1986 | 8.2 |
| 147603 | Hollow Man | 2000 | 5.3 |
| 314965 | Stir of Echoes | 1999 | 7 |
We zien hetzelfde resultaat als toen we de LEFT JOIN en filtering gebruikten.
2. Uitleg van subquery met EXISTS
Een subquery met EXISTS werkt als volgt:
SELECT
<column_name(s)>
FROM
<table_name_1>
WHERE
EXISTS (
SELECT
<column_name(s)>
FROM
<table_name_2>
WHERE
<condition(s)>
);
- Je haalt informatie op uit een tabel.
- In ons geval tabel
movies.
- In ons geval tabel
- Alleen daar waar (
WHERE) een match is, metEXISTSen een subquery.- In ons geval:
- Tabel
movies_genres. - Bij
genre = 'Horror'. - En de match
movies.id = movies_genres.movie_id.
- Tabel
- In ons geval:
Hierdoor pas je filtering toe op tabel movies.
- Gebaseerd op een verband met tabel
movies_genres.
De performance is vergelijkbaar. Het maakt hier qua rekenkracht/tijd nauwelijks uit of je de query met
LEFT JOINofEXISTSgebruikt.
3. Andere subqueries dan met EXISTS
Met een subquery met EXISTS filter je op de voorkomendheid van een bepaalde match.
Hiernaast zijn er ook andere mogelijkheden:
IN- Filtering op enige voorkomendheid (in een lijst).
ANY- Filtering op enige voorkomendheid.
ALL- Filtering op elke voorkomendheid.
Samenvatting
- Een subquery is een query die in een andere query wordt uitgevoerd.
- Dit kan bijvoorbeeld met
EXISTS- Daarmee filter je op de voorkomendheid van een bepaalde match.
- Voorbeeld:
SELECT
*
FROM
movies
WHERE
EXISTS (
SELECT
*
FROM
movies_genres
WHERE
movies.id = movies_genres.movie_id
AND genre = 'Horror'
);
- Andere opties, naast
EXISTS:INANYALL