SQL-JOIN-Typen im Vergleich: inner, outer, cross, self, lateral, natural — was jeder Typ zurückgibt, mit je einem einzeiligen Beispiel.
Joins verbinden Zeilen aus zwei Tabellen über einen gemeinsamen Schlüssel. Der Join-Typ entscheidet, welche Zeilen übrig bleiben, wenn Schlüssel passen, fehlen oder sich wiederholen.
Nachschlagetabelle · 8 Einträge
SQL-JoinsExplained
8 of 8 rows
Innere und äußere Joins
Nur Zeilen, bei denen die ON-Bedingung in beiden Tabellen erfüllt ist. Zeilen ohne Treffer auf einer der beiden Seiten fallen weg.
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Alle Zeilen der linken Tabelle. Rechte Spalten sind NULL, wo kein Treffer existiert.
SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Alle Zeilen der rechten Tabelle. Linke Spalten sind NULL, wo kein Treffer existiert.
SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Alle Zeilen beider Tabellen. Seiten ohne Treffer werden mit NULL aufgefüllt.
SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Kreuz- und Selbstjoins
Kartesisches Produkt. Jede linke Zeile wird mit jeder rechten Zeile gepaart. Keine ON-Klausel.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Eine Tabelle, über Aliase mit sich selbst verbunden. Vergleicht Zeilen innerhalb einer Tabelle.
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;
Erweitert
Eine Subquery im FROM, pro äußerer Zeile ausgewertet. Die Subquery kann auf Spalten der äußeren Tabelle verweisen.
SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Verbindet über Spalten mit gleichem Namen. Keine ON-Klausel. Vorsicht vor unbeabsichtigten Schlüsselkollisionen.
SELECT u.name, o.total FROM users u NATURAL JOIN orders o;