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“
ID | Vorname | Nachname |
---|---|---|
1 | Albert | Einstein |
2 | Marie | Curie |
3 | Mahatma | Gandhi |
Tabelle „Adressen“
ID | PersonenID | Stadt | Land |
---|---|---|---|
1 | 1 | Princeton | USA |
2 | 2 | Paris | Frankreich |
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 JOIN | LEFT JOIN |
---|---|
Nur Datensätze mit einer Übereinstimmung | Alle Datensätze der linken Tabelle |
Zeigt keine NULL-Werte | Zeigt 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.
Plattform | LEFT JOIN Unterstützung | Bemerkung |
---|---|---|
MariaDB | Ja | Unterstützt Standard-LEFT JOIN |
MSSQL | Ja | Unterstützt zusätzlich OUTER FUNKTIONEN |
MySQL | Ja | Identisch zu MariaDB |
Oracle | Ja | Unterstützung von komplexen Abfragen |
SQLite | Ja | Unterstü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.