SQL: mit einem „LEFT JOIN“ oder „RIGHT JOIN“ alle Daten bei der Verbindung von Tabellen behalten

Manchmal möchte man Daten aus einer Tabelle abrufen, selbst wenn sie in einer anderen Tabelle keine passenden Einträge haben. Genau das ermöglicht der LEFT JOIN. In diesem Artikel erfährst du, was ein LEFT JOIN ist, wie er funktioniert und wie du ihn verwenden kannst.

Wir setzen für die Beispiele die Datenbank „Datenbank“ ein und nutzen die Tabelle „Personen“ sowie eine weitere Tabelle „Adressen“. Ziel ist es, auch Personen anzuzeigen, die keine zugeordnete Adresse haben.


Was ist ein LEFT JOIN / RIGHT JOIN?

Der RIGHT JOIN ist das Gegenteil des LEFT JOIN. Ein LEFT JOIN ist ein SQL-Befehl, mit dem zwei Tabellen so miteinander verknüpft werden, dass alle Zeilen aus der linken Tabelle angezeigt werden – auch wenn es in der rechten Tabelle keine entsprechende Übereinstimmung gibt. Falls keine Übereinstimmung gefunden wird, zeigt SQL für die Spalten der rechten Tabelle einfach NULL an, was so viel wie „keine Daten verfügbar“ bedeutet.

Grundsätzliche Syntax des LEFT JOIN

Die allgemeine Schreibweise lautet:

SELECT tabelle1.spalte1, tabelle2.spalte2, ...
FROM tabelle1
LEFT JOIN tabelle2
ON tabelle1.spalte = tabelle2.spalte;

Erklärung:

  • tabelle1: Die „linke“ Tabelle, alle ihre Zeilen werden aufgelistet.
  • tabelle2: Die „rechte“ Tabelle, von der nur Daten angezeigt werden, die mit der linken Tabelle übereinstimmen.
  • ON: Gibt an, welche Spalten in den beiden Tabellen zusammenpassen sollen.

Beispieltabellen „Personen“ und „Adressen“

Für unsere Beispiele verwenden wir zwei Tabellen:

Tabelle „Personen“

IDVornameNachname
1AlbertEinstein
2MarieCurie
3MahatmaGandhi

Tabelle „Adressen“

IDPersonenIDStadtLand
11PrincetonUSA
22ParisFrankreich

Wir sehen hier, dass zu Mahatma Gandhi (ID 3) keine Adresse hinterlegt ist. Dies ist ein häufiger Fall in Datenbanken, denn nicht immer gibt es vollständige Informationen für alle Einträge.


Beispiele für LEFT JOIN

Beispiel 1: Personen und ihre Adressen auflisten

Wir möchten alle Personen anzeigen (selbst wenn sie keine Adresse haben) und dazu deren Stadt und Land hinzufügen. Dies gelingt mit einem LEFT JOIN:

SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land
FROM Personen
LEFT JOIN Adressen
ON Personen.ID = Adressen.PersonenID;

Ergebnis: | Vorname | Nachname | Stadt | Land | |———–|————|————|————-| | Albert | Einstein | Princeton | USA | | Marie | Curie | Paris | Frankreich | | Mahatma | Gandhi | NULL | NULL |

  • Albert Einstein und Marie Curie werden korrekt mit ihren Adressen verknüpft.
  • Zu Mahatma Gandhi gibt es keine Adresse – deshalb erscheinen die Werte als NULL.

Beispiel 2: Nur Personen ohne Adresse anzeigen

Nun wollen wir herausfinden, welche Personen keine Adresse in der Tabelle „Adressen“ haben. Dazu kombinieren wir den LEFT JOIN mit einer Bedingung in der WHERE-Klausel:

SELECT Personen.Vorname, Personen.Nachname
FROM Personen
LEFT JOIN Adressen
ON Personen.ID = Adressen.PersonenID
WHERE Adressen.PersonenID IS NULL;

