SQL-Join

Aus Zweites Gehirn, dem persönlichen Wiki
SQL-Join
TypKonzept
QuellenQuelle - SQL Outer Join
Quelle - Recherche - SQL-Joins 2026
Erstellt2026-09-27
Aktualisiert2026-09-27
Tagssql, datenbank, join

Ein Join verbindet die Zeilen zweier Tabellen über eine Bedingung, meist gleiche Werte in einer gemeinsamen Spalte. Der Inner Join liefert nur Zeilen mit Partner. Die Outer Joins (Left, Right, Full) behalten zusätzlich die Zeilen ohne Partner und füllen die fehlenden Spalten mit NULL.

Das Beispiel

Alle Beispiele verwenden dieselben zwei Tabellen und verbinden sie über die gemeinsame Spalte B (Quelle - SQL Outer Join):

R A B
a1 b1
a1 b2
a2 b3
S B C
b1 c1
b3 c1
b3 c2
b4 c2
b5 c3

Passend sind b1 (einmal in S) und b3 (zweimal in S). b2 gibt es nur in R, b4 und b5 nur in S.

Die Join-Arten

Inner Join: nur Zeilen mit Partner

SELECT * FROM R INNER JOIN S ON R.B = S.B;   -- INNER darf fehlen: R JOIN S
A B C
a1 b1 c1
a2 b3 c1
a2 b3 c2
Einordnung (Claude)

Diese Tabelle steht nicht in der Quelle, sie folgt aus der Definition: „Für jede Zeile von T1 eine Zeile für jede Zeile in T2, welche die Bedingung erfüllt“ (Quelle - Recherche - SQL-Joins 2026). Sie ist genau der gemeinsame Teil der drei Outer-Join-Ergebnisse unten.

Left Outer Join: alle Zeilen der linken Tabelle

SELECT * FROM R LEFT OUTER JOIN S ON R.B = S.B;
A B C
a1 b1 c1
a1 b2 NULL
a2 b3 c1
a2 b3 c2

b2 kommt in S nicht vor, deshalb bekommt die Zeile NULL in C (Quelle - SQL Outer Join).

Right Outer Join: alle Zeilen der rechten Tabelle

SELECT * FROM R RIGHT OUTER JOIN S ON R.B = S.B;
A B C
a1 b1 c1
a2 b3 c1
a2 b3 c2
NULL b4 c2
NULL b5 c3

b4 und b5 kommen in R nicht vor, deshalb bekommen diese Zeilen NULL in A (Quelle - SQL Outer Join).

Full Outer Join: alle Zeilen beider Tabellen

SELECT * FROM R FULL OUTER JOIN S ON R.B = S.B;
A B C
a1 b1 c1
a1 b2 NULL
a2 b3 c1
a2 b3 c2
NULL b4 c2
NULL b5 c3

Übersicht

Join Zeilen im Beispiel behält Zeilen ohne Partner aus …
Inner 3 keiner Tabelle
Left Outer 4 der linken Tabelle (R)
Right Outer 5 der rechten Tabelle (S)
Full Outer 6 beiden Tabellen
Cross 3 · 5 = 15 (keine Bedingung, jede mit jeder)

Merksatz: Ein Outer Join ist zuerst ein Inner Join. Danach werden die Zeilen ohne Partner ergänzt, und ihre fehlenden Spalten werden mit NULL gefüllt (Quelle - Recherche - SQL-Joins 2026, PostgreSQL-Doku).

Weitere Begriffe

  • NULL heisst „kein Wert vorhanden“. Im Beispiel markiert NULL die Zeilen, die keinen Join-Partner haben.
  • Cross Join bildet das kartesische Produkt: Jede Zeile wird mit jeder kombiniert, aus N und M Zeilen werden N · M. FROM R, S bedeutet dasselbe.
  • Vervielfachung: Die Zeile (a2, b3) steht zweimal im Ergebnis, weil b3 in S zweimal vorkommt. Ein Join kann ein Ergebnis also grösser machen als beide Tabellen.
  • INNER und OUTER sind optional: JOIN = Inner Join, LEFT JOIN = LEFT OUTER JOIN.

Die Join-Bedingung: ON, USING, NATURAL

Form Bedeutung
ON R.B = S.B allgemeinste Form, beliebige Bedingung wie in WHERE; B steht zweimal im Ergebnis (R.B und S.B)
USING (B) Kurzform für gleichnamige Spalten, B erscheint nur einmal
NATURAL JOIN verbindet automatisch über alle gleichnamigen Spalten, B erscheint nur einmal

NATURAL gilt als riskant: Kommt später in einer Tabelle eine weitere gleichnamige Spalte dazu (etwa name), wird sie stillschweigend mitverglichen. USING ist davor sicher (PostgreSQL-Doku, Quelle - Recherche - SQL-Joins 2026).

Widerspruch

In Quelle - SQL Outer Join stehen die Abfragen ohne Bedingung, z.B. SELECT * FROM R LEFT OUTER JOIN S. Laut PostgreSQL- und MySQL-Doku muss ein Outer Join aber ON, USING oder NATURAL haben (Quelle - Recherche - SQL-Joins 2026). Die Ergebnistabellen der Quelle entsprechen R NATURAL LEFT OUTER JOIN S bzw. USING (B), also dem Verbund über die gemeinsame Spalte B.

Unterschiede zwischen Datenbanken

  • MySQL kennt keinen FULL OUTER JOIN, nur LEFT und RIGHT (Quelle - Recherche - SQL-Joins 2026).
  • Die MySQL-Doku empfiehlt, LEFT JOIN statt RIGHT JOIN zu verwenden, damit der Code portabel bleibt. Ein Right Join lässt sich immer als Left Join mit vertauschten Tabellen schreiben: S LEFT JOIN R liefert dieselben Zeilen wie R RIGHT JOIN S.
Einordnung (Claude)

In MySQL erhält man einen Full Outer Join, indem man einen Left und einen Right Join mit UNION verbindet: SELECT … FROM R LEFT JOIN S ON R.B = S.B UNION SELECT … FROM R RIGHT JOIN S ON R.B = S.B. UNION entfernt dabei doppelte Zeilen, allerdings auch solche, die schon in den Tabellen doppelt waren.

Venn-Diagramme: anschaulich, aber ungenau

Joins werden oft mit zwei überlappenden Kreisen erklärt: Der Inner Join ist die Schnittmenge, der Left Join der ganze linke Kreis. Populär gemacht hat das Jeff Atwood 2007, der selbst einräumte, dass die Bilder nicht ganz zur Syntax passen und sich der Cross Join so nicht darstellen lässt. Lukas Eder hält 2016 dagegen: „Ein Join ist immer ein Kreuzprodukt mit einer Bedingung, eventuell plus eine Vereinigung“, keine Mengenoperation. Die Kreise verschweigen zum Beispiel, dass eine Zeile mehrere Partner haben kann (a2/b3 oben) (Quelle - Recherche - SQL-Joins 2026).

Einordnung (Claude)

Die handgezeichneten Tabellen mit eingekreisten B-Werten in Quelle - SQL Outer Join entsprechen eher Eders Vorschlag: Man sieht, welche Zeilenpaare zusammenpassen und welche übrig bleiben. Als Eselsbrücke für „welche Seite bleibt vollständig“ sind die Kreise trotzdem brauchbar, ähnlich wie die Venn-Diagramme bei Boolesche Algebra.

Zum Weiterlernen

Verwandt