Lektionen des Moduls (2/4)
Alles auf der linken Seite behalten: LEFT JOIN
Der INNER JOIN aus der vorherigen Lektion hat einen wichtigen Nebeneffekt: ihn
löscht Zeilen, die keine Übereinstimmung haben. Wenn ein Mitarbeiter keine Abteilung hat
(department_id ist NULL), sie verschwinden aus dem Ergebnis.
Manchmal ist es das, was man will. Oft ist es das aber nicht: in einem HR-Bericht
Es ist wichtig, alle Mitarbeiter zu sehen, auch diejenigen ohne Abteilung.
und wissen, wer sie sind. Dafür ist LEFT JOIN da (vollständig LEFT OUTER JOIN).
Wie es funktioniert
SELECT columns
FROM table_a
LEFT JOIN table_b ON table_a.x = table_b.y;Lesen Sie auf Englisch: "Behalten Sie alle Zeilen von table_a bei; versuchen Sie es für jede einzelne
Hängen Sie eine Zeile von table_b an. Wenn es keine Übereinstimmung gibt, füllen Sie die Spalten aus
table_b mit NULL".
Das Schlüsselwort ist LEFT: Es bedeutet „linke Tabelle“, also die geschriebene
nach FROM. Alle seine Reihen bleiben für immer erhalten.
-- All employees, including those without a department:
SELECT e.first_name,
e.last_name,
d.name AS dipartimento
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;In unserem Datensatz gibt diese Abfrage 10 Zeilen zurück (jeweils ein Mitarbeiter). Andrea
Costa, der department_id = NULL hat, erscheint mit dipartimento = NULL
statt zu verschwinden.
Suche nach den „Keine Übereinstimmung“-Zeilen
Eine sehr nützliche Konsequenz: durch Filtern mit IS NULL auf eine Spalte der
In der rechten Tabelle finden Sie genau die Zeilen ohne Übereinstimmung:
-- Orphan employees: no department assigned
SELECT e.first_name, e.last_name
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id
WHERE d.id IS NULL;Dieser Trick wird in der realen Welt ständig angewendet: „Finde mir Bestellungen mit Nr.“ Kunde", "Produkte ohne Bewertungen", "Benutzer, die sich noch nie angemeldet haben in".
Probieren Sie es aus
Geben Sie den Vornamen (first_name) und den Nachnamen (last_name) von Mitarbeitern zurück, denen KEINE Abteilung zugewiesen ist. Eine oder mehrere Zeilen, zwei Spalten.
Hinweis anzeigen
Vervollständigen Sie das WHERE mit d.id IS NULL – Sie möchten die Zeilen, in denen der LEFT JOIN keine passende Abteilung gefunden hat.
Lösung nach 3 Versuchen verfügbar
Wiederholungsübung
Listen Sie alle Abteilungen auf (departments.name) und daneben die Anzahl der Mitarbeiter, einschließlich der Abteilungen ohne Mitarbeiter (zeigen Sie für diese 0 an). Hinweis: Beginnen Sie mit den Abteilungen und führen Sie einen LEFT JOIN mit den Mitarbeitern durch, dann GROUP BY + COUNT.
Hinweis anzeigen
Verwenden Sie COUNT(e.id) (nicht COUNT(*)), um 0 zu zählen, wenn es keine Übereinstimmung gibt: COUNT(*) würde 1 zählen, da die LEFT JOIN-Zeile NULL enthält.
Lösung nach 3 Versuchen verfügbar