SQL-JOIN-typen vergeleken: inner, outer, cross, self, lateral, natural — wat elk type teruggeeft, met een voorbeeld van één regel.
Joins combineren rijen uit twee tabellen op een gedeelde sleutel. Het join-type bepaalt welke rijen overblijven als sleutels matchen, ontbreken of herhalen.
Referentietabel · 8 items
SQL-joinsExplained
8 of 8 rows
Inner en outer
Alleen rijen waar de ON-voorwaarde in beide tabellen matcht. Rijen zonder match aan een van beide kanten vallen weg.
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Alle rijen uit de linker tabel. Rechter kolommen zijn NULL waar geen match bestaat.
SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Alle rijen uit de rechter tabel. Linker kolommen zijn NULL waar geen match bestaat.
SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Alle rijen uit beide tabellen. Zijden zonder match worden opgevuld met NULL.
SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross en self
Cartesisch product. Elke linker rij wordt gekoppeld aan elke rechter rij. Geen ON-clausule.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Een tabel gejoind met zichzelf via aliassen. Vergelijkt rijen binnen één tabel.
SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Geavanceerd
Een subquery in FROM, geëvalueerd per buitenrij. De subquery kan verwijzen naar kolommen van de buitenste tabel.
SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Joint op kolommen die een naam delen. Geen ON-clausule. Pas op voor onbedoelde sleutelbotsingen.
SELECT u.name, o.total FROM users u NATURAL JOIN orders o;