Leer alles over SQL

De INNER JOIN

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

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. Als een tabelnaam heel lang is, kan er gekozen worden om een alias te gebruiken.

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

INNER JOIN in de praktijk

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'
		
	

De relatie tussen beide tabellen is gelegd met het veld Order.klantid dat verwijst naar Klant.id

We willen nu een query dat alle informatie ophaalt uit de tabel Persoon en Order. De gegevens worden aan elkaar gekoppeld door een INNER JOIN.

SELECT *
FROM Persoon
INNER JOIN Order
ON Persoon.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'

In de resultset is geen rij te vinden met Petra de klomp. Dit komt omdat er in de tabel Order geen record met klant id 2 voorkomt. Er is 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 Persoon.voornaam, Persoon.achternaam, Order.ordernummer
FROM Persoon
INNER JOIN Order
ON Persoon.id = Order.klantid
 voornaam, achternaam, ordernummer
'Henk', 'Janssen', 1
'Henk', 'Janssen', 5
'Sjoerd', 'Vermeulen', 3
'Mieke', 'Sterk', 2
'Mieke', 'Sterk', 4
'Mieke', 'Sterk', 6