Introductie in tabellen combineren met SQL
Om meerdere redenen kan het handig zijn om data uit verschillende tabellen uit een relationele database te combineren met SQL. Zo kun je data samenvoegen in één tabel. Dit kun je doen met SQL LEFT JOIN, maar voordat we op dit specifieke statement ingaan is het belangrijk om even de verschillende mogelijkheden voor het combineren van tabellen te bekijken.
Mogelijkheden combineren van tabellen in SQL
Onderstaand overzicht geeft weer welke verschillende manieren er zijn om data uit tabellen te combineren met SQL. Daarnaast geeft het overzicht weer welke statements hiervoor binnen SQL beschikbaar zijn.
In dit blog gaan we in op SQL LEFT JOIN. We hebben ook blogs over de andere statements:
- SQL RIGHT JOIN
- SQL INNER JOIN
- SQL FULL JOIN
- SQL UNION
In deze blog gaan we in op het SQL LEFT JOIN statement
De volgende onderwerpen komen aan bod:
- Wat is SQL LEFT JOIN?
- SQL LEFT JOIN voorbeeld
- SQL LEFT JOIN & aliassen
- SQL LEFT JOIN met enkele kolommen
- SQL LEFT JOIN & groeperen
Wat is SQL LEFT JOIN?
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.
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.
Voorbeeld SQL LEFT JOIN
We hebben tabellen movies
en movies_genres
:
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
Deze tabel bevat films.
Tabel movies_genres
movie_id | genre |
---|---|
10920 | Sci-Fi |
10920 | Action |
10920 | Thriller |
10920 | Horror |
17173 | Comedy |
18979 | Drama |
... | ... |
Columns: 2
Rows: 103
Deze tabel bevat genres voor films.
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 |
... | ... | ... | ... | ... | ... |
SQL LEFT JOIN toepassen
Dit resultaat krijgen we met een SQL LEFT JOIN
:
SELECT
*
FROM
movies
LEFT JOIN movies_genres ON movies_genres.movie_id = movies.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 tabelmovies_genres
metLEFT JOIN
. - Beide tabellen bevatten een kolom met het
id
van een film. MetON
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 is belangrijk. Benoem eerst de linker- en daarna de rechter tabel.
SQL LEFT JOIN & aliassen
Met een alias geef je een kolom of tabel tijdens je query een andere naam. Dit wordt vaak gebruikt bij joins. Zo houd je je code kort en overzichtelijk.
We bekijken het volgende voorbeeld:
SELECT
*
FROM
movies AS m
LEFT JOIN movies_genres AS mg ON mg.movie_id = m.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 tabelmovies
. - We gebruiken alias
mg
voor tabelmovies_genres
.
SQL LEFT JOIN met enkele 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 mg.movie_id = m.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 tabelmovies
. - Met
mg.genre
selecteren alleen kolomgenre
uit tabelmovies_genres
.
SQL LEFT JOIN & groeperen
We hebben nu een tabel met films en hun genres.
Het zou bijvoorbeeld handig kunnen zijn om te weten hoeveel genres iedere film heeft?
Deze vraag kunnen we beanwoorden door te groeperen, met GROUP BY
.
GROUP BY
wordt later dan JOIN
uitgevoerd. Hierdoor zijn de aliases ook in GROUP BY
te gebruiken.
Lees alles over SQL uitvoervolgordes in dit blog
SELECT
m.name,
COUNT(mg.genre) AS genres_count
FROM
movies AS m
LEFT JOIN movies_genres AS mg ON mg.movie_id = m.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_genres.movie_id = movies.id;
- De volgorde van het benoemen van de tabellen is belangrijk.
- Eeerst 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
enORDER BY
.
- Zoals
Bezig om SQL onder de knie te krijgen?
Wellicht ben je bezig om SQL beter te leren. Wij schreven de volgende handige artikelen om je op weg te helpen:
- Waarom SQL leren een goed idee is
- Voorbeelden van wat je met SQL kunt
- Hoe leer ik SQL in 4 stappen
- PostgreSQL & PgAdmin installeren om op jouw computer met SQL te kunnen werken
Wil je nog veel meer leren over SQL? Bekijk dan onze SQL cursus voor data analyse of download onderstaande opleidingsbrochure. In onze SQL cursus wisselen theorie en praktijkoefening elkaar steeds af. Nadat je deze training hebt gevolgd kun je zelfstandig met SQL werken. Je kunt ook altijd even contact opnemen via info@datasciencepartners.nl of 020 - 24 43 146 als je een vraag hebt.
Peter is een ervaren data scientist en python trainer. Na zijn studie aan de Technische Universiteit Delft heeft hij zich altijd bezig gehouden met data en diverse programmeertalen. Peter heeft veel data analyses uitgevoerd en processen geautomatiseerd met Python in productieomgevingen.