LEFT & RIGHT JOIN

6 Kernkonzepte
Die wichtigsten Konzepte für LEFT und RIGHT JOIN: LEFT JOIN · RIGHT JOIN · NULL-Behandlung · Mehrere Tabellen · Anti Join · Praxis-Beispiele LEFT und RIGHT JOIN geben alle Datensätze der einen Tabelle zurück – auch wenn es keinen Treffer in der anderen Tabelle gibt. Fehlende Werte werden mit NULL gefüllt.

LEFT JOIN – Alle aus der linken Tabelle

LEFT JOIN tabelle2 ON bedingung
SELECT k.name, b.betrag FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id;

LEFT JOIN gibt alle Zeilen der linken Tabelle (kunden) zurück – auch wenn es keine passende Zeile in der rechten Tabelle (bestellungen) gibt. In diesem Fall werden die Spalten der rechten Tabelle mit NULL gefüllt.

LEFT JOIN – Kernpunkte

Punkt Beschreibung
Linke Tabelle Alle Zeilen werden zurückgegeben (unabhängig von Treffern)
Rechte Tabelle Nur passende Zeilen werden zurückgegeben – sonst NULL
NULL-Füllung Fehlende Werte aus der rechten Tabelle werden mit NULL gefüllt
INNER vs LEFT LEFT JOIN = INNER JOIN + alle nicht gematchten Zeilen der linken Tabelle
Beispiele
-- Alle Kunden und ihre Bestellungen (auch Kunden ohne Bestellung)
SELECT k.name, b.id AS "bestellung_id", b.betrag
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id;
-- Nur Kunden OHNE Bestellungen (LEFT JOIN + IS NULL)
SELECT k.name
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
WHERE b.id IS NULL;
-- Alle Produkte mit optionalen Bewertungen
SELECT p.name, b.bewertung
FROM produkte p
LEFT JOIN bewertungen b ON p.id = b.produkt_id;
Typische Ausgabe (LEFT JOIN):
Anna | 101 | 59.99
Ben | NULL | NULL ← Ben hat keine Bestellung
Clara | 102 | 129.99
Tipp: LEFT JOIN ist der am häufigsten verwendete Outer Join. Er ist nützlich, wenn Sie alle Datensätze einer "Master-Tabelle" anzeigen möchten – z.B. alle Kunden, unabhängig davon, ob sie Bestellungen haben.

RIGHT JOIN – Alle aus der rechten Tabelle

RIGHT JOIN tabelle2 ON bedingung
SELECT k.name, b.betrag FROM bestellungen b RIGHT JOIN kunden k ON b.kunde_id = k.id;

RIGHT JOIN ist das Spiegelbild von LEFT JOIN: Er gibt alle Zeilen der rechten Tabelle zurück – auch ohne Treffer in der linken Tabelle. Fehlende Werte werden mit NULL gefüllt.

Beispiele
-- RIGHT JOIN: Alle Kunden (rechts) mit optionalen Bestellungen
SELECT k.name, b.id AS "bestellung_id"
FROM bestellungen b
RIGHT JOIN kunden k ON b.kunde_id = k.id;
-- RIGHT JOIN ist äquivalent zu LEFT JOIN (mit vertauschten Tabellen)
-- Das gleiche Ergebnis mit LEFT JOIN:
SELECT k.name, b.id
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id;
Hinweis: RIGHT JOIN wird seltener verwendet, da man LEFT JOIN mit vertauschten Tabellen einfacher lesen kann. Die meisten Datenbankentwickler bevorzugen LEFT JOIN.
Tipp: RIGHT JOIN wird in der Praxis selten verwendet – meistens kann man die Tabellen einfach vertauschen und LEFT JOIN verwenden. Das ist lesbarer und konsistenter.

NULL-Behandlung – Fehlende Werte erkennen

IS NULL · IS NOT NULL · COALESCE
SELECT k.name, COALESCE(b.betrag, 0) AS "betrag" FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id;

NULL-Behandlung ist bei Outer Joins entscheidend, da fehlende Treffer mit NULL gefüllt werden. Mit IS NULL können Sie diese Datensätze finden, mit COALESCE können Sie NULL-Werte durch einen Standardwert ersetzen.

Beispiele
-- Kunden ohne Bestellungen finden (IS NULL)
SELECT k.name
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
WHERE b.id IS NULL;
-- NULL durch 0 ersetzen (COALESCE)
SELECT k.name,
COALESCE(SUM(b.betrag), 0) AS "gesamt"
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
GROUP BY k.id, k.name;
-- Mit CASE für individuelle NULL-Behandlung
SELECT k.name,
CASE WHEN b.id IS NULL THEN 'Keine Bestellung'
ELSE 'Hat Bestellungen'
END AS "status"
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
GROUP BY k.id, k.name, b.id;
Typische Ausgabe (COALESCE):
Anna | 59.99
Ben | 0.00 ← Keine Bestellung → 0
Clara | 129.99
Tipp: COALESCE(wert, standard) ersetzt NULL-Werte durch den angegebenen Standardwert. Das ist besonders nützlich für Berichte und Auswertungen, wo NULL-Werte stören.

Mehrere Tabellen – LEFT JOIN mit 3+ Tabellen

LEFT JOIN ... LEFT JOIN ...
SELECT k.name, p.name, b.betrag FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id LEFT JOIN produkte p ON b.produkt_id = p.id;

