Ga naar inhoud

Header

Data samenvoegen met LEFT JOIN

Introductie

Er zijn verschillende manieren om data samen te voegen.

We kijken naar de LEFT JOIN.

De LEFT JOIN wordt in de praktijk het meest gebruikt.

Header

Je gebruikt een LEFT JOIN als volgt:

  • Je hebt een tabel (left table).
  • Aan deze tabel wil je gegevens uit een andere tabel toevoegen (right table).
  • Met een LEFT JOIN:
    • Selecteer je alle rijen uit de linker tabel.
    • Met daarbij voor iedere rij een match met data uit de rechter tabel.

We gaan dit vanuit een voorbeeld bekijken.




1. Voorbeeld LEFT JOIN

We hebben tabellen movies en movies_genres:

Header




1.1. Tabel movies

id name year rank
10920 Aliens 1986 8.2
17173 Animal House 1978 7.5
18979 Apollo 13 1995 7.5
30959 Batman Begins 2005 (NULL)
... ... ... ...
Columns: 4
Rows: 36




1.2. Tabel movies_genres

movie_id genre
10920 Sci-Fi
10920 Action
10920 Thriller
10920 Horror
17173 Comedy
18979 Drama
... ...
Columns: 2
Rows: 103




1.3. Verwacht resultaat

  • In tabel movies hebben we data van 36 films.
  • In tabel movies_genres hebben we 103 genres van films.
  • Iedere film kan meerdere genres hebben.
    • Dit is een one-to-many relatie.

Als we voor iedere film de genres zouden opzoeken, zou dit tot onderstaand resultaat moeten leiden:

id name year rank movie_id genre
10920 Aliens 1986 8.2 10920 Sci-Fi
10920 Aliens 1986 8.2 10920 Action
10920 Aliens 1986 8.2 10920 Thriller
10920 Aliens 1986 8.2 10920 Horror
17173 Animal House 1978 7.5 17173 Comedy
... ... ... ... ... ...




1.4. LEFT JOIN toepassen

Dit resultaat krijgen we met een LEFT JOIN:

SELECT
  *
FROM
  movies
  LEFT JOIN movies_genres ON movies.id = movies_genres.movie_id;
id name year rank movie_id genre
10920 Aliens 1986 8.2 10920 Sci-Fi
10920 Aliens 1986 8.2 10920 Action
10920 Aliens 1986 8.2 10920 Thriller
10920 Aliens 1986 8.2 10920 Horror
17173 Animal House 1978 7.5 17173 Comedy
... ... ... ... ... ...
Columns: 6
Rows: 103
  • We voegen linker tabel movies samen met rechter tabel movies_genres.
    • Met LEFT JOIN.
  • Beide tabellen bevatten een kolom met het id van een film.
    • Met ON leggen we deze koppeling.
  • We selecteren alle kolommen uit het resultaat.
  • Je krijgt daarbij ook resultaten uit de linker tabel, waarvan geen match is in de rechter tabel.

De syntax voor een LEFT JOIN is als volgt:

SELECT
  *
FROM
  <left_table>
  LEFT JOIN <right_table> ON <left_table>.<column> = <right_table>.<column>;
  • De volgorde van de tabellen rondom LEFT JOIN is belangrijk.
    • Benoem eerst de linker- en daarna de rechter tabel.
    • De volgorde van specificaties in het ON statement heeft geen invloed.




2. Aliases

Met een alias geef je een kolom of tabel tijdens je query een andere naam.

  • Dit wordt vaak gebruikt bij joins.

We bekijken het volgende voorbeeld:

SELECT
  *
FROM
  movies AS m
  LEFT JOIN movies_genres AS mg ON m.id = mg.movie_id;
id name year rank movie_id genre
10920 Aliens 1986 8.2 10920 Sci-Fi
10920 Aliens 1986 8.2 10920 Action
10920 Aliens 1986 8.2 10920 Thriller
10920 Aliens 1986 8.2 10920 Horror
17173 Animal House 1978 7.5 17173 Comedy
... ... ... ... ... ...
Columns: 6
Rows: 103

Dit geeft hetzelfde resultaat als voorheen.

  • We gebruiken alias m voor tabel movies.
  • We gebruiken alias mg voor tabel movies_genres.




3. Selectie van kolommen

Tot nu toe selecteerden we alle kolommen:

id name year rank movie_id genre
10920 Aliens 1986 8.2 10920 Sci-Fi
10920 Aliens 1986 8.2 10920 Action
10920 Aliens 1986 8.2 10920 Thriller
10920 Aliens 1986 8.2 10920 Horror
17173 Animal House 1978 7.5 17173 Comedy
... ... ... ... ... ...

Je ziet dat kolommen id en movie_id dezelfde waarden bevatten.

We lossen dit op met de volgende code:

SELECT
  m.*,
  mg.genre
FROM
  movies AS m
  LEFT JOIN movies_genres AS mg ON m.id = mg.movie_id;
id name year rank genre
10920 Aliens 1986 8.2 Sci-Fi
10920 Aliens 1986 8.2 Action
10920 Aliens 1986 8.2 Thriller
10920 Aliens 1986 8.2 Horror
17173 Animal House 1978 7.5 Comedy
... ... ... ... ...
Columns: 5
Rows: 103
  • Met m.* selecteren we alle kolommen uit tabel movies.
  • Met mg.genre selecteren alleen kolom genre uit tabel movies_genres.




4. Groeperen

We hebben nu een tabel met films en hun genres.

Het zou bijvoorbeeld handig kunnen zijn om te weten:

  • Hoeveel genres heeft iedere film?

Deze vraag kunnen we beanwoorden door te groeperen, met GROUP BY.


Header


  • GROUP BY wordt later dan JOIN uitgevoerd.
  • Hierdoor zijn de aliases ook in GROUP BY te gebruiken.
SELECT
  m.name,
  COUNT(mg.genre) AS genres_count
FROM
  movies AS m
  LEFT JOIN movies_genres AS mg ON m.id = mg.movie_id
GROUP BY
  m.name
ORDER BY
  genres_count DESC;
name genres_count
Little Mermaid, The 6
Shrek 6
Vanilla Sky 5
Batman Begins 5
... ...
Columns: 2
Rows: 36

Je ziet dat we nu mooi gesorteerd het aantal genres per film zien.




Samenvatting

  • LEFT JOIN:
    • Eerste tabel (left table).
    • Tweede tabel (right table).
    • Met een LEFT JOIN:
      • Selecteer je alle rijen uit de linker tabel.
      • Met daarbij voor iedere rij een match met data uit de rechter tabel.
      • Je krijgt daarbij ook resultaten uit de linker tabel, waarvan geen match is in de rechter tabel.
  • Voorbeeld:
SELECT
  *
FROM
  movies
  LEFT JOIN movies_genres ON movies.id = movies_genres.movie_id;
  • De volgorde van het benoemen van de tabellen is belangrijk.
    • Eerst linker tabel, dan rechter tabel.
  • Je kunt aliases gebruiken voor tabelnamen.
  • Je kunt LEFT JOIN gebruiken in combinatie met andere SQL statements.
    • Zoals GROUP BY en ORDER BY.