Direkt zum Hauptinhalt springen
eLearner.app
Modul 3 · Lektion 2 von 410/57 im Kurs~10 min
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

SQL
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.

SQL
-- 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:

SQL
-- 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

Übung#sql.m3.l2.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#sql.m3.l2.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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