Ga naar inhoud

Header

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
Columns: 4
Rows: 3

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
Columns: 4
Rows: 3

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 die genre 'Horror' hebben.
  • Met IN filteren we alleen de ids 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
Columns: 4
Rows: 3

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 die genre 'Horror' hebben.
  • Met ANY filteren we alleen de id's uit 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 War heeft.
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
Columns: 4
Rows: 1

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 die genre 'War' hebben.
    • Dit is maar één id.
  • Met ALL filteren we de id's uit deze lijst.
    • Op elke/volledige overeenkomt met de lijst.

Het gebruik van ALL komt 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.