Stell dir vor, du hast zwei Tabellen: eine Liste von Studenten und eine Liste ihrer Kursanmeldungen. Nicht alle Studenten sind für Kurse angemeldet, und du willst die komplette Liste aller Studenten sehen, auch die, die aus irgendeinem Grund noch keinen Kurs gewählt haben. Mit INNER JOIN siehst du nur die, die angemeldet sind, aber was ist mit den anderen? Genau dafür gibt es LEFT JOIN.
LEFT JOIN gibt dir alle Zeilen aus der linken Tabelle (die, die im Query zuerst steht) und die passenden Zeilen aus der rechten Tabelle. Wenn es keine passenden gibt, bekommst du für die Spalten der rechten Tabelle NULL-Werte.
Syntax von LEFT JOIN
SELECT
tabelle1.spalte1,
tabelle1.spalte2,
tabelle2.spalte1,
tabelle2.spalte2
FROM
tabelle1 LEFT JOIN tabelle2
ON
tabelle1.gemeinsame_spalte = tabelle2.gemeinsame_spalte;
tabelle1— das ist die "linke" Tabelle.tabelle2— das ist die "rechte" Tabelle.gemeinsame_spalte— die gemeinsame Spalte, nach der gejoint wird.
Beispiel ganz einfach erklärt
Wenn die Tabelle students so aussieht:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
Und die Tabelle enrollments sieht so aus:
| enrollment_id | student_id | course |
|---|---|---|
| 1 | 1 | Mathematik |
| 2 | 1 | Physik |
| 3 | 2 | Biologie |
Dann ergibt der Query:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
folgendes Ergebnis:
| name | course |
|---|---|
| Otto | Mathematik |
| Otto | Physik |
| Anna | Biologie |
| Peter | NULL |
Wie du siehst, sind im Ergebnis alle Studenten enthalten, sogar Peter, der sich noch für keinen Kurs angemeldet hat. Für Peter steht in der Spalte course NULL.
Beispiele für die Verwendung von LEFT JOIN
Beispiel 1: Liste aller Studenten und ihrer Kurse holen
Stell dir vor, du willst die komplette Liste der Studenten zusammen mit den Kursen, für die sie angemeldet sind, falls vorhanden. Wenn ein Student noch keinen Kurs gewählt hat, soll das auch angezeigt werden.
Der gleiche Query:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Ergebnis:
| name | course |
|---|---|
| Otto | Mathematik |
| Otto | Physik |
| Anna | Biologie |
| Peter | NULL |
Das ist ein klassisches Beispiel für LEFT JOIN.
Beispiel 2: Produkte und ihre Verkäufe anzeigen
Angenommen, du hast zwei Tabellen:
Die Tabelle products mit allen Produkten:
| product_id | product_name |
|---|---|
| 1 | Smartphone |
| 2 | Tablet |
| 3 | Laptop |
Die Tabelle sales mit den Verkaufsdaten:
| sale_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
Jetzt willst du alle Produkte und die Anzahl ihrer Verkäufe sehen, auch die Produkte, die noch nicht verkauft wurden.
SELECT
products.product_name,
SUM(sales.quantity) AS total_sold
FROM
products LEFT JOIN sales
ON
products.product_id = sales.product_id
GROUP BY
products.product_name;
Ergebnis:
| product_name | total_sold |
|---|---|
| Smartphone | 8 |
| Tablet | 2 |
| Laptop | NULL |
Besonderheiten und Probleme bei LEFT JOIN
Braucht man immer NULL?
Manchmal bringt LEFT JOIN ein NULL rein, wo du es nicht erwartest. In solchen Fällen kannst du NULL durch einen verständlichen Wert mit der Funktion COALESCE() ersetzen.
SELECT
students.name,
COALESCE(enrollments.course, 'Kurs nicht gewählt') AS course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Ergebnis:
| name | course |
|---|---|
| Otto | Mathematik |
| Otto | Physik |
| Anna | Biologie |
| Peter | Kurs nicht gewählt |
Unnötige Duplikate
Wenn die Daten in der rechten Tabelle doppelte Einträge haben, bekommst du im Ergebnis mehr Zeilen als erwartet. Schau dir deine Daten genau an und benutze DISTINCT, wenn du keine Duplikate willst.
GO TO FULL VERSION