Ga naar inhoud

Header

Subqueries

Introductie

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

Waarom dit handig is, bekijken we vanuit een voorbeeld.




Voorbeeld

Header


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 movies en movies_genres samenvoegen met een LEFT JOIN.
  • Filteren op genre Horror.
  • Alleen kolommen uit tabel movies selecteren.
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
Columns: 4
Rows: 3




Belemmeringen

We tonen hier echter geen data uit tabel movies_genres.

  • Hierdoor is het minder netjes om een JOIN te 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 JOIN nodig 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
Columns: 4
Rows: 3

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.
  • Alleen daar waar (WHERE) een match is, met EXISTS en een subquery.
    • In ons geval:
      • Tabel movies_genres.
      • Bij genre = 'Horror'.
      • En de match movies.id = movies_genres.movie_id.


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 JOIN of EXISTS gebruikt.




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:
    • IN
    • ANY
    • ALL