SQL: mit dem „FULL JOIN“ alle Daten aus zwei Tabellen anzeigen – mit oder ohne Verbindung
In SQL-Datenbanken kommt es häufig vor, dass man Daten aus zwei Tabellen miteinander verknüpfen will. Manchmal benötigt man nicht nur übereinstimmende Werte (wie beim INNER JOIN) oder alle Zeilen aus einer der Tabellen (wie beim LEFT JOIN), sondern alle Daten aus beiden Tabellen – ganz egal, ob sie miteinander verknüpft sind oder nicht. Genau dafür gibt es den FULL JOIN.
In diesem Artikel lernst du den FULL JOIN Schritt für Schritt kennen, wie er funktioniert, wie er verwendet wird, und welche Alternativen es gibt, wenn deine Datenbank ihn nicht unterstützt. Als Beispiel verwenden wir die Tabellen „Personen“ und „Adressen“ in unserer Datenbank „Datenbank“.
Was ist ein FULL JOIN?
Ein FULL JOIN (auch als FULL OUTER JOIN bekannt) kombiniert die Funktionalität von LEFT JOIN und RIGHT JOIN. Das bedeutet:
- Alle Zeilen der linken Tabelle werden zurückgegeben, selbst wenn es keine passende Zeile in der rechten Tabelle gibt.
- Alle Zeilen der rechten Tabelle werden zurückgegeben, selbst wenn es keine passende Zeile in der linken Tabelle gibt.
- Wenn eine Zeile weder in der linken Tabelle noch in der rechten eine passende Verbindung hat, werden die fehlenden Werte als NULL angezeigt.
Grundlegende Syntax von FULL JOIN
Die Syntax sieht so aus:
SELECT tabelle1.spalte, tabelle2.spalte, ...
FROM tabelle1
FULL JOIN tabelle2
ON tabelle1.spalte = tabelle2.spalte;
Die Beispieltabellen „Personen“ und „Adressen“
Für die Beispiele arbeiten wir mit den folgenden 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 |
3 | 4 | Cape Town | Südafrika |
Wichtige Details
- Die Tabelle „Adressen“ enthält zu ID 4 eine Adresse, für die es keine entsprechende Person in der Tabelle „Personen“ gibt.
- Gandhi (ID 3) in der Personenliste hat keine zugehörige Adresse in der Adressenliste.
Beispiele für FULL JOIN
Beispiel 1: Alle Personen und alle Adressen anzeigen
Wir möchten mit einem FULL JOIN alle Personen und alle Adressen anzeigen. Passen die Einträge zueinander (durch die Spalten „ID“ in der Tabelle „Personen“ und „PersonenID“ in der Tabelle „Adressen“), sollen sie miteinander verknüpft werden. Unverbundene Einträge sollen als NULL angezeigt werden.
SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land
FROM Personen
FULL JOIN Adressen
ON Personen.ID = Adressen.PersonenID;
Ergebnis: | Vorname | Nachname | Stadt | Land | |———–|————|————|————-| | Albert | Einstein | Princeton | USA | | Marie | Curie | Paris | Frankreich | | Mahatma | Gandhi | NULL | NULL | | NULL | NULL | Cape Town | Südafrika |
Erklärung
- Einstein und Curie werden korrekt mit ihren Adressen kombiniert.
- Gandhi bleibt in der Tabelle „Personen“, obwohl er keine Adresse hat (Stadt und Land = NULL).
- Die Adresse „Cape Town“ aus der Tabelle „Adressen“ erscheint in der Ausgabe, obwohl keine entsprechende Person dafür existiert (Vorname und Nachname = NULL).
Beispiel 2: Anzeigen, welche Personen keine Adresse haben (oder umgekehrt)
Mit einem FULL JOIN kannst du auch analysieren, welche Daten auf einer Seite fehlen. Zum Beispiel möchten wir:
- Alle Personen ohne Adresse sehen.
- Adressen ohne zugehörige Person anzeigen.
Hier hilft die WHERE-Klausel, um Zeilen mit ausschließlich NULL-Werten auf einer Seite zu identifizieren:
SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land
FROM Personen
FULL JOIN Adressen
ON Personen.ID = Adressen.PersonenID
WHERE Personen.ID IS NULL OR Adressen.PersonenID IS NULL;
Ergebnis: | Vorname | Nachname | Stadt | Land | |———–|————|————|————-| | Mahatma | Gandhi | NULL | NULL | | NULL | NULL | Cape Town | Südafrika |
- Gandhi hat keine Adresse.
- „Cape Town“ gehört keiner Person.
Beispiel 3: Mehr Informationen verknüpfen
Wenn es eine weitere Tabelle „Berufe“ gibt und wir alle Informationen kombinieren möchten, können wir mehrere Tabellen rechts und links per FULL JOIN verbinden:
Tabelle Berufe | ID | PersonenID | Beruf | |—–|————|——————| | 1 | 2 | Wissenschaftlerin| | 2 | 3 | Politiker |
SELECT Personen.Vorname, Adressen.Stadt, Adressen.Land, Berufe.Beruf
FROM Personen
FULL JOIN Adressen ON Personen.ID = Adressen.PersonenID
FULL JOIN Berufe ON Personen.ID = Berufe.PersonenID;
Ergebnis: | Vorname | Stadt | Land | Beruf | |———–|————|————-|——————| | Albert | Princeton | USA | NULL | | Marie | Paris | Frankreich | Wissenschaftlerin| | Mahatma | NULL | NULL | Politiker | | NULL | Cape Town | Südafrika | NULL |
Einschränkungen von FULL JOIN in bestimmten Plattformen
Ist FULL JOIN überall möglich?
Leider unterstützen nicht alle Datenbanksysteme den FULL JOIN direkt. Hier kannst du herausfinden, ob deine Datenbank ihn unterstützt, oder du kannst eine Alternative (z. B. UNION von LEFT JOIN und RIGHT JOIN) nutzen.
Beispiel: FULL JOIN selber bauen (für MariaDB und MySQL)
In MariaDB und MySQL wird FULL JOIN nicht nativ unterstützt. Du kannst jedoch denselben Effekt erzielen, indem du LEFT JOIN und RIGHT JOIN kombinierst und das Ergebnis mit UNION verbindest.
SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land
FROM Personen
LEFT JOIN Adressen
ON Personen.ID = Adressen.PersonenID
UNION
SELECT Personen.Vorname, Personen.Nachname, Adressen.Stadt, Adressen.Land
FROM Personen
RIGHT JOIN Adressen
ON Personen.ID = Adressen.PersonenID;
Ergebnis: Das Ergebnis ist identisch mit dem eines FULL JOINs – alle Zeilen aus beiden Tabellen.
Unterstützung durch verschiedene Plattformen
Hier der Überblick, welche Plattformen FULL JOIN unterstützen:
Plattform | FULL JOIN Unterstützung | Bemerkung |
---|---|---|
MariaDB | Nein | Mit UNION aus LEFT JOIN und RIGHT JOIN umsetzbar |
MSSQL | Ja | Unterstützt direkt FULL JOIN |
MySQL | Nein | Mit UNION aus LEFT JOIN und RIGHT JOIN umsetzbar |
Oracle | Ja | Unterstützt direkt FULL JOIN |
SQLite | Ja | Unterstützt FULL JOIN |
Fazit
Der FULL JOIN ist ideal, wenn du ALLE Daten aus zwei Tabellen kombinieren möchtest – unabhängig davon, ob sie zusammenpassen oder nicht. So kannst du lückenhafte Zuordnungen erkennen und eine vollständige Übersicht über alle Informationen erhalten.