Ergebnis: | Vorname | Nachname | |———–|————| | Mahatma | Gandhi |

  • Der Trick ist hier die Bedingung WHERE Adressen.PersonenID IS NULL. Sie filtert genau die Zeilen, für die keine Übereinstimmung im JOIN gefunden wurde.

Beispiel 3: Mehr Daten anzeigen mit zusätzlichen Filtern

Angenommen, wir möchten alle Personen sehen, aber nur die Adressdaten aus den USA anzeigen, falls vorhanden. Auch Personen ohne Adresse sollen dabei sein. Dies kombinieren wir mit einer weiteren Bedingung:

SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land
FROM Personen
LEFT JOIN Adressen
ON Personen.ID = Adressen.PersonenID
WHERE Adressen.Land = 'USA' OR Adressen.Land IS NULL;

Ergebnis: | Vorname | Nachname | Stadt | Land | |———–|————|————|——–| | Albert | Einstein | Princeton | USA | | Mahatma | Gandhi | NULL | NULL |

  • Marie Curie wird nicht angezeigt, weil ihre Adresse in Frankreich liegt.
  • Gandhi wird dennoch angezeigt, da er keine Adresse hat.

Beispiel 4: Mehrere Tabellen verknüpfen

Ein LEFT JOIN kann auch mit zusätzlichen Tabellen kombiniert werden, um komplexere Datenstrukturen abzubilden. Angenommen, eine Tabelle „Berufe“ enthält die Berufsbezeichnungen:

Tabelle Berufe
| ID | PersonenID | Beruf | |—–|————|——————| | 1 | 1 | Physiker | | 2 | 2 | Wissenschaftlerin|

Wir möchten alle Personen mit ihren Berufen und Adressdaten anzeigen:

SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land, Berufe.Beruf
FROM Personen
LEFT JOIN Adressen ON Personen.ID = Adressen.PersonenID
LEFT JOIN Berufe ON Personen.ID = Berufe.PersonenID;

Ergebnis: | Vorname | Nachname | Stadt | Land | Beruf | |———–|————|————|————-|——————| | Albert | Einstein | Princeton | USA | Physiker | | Marie | Curie | Paris | Frankreich | Wissenschaftlerin| | Mahatma | Gandhi | NULL | NULL | NULL |

  • Gandhi hat weder eine Adresse noch einen Beruf, aber er wird trotzdem angezeigt.

Der Unterschied zwischen LEFT JOIN und INNER JOIN

Ein häufiger Fehler, den Anfänger machen, ist der falsche Einsatz von JOINs. Hier der Unterschied:

INNER JOINLEFT JOIN
Nur Datensätze mit einer ÜbereinstimmungAlle Datensätze der linken Tabelle
Zeigt keine NULL-WerteZeigt NULL für fehlende Verknüpfungen

Unterstützung durch verschiedene Plattformen

Die gute Nachricht ist: LEFT JOIN ist Teil des SQL-Standards und wird von allen wichtigen relationalen Datenbankmanagement-Systemen unterstützt. Es gibt also keine Notwendigkeit für alternative Lösungen.

PlattformLEFT JOIN UnterstützungBemerkung
MariaDBJaUnterstützt Standard-LEFT JOIN
MSSQLJaUnterstützt zusätzlich OUTER FUNKTIONEN
MySQLJaIdentisch zu MariaDB
OracleJaUnterstützung von komplexen Abfragen
SQLiteJaUnterstützt Standard-LEFT JOIN

Fazit

Der LEFT JOIN ist ein wichtiges Werkzeug, wenn es darum geht, vollständige Informationen aus einer Tabelle zu behalten, auch wenn keine passenden Daten in einer anderen Tabelle vorhanden sind. Er wird in vielen Szenarien benötigt, z. B. um fehlende Zuordnungen zu identifizieren oder alle Daten aus einer Haupttabelle zusammen mit ergänzenden Informationen anzuzeigen.