
Subqueries met IN, ANY en ALL
Introductie
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.
1. EXISTS
In de vorige module is een subquery met EXISTS behandeld.
We blikken hier even op terug.
We maakten de volgende query:
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 |
Deze query geeft alleen films met genre Horror.
2. IN met subquery
Met het IN statement en een subquery doen we het volgende:
- Filtering op enige voorkomendheid (in een lijst).
We gebruiken dit om hetzelfde resultaat als zojuist te verkrijgen:
- Alleen films met genre
Horror.
SELECT
*
FROM
movies
WHERE
movies.id IN (
SELECT
movie_id
FROM
movies_genres
WHERE
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 eerder met:
- Subquery met
EXISTS.
We doen daarbij nu het volgende:
- De subquery haalt een lijst op van
movie_id's diegenre'Horror'hebben. - Met
INfilteren we alleen deids uit deze lijst.
3. ANY met subquery
Met het ANY statement en een subquery doen we het volgende:
- Filtering op enige voorkomendheid.
We gebruiken dit om hetzelfde resultaat als zojuist te verkrijgen:
- Alleen films met genre
Horror.
SELECT
*
FROM
movies
WHERE
movies.id = ANY (
SELECT
movie_id
FROM
movies_genres
WHERE
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 eerder met:
- Subquery met
EXISTS. - Subquery met
IN.
We doen daarbij nu het volgende:
- De subquery haalt een lijst op van
movie_id's diegenre'Horror'hebben. - Met
ANYfilteren we alleen deid'suit deze lijst.
4. ALL met subquery
Met het ALL statement en een subquery doen we het volgende:
- Filtering op elke voorkomendheid.
We gebruiken dit voor een nieuwe voorbeeld:
- Alleen de film die als enige genre
Warheeft.
SELECT
*
FROM
movies
WHERE
movies.id = ALL (
SELECT
movie_id
FROM
movies_genres
WHERE
genre = 'War'
);
| id | name | year | rank |
|---|---|---|---|
| 46169 | Braveheart | 1995 | 8.3 |
De film Braveheart is dus de enige film met genre 'War'.
We doen daarbij nu het volgende:
- De subquery haalt een lijst op van
movie_id's diegenre'War'hebben.- Dit is maar één
id.
- Dit is maar één
- Met
ALLfilteren we deid'suit deze lijst.- Op elke/volledige overeenkomt met de lijst.
Het gebruik van
ALLkomt mogelijk wat abstract/onhandig op je over. Dit zul je in de praktijk niet vaak gebruiken.
Samenvatting
IN- Filtering op enige voorkomendheid (in een lijst).
ANY- Filtering op enige voorkomendheid.
ALL- Filtering op elke voorkomendheid.