OUTER JOIN
Der LEFT OUTER JOIN
Der RIGHT OUTER JOIN
Mit den OUTER JOINS bekommt man zunächst alle Zeilen die auch ein INNER JOIN liefern würde, erhält dann aber zusätzlich ALLE Zeilen aus der linken oder rechten Tabelle.
Mit linker Tabelle ist die erstgenannte Tabelle gemeint:
SELECT ... FROM tabelle_links
...
Mit rechter Tabelle ist die zweitgenannte Tabelle gemeint:
SELECT ... FROM tabelle_links
LEFT | INNER | RIGHT JOIN tabelle_rechts
...
Syntax von LEFT OUTER JOIN
SELECT ... FROM tabelle_l
LEFT OUTER JOIN tabelle_r ON <Bedingung>;
Das Wort OUTER
ist optional und kann auch weggelassen werden:
SELECT ... FROM tabelle_l
LEFT JOIN tabelle_r ON <Bedingung>;
Wofür braucht man das?
Wir haben beim INNER JOIN gesehen, dass die rot markierten Datensätze nicht in der Ergebnistabelle auftauchen, sie hatten keinen JOIN-Partner in der anderen Tabelle:
SELECT *
FROM Mitarbeiter m
INNER JOIN Abteilung a
ON m.abteilung = a.id;
Manchmal will man an genau diese Datensätze ran, da alleine die Existenz (oder nicht-Existenz) dieser Datensätze schon Informationen enthält.
Mit einem LEFT [OUTER] JOIN kann man rausfinden, welche Datensätze aus der linken Tabelle kein Match in der rechten Tabelle haben. Damit kann man z.B. Fragen beantworten wie:
-
Welche Kunden haben noch keine Bestellung aufgegeben?
-
Welcher Film wurde noch nie ausgeliehen?
-
Welche Mitarbeiter betreuen keine Kunden?
Anwenden
Wir wollen jetzt rausfinden, welche Mitarbeiter noch keiner Abteilung zugewiesen sind. Dafür nehmen wir den INNER JOIN Query und ersetzen INNER durch LEFT OUTER:
SELECT *
FROM Mitarbeiter m
LEFT OUTER JOIN Abteilung a
ON m.abteilung = a.id;
Wir bekommen die gleichen Ergebniszeilen wie mit dem INNER JOIN, bekommen zusätzlich aber noch die restlichen Zeilen aus Tabelle 1. Dort wo die Daten aus Tabelle 2 kommen würden, wird mit NULL aufgefüllt.
Diese NULL - Werte kann man sich zunutze machen. Wir filtern jetzt nach den Zeilen, in denen die Spalte Abteilung.id den Wert NULL hat:
SELECT *
FROM Mitarbeiter
LEFT OUTER JOIN Abteilung
ON Mitarbeiter.abteilung = Abteilung.id
WHERE Abteilung.id IS NULL;
Beachten Sie, dass zum Testen auf NULL IS NULL
oder IS NOT NULL
verwendet werden muss, anstatt einen Vergleichoperator zu verwenden (Abteilung.id = NULL).
https://www.w3schools.com/sql/sql_null_values.asp