Mehrere LEFT JOINs ermöglichen es, Daten aus mehreren Tabellen zu kombinieren – wobei jede JOIN-Bedingung unabhängig ist und NULL-Werte für fehlende Treffer in der jeweiligen Tabelle liefert.

Beispiele
-- Kunden, Bestellungen, Produkte (alle Kunden, auch ohne Bestellungen)
SELECT k.name AS "kunde",
b.datum,
p.name AS "produkt",
b.betrag
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
LEFT JOIN produkte p ON b.produkt_id = p.id;
-- Mit WHERE: Kunden ohne Bestellungen (NULL-Check auf b.id)
SELECT k.name
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
LEFT JOIN produkte p ON b.produkt_id = p.id
WHERE b.id IS NULL;
-- Vorsicht: NULL-Check auf p.id würde Bestellungen ohne Produkt liefern!
Tipp: Bei mehreren LEFT JOINs achten Sie darauf, dass Sie den NULL-Check auf die richtige Spalte durchführen – z.B. auf den Primärschlüssel der "fehlenden" Tabelle, nicht auf eine Spalte die auch in anderen Fällen NULL sein kann.

Anti Join – Datensätze ohne Treffer finden

LEFT JOIN + IS NULL · NOT EXISTS · NOT IN
-- Anti Join mit LEFT JOIN + IS NULL SELECT k.name FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id WHERE b.id IS NULL;

Anti Join findet alle Datensätze in einer Tabelle, die keine passenden Einträge in einer anderen Tabelle haben. Dies kann mit LEFT JOIN + IS NULL, NOT EXISTS oder NOT IN umgesetzt werden.

Beispiele
-- Kunden ohne Bestellungen (LEFT JOIN + IS NULL)
SELECT k.name
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
WHERE b.id IS NULL;
-- Kunden ohne Bestellungen (NOT EXISTS)
SELECT k.name
FROM kunden k
WHERE NOT EXISTS (
SELECT 1 FROM bestellungen b
WHERE b.kunde_id = k.id
);
-- Kunden ohne Bestellungen (NOT IN – mit Vorsicht!)
SELECT name
FROM kunden
WHERE id NOT IN (
SELECT kunde_id FROM bestellungen
WHERE kunde_id IS NOT NULL -- Wichtig!
);
Tipp: NOT EXISTS ist bei großen Datenmengen oft performanter als NOT IN und verhält sich bei NULL-Werten korrekt. Bei NOT IN müssen Sie auf NULL-Werte in der Subquery achten!

Praxis-Beispiele – LEFT & RIGHT JOIN im Einsatz

Berichte · Lücken finden · Datenqualität
SELECT k.name, COUNT(b.id) AS "bestellungen" FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id GROUP BY k.id, k.name;

Praxis-Beispiele zeigen typische Anwendungen von LEFT und RIGHT JOIN – von Berichten über Kunden-Bestellungen bis zur Datenqualitätsprüfung.

Beispiele
-- Anzahl Bestellungen pro Kunde (auch 0 für Kunden ohne Bestellung)
SELECT k.name, COUNT(b.id) AS "bestellungen"
FROM kunden k
LEFT JOIN bestellungen b ON k.id = b.kunde_id
GROUP BY k.id, k.name
ORDER BY "bestellungen" DESC;
-- Produkte, die nie bestellt wurden
SELECT p.name
FROM produkte p
LEFT JOIN bestellungen b ON p.id = b.produkt_id
WHERE b.id IS NULL;
-- Kategorien mit Umsatz (auch 0 € für Kategorien ohne Verkauf)
SELECT p.kategorie, COALESCE(SUM(b.betrag), 0) AS "umsatz"
FROM produkte p
LEFT JOIN bestellungen b ON p.id = b.produkt_id
GROUP BY p.kategorie;
-- Alle Mitarbeiter und ihre Abteilungen (auch Mitarbeiter ohne Abteilung)
SELECT m.name AS "mitarbeiter", a.name AS "abteilung"
FROM mitarbeiter m
LEFT JOIN abteilungen a ON m.abteilung_id = a.id;
Typische Ausgabe (Bestellungen pro Kunde):
Anna | 5
Ben | 0 ← LEFT JOIN zeigt Kunden ohne Bestellungen
Clara | 3
Tipp: LEFT JOIN ist unverzichtbar für Berichte und Dashboards, die auch "leere" Kategorien anzeigen sollen – z.B. Kunden ohne Bestellungen oder Produkte ohne Verkäufe. Mit COALESCE können Sie NULL-Werte in aussagekräftige Werte umwandeln.

LEFT & RIGHT JOIN im Überblick

LEFT Alle aus linker Tabelle
Fehlende = NULL
RIGHT Alle aus rechter Tabelle
Selten verwendet
IS NULL Fehlende Treffer
Anti Join
COALESCE NULL ersetzen
Standardwerte
NOT EXISTS Anti Join (performant)
Alternative zu IS NULL
Mehrfach 3+ Tabellen verknüpfen
Komplexe Abfragen

Quick Summary

LEFT
Alle aus linker Tabelle
RIGHT
Alle aus rechter Tabelle
IS NULL
Fehlende Treffer
Mehrfach
3+ Tabellen
Anti Join
Keine Treffer finden
Berichte
Praxis-Beispiele
SELECT k.name, COUNT(b.id) FROM kunden k LEFT JOIN bestellungen b ON k.id = b.kunde_id GROUP BY k.id, k.name;