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 / Hans | 1 / 4 / 10 CHF — KundenId 4 existiert nicht! |
| 2 / Ueli | 2 / 2 / 13 CHF |
| 3 / Sepp | 3 / 1 / 20 CHF |
Sepp hat keine Bestellung. Bestellung 1 hat eine ungültige KundenId (4).
| JOIN-Art | Was wird zurückgegeben |
|---|---|
INNER JOIN | Nur Zeilen die in beiden Tabellen einen Match haben |
LEFT JOIN | Alle Zeilen der linken Tabelle + Schnittmenge |
RIGHT JOIN | Alle Zeilen der rechten Tabelle + Schnittmenge |
FULL OUTER JOIN | Alle 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;
| Vorname | BestellId | Preis |
|---|---|---|
| Hans | 3 | 20 CHF |
| Ueli | 2 | 13 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;
| Vorname | BestellId | Preis |
|---|---|---|
| NULL | 1 | 10 CHF |
| Ueli | 2 | 13 CHF |
| Hans | 3 | 20 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;
| Vorname | BestellId | Preis |
|---|---|---|
| Hans | 3 | 20 CHF |
| Ueli | 2 | 13 CHF |
| Sepp | NULL | NULL |
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;
| Vorname | BestellId | Preis |
|---|---|---|
| NULL | 1 | 10 CHF |
| Ueli | 2 | 13 CHF |
| Hans | 3 | 20 CHF |
| Sepp | NULL | NULL |
Use-Case: Vollständige Übersicht beider Tabellen — unabhängig davon ob ein Match existiert.