Äußerer Join: OUTER JOIN
Es gibt drei Arten des äußeren Joins: links (LEFT), rechts (RIGHT) und vollständig (FULL). Standardmäßig ist er vollständig.
Der Hauptunterschied zum inneren Join: Der äußere Join liefert immer alle Zeilen einer (LEFT, RIGHT) oder beider Tabellen (FULL).
Linker äußerer Join (LEFT OUTER JOIN)
Ein Join, der alle Werte aus der linken Tabelle liefert, kombiniert mit den passenden Werten aus der rechten Tabelle, sofern sie die Join-Bedingung erfüllen, oder andernfalls mit NULL aufgefüllt.
Als Beispiel holen wir aus der Datenbank den Klingelplan, verknüpft mit den passenden Einträgen aus dem Stundenplan.
Daten in der Tabelle Timepair (Klingelplan):
Daten in der Tabelle Schedule (Stundenplan):
MySQL 8.1SELECT Timepair.id "timepair.id", start_pair, end_pair, Schedule.id "schedule.id", date, class, number_pair, teacher, subject, classroom FROM Timepair LEFT JOIN Schedule ON Schedule.number_pair = Timepair.id;
In die Ergebnismenge gelangen alle Zeilen der linken Tabelle, ergänzt um die Daten der Stundenplan-Einträge. Auffällig ist, dass am Ende der Tabelle Zeilen stehen, deren Felder mit NULL gefüllt sind. Das sind die Zeilen, für die keine passenden Stundenplaneinträge gefunden wurden — da sie aber in der linken Tabelle stehen, werden sie trotzdem ausgegeben.
Rechter äußerer Join (RIGHT OUTER JOIN)
Ein Join, der alle Werte aus der rechten Tabelle liefert, kombiniert mit den passenden Werten aus der linken Tabelle, sofern sie die Join-Bedingung erfüllen, oder andernfalls mit NULL aufgefüllt.
Vollständiger äußerer Join (FULL OUTER JOIN)
Ein Join, der einen inneren Join zwischen den Datensätzen ausführt und das Ergebnis um einen linken und einen rechten äußeren Join ergänzt.
So läuft der vollständige Join intern ab:
- Es wird eine Tabelle auf Basis des inneren Joins (INNER JOIN) gebildet.
- Es werden die Zeilen der linken Tabelle ergänzt, die im Ergebnis fehlen (LEFT OUTER JOIN).
- Es werden die Zeilen der rechten Tabelle ergänzt, die im Ergebnis fehlen (RIGHT OUTER JOIN).
Vollständigen Join in MySQL emulieren
Da MySQL FULL OUTER JOIN nicht unterstützt, kannst du ihn mit UNION ALL nachbauen:
MySQL 8.1SELECT * FROM linke_tabelle LEFT JOIN rechte_tabelle ON rechte_tabelle.key = linke_tabelle.key UNION ALL SELECT * FROM linke_tabelle RIGHT JOIN rechte_tabelle ON rechte_tabelle.key = linke_tabelle.key WHERE linke_tabelle.key IS NULL