Home » De INNER JOIN: combineer records uit meerdere SQL tabellen

De INNER JOIN: combineer records uit meerdere SQL tabellen

De INNER JOIN maakt het mogelijk om in SQL de records uit meerdere tabellen met één query op te halen. Door middel van relaties worden deze records aan elkaar gekoppeld.

We gebruiken database tabellen om gegevens in op te slaan. Als het ontwerp goed is gedaan, dan bevat elke tabel afgebakende gegevens. Laten we zeggen dat we een tabel hebben voor producten, een voor bestellingen en een voor bijvoorbeeld klanten.

Nu kunnen we de gegevens uit de bestelling tabel halen en vervolgens zoeken we daar de klant bij en daarvoor voeren we een aparte query uit. Dit werkt op zich prima. Maar we kunnen in SQL ook beiden queries combineren door middel van een INNER JOIN.

De INNER JOIN in SQL

Met de INNER JOIN combineer je records uit twee of meerdere tabellen op basis van een gemeenschappelijk kenmerk. Dit kan elk mogelijk kenmerk zijn, bijvoorbeeld een postcodeveld, naam of geslacht. Over het algemeen is het in SQL eenvoudiger om de gegevens in een INNER JOIN te combineren door middel van een relaties. Zo’n relatie wordt vaak gelegd op basis van een primaire sleutel.

We nemen voor het gemak even de situatie van twee tabellen. Hierbij is een relatie gelegd op basis van de primaire sleutel. Denk hierbij aan een tabel orders waarbij de kolom klantId verwijst naar de primaire sleutel van tabel klant in ons geval id.

SELECT Tabelnaam1.kolomnaam, Tabelnaam2.kolomnaam
FROM Tabelnaam1
INNER JOIN Tabelnaam2
ON Tabelnaam1.kolomnaam = Tabelnaam2.kolomnaam

Het prefixen van tabellen in queries

Soms worden er in de verschillende tabellen dezelfde kolomnamen gebruikt. Hierdoor weet SQL niet altijd welke kolom er precies gebruikt moet worden. Dit is op te lossen door de aanroep van kolomnamen te prefixen. Zo’n prefix ziet er als volgt uit: Tabelnaam.kolomnaam. Ook als een tabelnaam heel lang is, kan er gekozen worden om een alias te gebruiken.

Bij het gebruik van een INNER JOIN kan in de SQL-query de alias helpen om de aangesproken kolommen beter te duiden. Zo zie je namelijk meteen uit welke tabel deze komt.

In het onderstaande voorbeeld zijn zowel de tabellen als de opgehaalde kolommen voorzien van een alias. Bij de SELECT is dit gegaan omdat beide kolomnamen dezelfde naam hebben. Deze een zal de ander dus overschrijven, maar het is waarschijnlijk dat SQL een foutmelding geeft.

SELECT t1.kolomnaam as t1_kolomnaam, t2.kolomnaam as t2_kolomnaam
FROM Tabelnaam1 as t1
INNER JOIN Tabelnaam2 as t2
ON t1.kolomnaam = t2.kolomnaam

INNER JOIN in de praktijk

We gaan voor dit voorbeeld uit van een tabel Order waarbij klantid verwijst naar id uit de tabel Klant. Op basis hiervan maken we een SQL-query met daarin een INNER JOIN. De relatie tussen beide tabellen is gelegd met het veld Order.klantid dat verwijst naar Klant.id.

De volgende dataset is de inhoud van de tabel Order.

ordernummer, klantid, orderbedrag
1, 1, '23.20'
2, 4, '2.30'
3, 3, '12.93'
4, 4, '54.92'
5, 1, '6.12'
6, 4, '9.60'
7, 5, '15.56'

De volgende dataset is de inhoud van de tabel Klant.

id, voornaam, achternaam, woonplaats
1, 'Henk', 'Janssen', 'Amsterdam'
2, 'Petra', 'de klomp', 'Nijmegen'
3, 'Sjoerd', 'Vermeulen', 'Maastricht'
4, 'Mieke', 'Sterk', 'Amsterdam'
		

Op basis van beide database tabellen willen we een lijst weergeven met daarin alle bestellingen en de bijbehorende klantgegevens. We weten dat er per bestelling slechts één klant kan zijn. We gaan hierbij de gegevens aan elkaar koppelen door middel van een INNER JOIN in de SQL-query:

SELECT *
FROM Order
INNER JOIN Klant
ON Klant.id = Order.klantid
id, voornaam, achternaam, woonplaats, ordernummer, klantid, orderbedrag
1, 'Henk', 'Janssen', 'Amsterdam', 1, 1, '23.20'
1, 'Henk', 'Janssen', 'Amsterdam', 5, 1, '6.12'
3, 'Sjoerd', 'Vermeulen', 'Maastricht', 3, 3, '12.93'
4, 'Mieke', 'Sterk', 'Amsterdam', 2, 4, '2.30'
4, 'Mieke', 'Sterk', 'Amsterdam', 4, 4, '54.92'
4, 'Mieke', 'Sterk', 'Amsterdam', 6, 4, '9.60'

Zoals je ziet is er in het resultaat geen rij terug te vinden van Petra de Klomp. Dit komt omdat er in de tabel Order geen record met klant id 2 voorkomt. Er is dus hiervoor dus geen verband te leggen tussen een eventuele order en Petra de klomp en daardoor wordt ze niet getoond.

We hebben nu alle records opgehaald, omdat we SELECT * hebben uitgevoerd. We kunnen uiteraard ook alleen de kolommen ophalen die we zelf zouden willen. Bijvoorbeeld de voornaam, achternaam en het ordernummer.

SELECT Klant.voornaam, Klant.achternaam, Klant.ordernummer
FROM Order
INNER JOIN Klant
ON Klant.id = Order.klantid
voornaam, achternaam, ordernummer
'Henk', 'Janssen', 1
'Henk', 'Janssen', 5
'Sjoerd', 'Vermeulen', 3
'Mieke', 'Sterk', 2
'Mieke', 'Sterk', 4
'Mieke', 'Sterk', 6