JOINs
M164 Block 3 von 5 — Tabellen verknüpfen
JOINs verbinden mehrere Tabellen in einer Abfrage. Die Verknüpfung läuft über übereinstimmende Spalten — meistens Primär- und Fremdschlüssel.

Was ist ein JOIN?

Wenn Daten in mehreren Tabellen verteilt sind (z.B. Kunden und Bestellungen), braucht man JOINs um sie in einer Abfrage zusammenzuführen.

Beispieldaten für alle JOIN-Beispiele:

kunden (KundenId / Vorname)bestellungen (BestellId / KundenId / Preis)
1 / Hans1 / 4 / 10 CHF — KundenId 4 existiert nicht!
2 / Ueli2 / 2 / 13 CHF
3 / Sepp3 / 1 / 20 CHF

Sepp hat keine Bestellung. Bestellung 1 hat eine ungültige KundenId (4).

JOIN-ArtWas wird zurückgegeben
INNER JOINNur Zeilen die in beiden Tabellen einen Match haben
LEFT JOINAlle Zeilen der linken Tabelle + Schnittmenge
RIGHT JOINAlle Zeilen der rechten Tabelle + Schnittmenge
FULL OUTER JOINAlle Zeilen beider Tabellen

INNER JOIN — nur die Schnittmenge

Gibt nur Zeilen zurück, die in beiden Tabellen einen übereinstimmenden Wert haben. Zeilen ohne Match auf einer Seite werden weggelassen.

SELECT k.vorname, b.bestellid, b.preis
FROM   bestellungen b
INNER JOIN kunden k ON b.kundenid = k.kundenid;
VornameBestellIdPreis
Hans320 CHF
Ueli213 CHF

Sepp (keine Bestellung) fehlt. Bestellung 1 (KundenId 4 existiert nicht) fehlt.

LEFT JOIN & RIGHT JOIN — eine Seite vollständig

LEFT JOIN: Alle Zeilen der linken Tabelle werden angezeigt. Wo kein Match existiert, werden die Spalten der rechten Tabelle mit NULL gefüllt.

-- Alle Bestellungen — auch jene ohne gültigen Kunden
SELECT k.vorname, b.bestellid, b.preis
FROM   bestellungen b
LEFT JOIN kunden k ON b.kundenid = k.kundenid;
VornameBestellIdPreis
NULL110 CHF
Ueli213 CHF
Hans320 CHF

RIGHT JOIN: Alle Zeilen der rechten Tabelle werden angezeigt. Linke Seite wird ggf. NULL.

-- Alle Kunden — auch jene ohne Bestellung
SELECT k.vorname, b.bestellid, b.preis
FROM   bestellungen b
RIGHT JOIN kunden k ON b.kundenid = k.kundenid;
VornameBestellIdPreis
Hans320 CHF
Ueli213 CHF
SeppNULLNULL
Merkhilfe: A LEFT JOIN B und B RIGHT JOIN A liefern identische Ergebnisse — LEFT und RIGHT sind symmetrisch durch Tauschen der Tabellenreihenfolge.

FULL OUTER JOIN — alle Zeilen beider Tabellen

Gibt alle Zeilen beider Tabellen zurück. Nicht verknüpfbare Zeilen erhalten auf der fehlenden Seite NULL.

SELECT k.vorname, b.bestellid, b.preis
FROM   bestellungen b
FULL JOIN kunden k ON b.kundenid = k.kundenid;
VornameBestellIdPreis
NULL110 CHF
Ueli213 CHF
Hans320 CHF
SeppNULLNULL

Use-Case: Vollständige Übersicht beider Tabellen — unabhängig davon ob ein Match existiert.