SQL-trackLes 7 van 10

🔗 JOINs

Meerdere tabellen samenvoegen — INNER JOIN, LEFT JOIN en queries over gerelateerde data.

⏱ 30 min6 stappenInteractieve SQL-sandbox
Stap 1 / 6

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.

Onze database — 3 tabellen
gebruikers
id
naam
email
leeftijd
orders
id
gebruiker_id →
product_id →
aantal
datum
producten
id
naam
prijs
categorie

De oranje kolommen zijn foreign keys — ze verwijzen naar de id van een andere tabel.

Soorten JOINs
INNER JOIN — alleen rijen die in beide tabellen matchen
LEFT 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 kanten
Stap 2 / 6

INNER JOIN — overeenkomsten

INNER JOIN geeft alleen rijen terug die in beide tabellen een match hebben.

Syntaxis
SELECT kolommen
FROM tabel1
INNER JOIN tabel2 ON tabel1.id = tabel2.foreign_key;
Bestellingen met gebruikersnaam
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;
Drie tabellen combineren
-- 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;
Stap 3 / 6

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).

INNER JOIN
-- 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)
LEFT JOIN
-- 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 zonder orders vinden
-- 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;
Wanneer LEFT JOIN vs INNER JOIN?
• Gebruik INNER JOIN als je alleen complete matches wilt
• Gebruik LEFT JOIN als je ook rijen wilt zonder match (bijv. alle klanten, ook zonder bestellingen)
Stap 4 / 6

JOIN gecombineerd met GROUP BY

JOINs en aggregaties zijn krachtig samen — je kunt statistieken berekenen over gerelateeerde data.

Hoeveel bestellingen heeft elke gebruiker?
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;
Omzet per product
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;
GROUP BY met JOIN — tip

Bij JOINs zijn er vaak duplicaten in kolommen. Groepeer op de primary key (g.id) om zeker te zijn van unieke groepen.

Stap 5 / 6

Oefening — JOINs in de praktijk

🎯 Opdrachten
  1. Toon alle bestellingen met naam van de klant en naam van het product
  2. Welke gebruikers hebben nog nooit besteld? (LEFT JOIN + WHERE IS NULL)
  3. Wat is de totale omzet per categorie? (JOIN producten + orders, GROUP BY categorie)
Resultaat verschijnt hier...

🧠 Kennischeck

🔗

Les 7 afgerond!

JOINs zijn de krachtigste tool in SQL — je combineert nu data uit meerdere tabellen in één query.

Les 8: Subqueries →