Bei SQL geht es oft darum, die richtigen Fragen zu stellen. Wenn deine Daten über mehrere Tabellen verteilt sind, ist der Full Outer Join unbestreitbar praktisch. In manchen Datenbanksystemen ist er gang und gäbe, in MySQL ist das Konzept des FULL OUTER JOIN aber etwas kniffliger. Warum? Weil er nicht nativ unterstützt wird. Spannend, oder? Aber keine Sorge, es gibt einen Workaround!
In diesem Tutorial schauen wir uns ausführlich an, wie du einen Full Outer Join in MySQL umsetzt. Anschnallen, Leute – gleich tauchen wir in einen Pool voller Codebeispiele ein.
🔖 Kurzreferenz: Du brauchst schnell einen Überblick über alle JOIN-Typen? Schau dir unser SQL JOIN Cheat Sheet mit Diagrammen und Codebeispielen an.
Was ist ein Full Outer Join?
Bevor wir loslegen, klären wir, was ein FULL OUTER JOIN ist. In SQL kombiniert ein Full Outer Join die Wirkung von Left und Right Outer Join. Anders gesagt: Er liefert die Datensätze mit übereinstimmenden Werten in beiden Tabellen sowie alle Datensätze aus beiden Tabellen, deren Werte in der jeweils anderen Tabelle nicht vorkommen.
Ein Beispiel: Nehmen wir an, wir haben zwei Tabellen, Employees und Departments.
Tabelle Employees:
| id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Tabelle Departments:
| id | department |
|---|---|
| 2 | HR |
| 3 | IT |
| 4 | Marketing |
Mit der FULL OUTER JOIN-Abfrage:
SELECT * FROM Employees
FULL OUTER JOIN Departments ON Employees.id = Departments.id;
Die Ergebnismenge sieht so aus:
| Employees.id | Employees.name | Departments.id | Departments.department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Diese Ausgabe vereint alle Datensätze aus Employees und Departments. Sie enthält:
- Datensätze mit übereinstimmenden
id-Werten in beiden Tabellen (Bob und Charlie). - Datensätze aus
Employeesohne passenden Datensatz inDepartments(Alice). - Datensätze aus
Departmentsohne passenden Datensatz inEmployees(Marketing).
So nützlich diese Syntax ist, MySQL unterstützt sie nicht direkt. Wie kommen wir also weiter? Finden wir es heraus.
Full Outer Join in MySQL simulieren
Wie oben erwähnt, unterstützt MySQL das Schlüsselwort FULL OUTER JOIN nicht explizit. Trotzdem erreichen wir das gewünschte Ergebnis mit einer Kombination aus LEFT JOIN und UNION
Die Simulation eines Full Outer Join in MySQL besteht aus zwei Schritten:
- Führe einen
LEFT JOINauf die erste Tabelle aus, um alle Datensätze der ersten Tabelle samt passenden Datensätzen aus der zweiten Tabelle zu erhalten. - Kombiniere das Ergebnis per
UNIONmit dem Ergebnis einesRIGHT JOIN, um alle Datensätze der zweiten Tabelle samt passenden Datensätzen aus der ersten Tabelle zu erhalten.
So funktionieren die einzelnen Bausteine:
Left Join:
Right Join:
Beispiel für einen Full Outer Join in MySQL
Hier ein Beispiel für den Workaround mit denselben Daten wie zuvor
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Employees
LEFT JOIN
Departments ON Employees.id = Departments.id
UNION
SELECT
Employees.id AS Employees_id,
Employees.name,
Departments.id AS Departments_id,
Departments.department
FROM
Departments
RIGHT JOIN
Employees ON Departments.id = Employees.id;
Diese Abfrage besteht aus zwei Teilen:
- Einem
LEFT JOIN, der alle Datensätze aus der TabelleEmployeesund die passenden Datensätze aus der TabelleDepartmentsholt. - Einem
RIGHT JOIN, der alle Datensätze aus der TabelleDepartmentsund die passenden Datensätze aus der TabelleEmployeesholt.
UNION kombiniert die Ergebnisse beider Abfragen und entfernt dabei doppelte Zeilen.
Mit denselben Beispieltabellen sieht die Ergebnismenge so aus:
| Employees_id | name | Departments_id | department |
|---|---|---|---|
| 1 | Alice | NULL | NULL |
| 2 | Bob | 2 | HR |
| 3 | Charlie | 3 | IT |
| NULL | NULL | 4 | Marketing |
Wie der FULL OUTER JOIN in SQL vereint diese Ausgabe alle Datensätze aus Employees und Departments.
UNION filtert Duplikate automatisch
Im konkreten Fall unseres Beispiels mit den Tabellen Employees und Departments führt das UNION im MySQL-Workaround für einen FULL OUTER JOIN zu keinen Duplikaten. Denn der Operator UNION entfernt doppelte Zeilen automatisch aus seiner Ergebnismenge.
Zur Verdeutlichung schauen wir uns an, wie UNION hier funktioniert:
-
Der erste Teil der Abfrage (der
LEFT JOIN) holt alle Datensätze aus der Tabelle Employees und die passenden Datensätze aus der Tabelle Departments. Dazu gehören Zeilen mit übereinstimmenden id-Werten in beiden Tabellen sowie Zeilen aus Employees ohne Treffer in Departments. -
Der zweite Teil der Abfrage (der
RIGHT JOIN) holt alle Datensätze aus der Tabelle Departments und die passenden Datensätze aus der Tabelle Employees. Dazu gehören Zeilen mit übereinstimmenden id-Werten in beiden Tabellen sowie Zeilen aus Departments ohne Treffer in Employees.
Da UNION Duplikate entfernt, erscheinen die Zeilen mit übereinstimmenden id-Werten (also die, die sowohl im LEFT JOIN- als auch im RIGHT JOIN-Ergebnis auftauchen würden) nur einmal im Endergebnis.
Kurz gesagt: UNION sorgt hier dafür, dass jede eindeutige Kombination aus Employees- und Departments-Daten nur einmal in der Ergebnismenge vorkommt – und bildet so das Verhalten eines FULL OUTER JOIN ohne Duplikate nach.
Übe mit Beekeeper Studio
Ich hoffe, dieses Tutorial zum Full Outer Join in MySQL hat dir geholfen. In kommenden Beiträgen schauen wir uns weitere fortgeschrittene MySQL-Features an, mit noch mehr Codebeispielen und einem tieferen Blick darauf, warum und wie sie funktionieren. Bis dahin: Trainiere weiter deine SQL-Skills, am besten mit Beekeeper Studio.
Beekeeper Studio ist eine kostenlose & quelloffene Datenbank-GUI
Das beste SQL-Abfrage- & Editor-Tool, das ich je benutzt habe. Es bietet alles, was ich zum Verwalten meiner Datenbank brauche. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio ist schnell, intuitiv und einfach zu bedienen. Beekeeper unterstützt jede Menge Datenbanken und läuft hervorragend auf Windows, Mac und Linux.
Was Nutzer über Beekeeper Studio sagen
„Beekeeper Studio hat meinen alten SQL-Workflow komplett ersetzt. Es ist schnell, intuitiv und macht die Arbeit mit Datenbanken wieder zum Vergnügen.“
„Ich habe viele Datenbank-GUIs ausprobiert, aber Beekeeper trifft die perfekte Balance zwischen Funktionsumfang und Einfachheit. Es funktioniert einfach.“