Tot nu toe gingen alle queries over data in een enkele tabel. In de praktijk staan gegevens vaak verspreid over meerdere tabellen. Met een JOIN combineer je gegevens uit verschillende tabellen.
Stel je hebt twee tabellen: students (met een kolom klas_id) en classes (met een kolom id). Een student zit in een klas als students.klas_id gelijk is aan classes.id.
De CROSS JOIN plakt iedere rij uit tabel B achter iedere rij uit tabel A. Dit geeft alle mogelijke combinaties.
SELECT *
FROM students
JOIN classes
Als je 10 studenten en 3 klassen hebt, krijg je 30 rijen: iedere student wordt gekoppeld aan iedere klas, ook als de student niet in die klas zit. Niet zo nuttig op zichzelf, maar het is de basis voor de INNER JOIN.
Je hebt een tabel met 8 producten en een tabel met 5 categorieën. Je voert een CROSS JOIN uit. Hoeveel rijen krijg je terug?
De INNER JOIN is de CROSS JOIN met een regel erbij. Met ON geef je aan welke kolommen moeten overeenkomen.
SELECT *
FROM students
JOIN classes
ON students.klas_id = classes.id
Nu worden studenten alleen gekoppeld aan de klas waar ze daadwerkelijk in zitten. Rijen zonder match (een student zonder klas, of een klas zonder studenten) worden niet getoond.
Belangrijk: Het verschil tussen CROSS JOIN en INNER JOIN is de ON-clause. In MariaDB schrijf je in beide gevallen JOIN.
De boer wil bij elk dier de gegevens van de eigenaar zien. Koppel de tabel animals aan owners. De koppeling loopt via animals.owner_id en owners.id.
Toon een lijst met de naam van elk dier naast de naam van zijn eigenaar. Tabellen: animals en owners, koppeling: animals.owner_id = owners.id.
De schooladministratie wil een lijst van alle studenten met hun klasnaam. Tabellen: students (kolom klas_id) en classes (kolom id). Toon de voornaam en de klasnaam (kolom klas).
De INNER JOIN toont alleen rijen die in beide tabellen een match hebben. Maar soms wil je ook rijen zien die geen match hebben:
-- Alle studenten, ook degenen zonder klas
SELECT *
FROM students
LEFT JOIN classes
ON students.klas_id = classes.id
-- Alle klassen, ook lege klassen
SELECT *
FROM students
RIGHT JOIN classes
ON students.klas_id = classes.id
De boer vermoedt dat sommige dieren geen eigenaar meer hebben in het systeem. Toon alle dieren, ook de dieren zonder eigenaar. Tabellen: animals en owners, koppeling: animals.owner_id = owners.id.
De boer wil weten of er eigenaren zijn die geen enkel dier meer hebben. Toon alle eigenaren, ook degenen zonder dieren. Tabellen: animals en owners, koppeling: animals.owner_id = owners.id.
Je hebt 10 studenten, waarvan 1 geen klas heeft. Je hebt 4 klassen, waarvan 1 leeg is. Hoeveel rijen geeft een LEFT JOIN (students LEFT JOIN classes) terug?
Bij een SELF JOIN koppel je een tabel aan zichzelf. Dit is handig wanneer rijen in dezelfde tabel naar elkaar verwijzen, bijvoorbeeld ouder-kind relaties.
SELECT *
FROM animals child
JOIN animals parent
ON child.parent_id = parent.id
Hier geven we de tabel animals twee aliassen: child en parent. Zo kun je onderscheid maken tussen de twee "kopieën" van dezelfde tabel.
Voorbeelden van SELF JOINs:
In de tabel employees staat bij elke werknemer een manager_id die verwijst naar de id van hun manager. Managers staan ook in employees. Toon de naam van elke werknemer naast de naam van hun manager.
Geef drie voorbeelden van situaties waarin een SELF JOIN nuttig is.