🔗 JOINs
Meerdere tabellen samenvoegen — INNER JOIN, LEFT JOIN en queries over gerelateerde data.
Wat is een JOIN?
Data is verdeeld over meerdere tabellen om herhaling te voorkomen. Een JOIN combineert rijen uit twee tabellen op basis van een gemeenschappelijke kolom.
De oranje kolommen zijn foreign keys — ze verwijzen naar de id van een andere tabel.
INNER JOIN — alleen rijen die in beide tabellen matchenLEFT JOIN — alle rijen links + matches rechts (NULL als geen match)RIGHT JOIN — alle rijen rechts (SQLite: niet native ondersteund)FULL OUTER JOIN — alle rijen van beide kantenINNER JOIN — overeenkomsten
INNER JOIN geeft alleen rijen terug die in beide tabellen een match hebben.
SELECT kolommen
FROM tabel1
INNER JOIN tabel2 ON tabel1.id = tabel2.foreign_key;
SELECT
o.id AS order_id,
g.naam AS klant,
o.datum,
o.aantal
FROM orders AS o
INNER JOIN gebruikers AS g ON o.gebruiker_id = g.id;
-- Bestellingen met klant én productnaam
SELECT
g.naam AS klant,
p.naam AS product,
p.prijs,
o.aantal,
o.datum
FROM orders AS o
INNER JOIN gebruikers AS g ON o.gebruiker_id = g.id
INNER JOIN producten AS p ON o.product_id = p.id;
LEFT JOIN — alle linker rijen
LEFT JOIN geeft alle rijen uit de linker tabel, ook als er geen match is in de rechter tabel (dan verschijnt NULL).
-- Alleen gebruikers MET orders
SELECT g.naam, o.datum
FROM gebruikers g
INNER JOIN orders o ON g.id = o.gebruiker_id;
-- Sara staat er NIET in (geen orders)
-- Alle gebruikers, ook zonder orders
SELECT g.naam, o.datum
FROM gebruikers g
LEFT JOIN orders o ON g.id = o.gebruiker_id;
-- Sara staat erbij met datum = NULL
-- Gebruikers die nog nooit besteld hebben
SELECT g.naam, g.email
FROM gebruikers AS g
LEFT JOIN orders AS o ON g.id = o.gebruiker_id
WHERE o.id IS NULL;
JOIN gecombineerd met GROUP BY
JOINs en aggregaties zijn krachtig samen — je kunt statistieken berekenen over gerelateeerde data.
SELECT
g.naam,
COUNT(o.id) AS aantal_orders,
SUM(o.aantal) AS totaal_items
FROM gebruikers AS g
LEFT JOIN orders AS o ON g.id = o.gebruiker_id
GROUP BY g.id, g.naam
ORDER BY aantal_orders DESC;
SELECT
p.naam AS product,
p.categorie,
COUNT(o.id) AS aantal_orders,
SUM(o.aantal * p.prijs) AS totale_omzet
FROM producten AS p
LEFT JOIN orders AS o ON p.id = o.product_id
GROUP BY p.id, p.naam, p.categorie
ORDER BY totale_omzet DESC;
Bij JOINs zijn er vaak duplicaten in kolommen. Groepeer op de primary key (g.id) om zeker te zijn van unieke groepen.
Oefening — JOINs in de praktijk
- Toon alle bestellingen met naam van de klant en naam van het product
- Welke gebruikers hebben nog nooit besteld? (LEFT JOIN + WHERE IS NULL)
- Wat is de totale omzet per categorie? (JOIN producten + orders, GROUP BY categorie)
🧠 Kennischeck
Les 7 afgerond!
JOINs zijn de krachtigste tool in SQL — je combineert nu data uit meerdere tabellen in één query.