Skip to content

SQL-Joins erklärt

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
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;