MySQL - Joins - Left/Right Join
1. Der feine Unterschied
Während ein INNER JOIN immer ein genaues Kreuzprodukt ergibt, so verhält es sich in diesem Fall ein wenig anders. Dazu schauen
wir uns mal die folgenden Tabellen an:
Tabelle 'hersteller' Tabelle 'produkt'
+----+--------------+ +----+--------------+--------+
| id | zulieferer | | id | produkt |hs_link |
+----+--------------+ +----+--------------+--------+
| 1 | Hilti | | 1 | Schlagbohrer | 1 |
| 2 | Hoch & Tief | | 2 | Zement | 2 |
| 3 | Eisen-Karl | | 3 | Kneifzange | 3 |
| 4 | Stahl AG | | 4 | Brecheisen | 3 |
| 5 | Gähn & Söhne | | 5 | Hammer | 4 |
+----+--------------+ +----+--------------+--------+
Die Verknüpfung erfolgt über die Spalte hs_link in der Tabelle produkt wo wir die IDs aus der Tabelle
hersteller abspeichern. Wie das geübte Auge sofort erkennt, gibt es einen Hersteller, für den offenbar kein Produkt existiert.
Wenn wir jetzt alle(!) Hersteller inklusive ihrer Machwerke auflisten wollen, so gibt es zwei Möglichkeiten.
2. LEFT JOIN
SELECT
h.zulieferer,
p.produkt
FROM
hersteller h
LEFT JOIN
produkt p ON (h.id = p.hs_link);
Erläuterung
Bei einem LEFT JOIN werden alle Datensätze der "Haupttabelle" hersteller mit denen der Tabelle
produkt "links herum" (LEFT JOIN) verknüpft. Das bedeutet, dass alle Datensätze der "linken" Tabelle auf
jeden Fall angezeigt werden. Gibt es in der "rechten" Tabelle keine entsprechende Relation, so wird der fehlende Teil der Spalte
produkt einfach mit einer NULL aufgefüllt. Und das Ergebnis sieht so aus.
+--------------+--------------+
| zulieferer | produkt |
+--------------+--------------+
| Hilti | Schlagbohrer |
| Hoch & Tief | Zement |
| Eisen-Karl | Kneifzange |
| Eisen-Karl | Brecheisen |
| Stahl AG | Hammer |
| Gähn & Söhne | NULL |
+--------------+--------------+
3. RIGHT JOIN
SELECT
h.zulieferer,
p.produkt
FROM
produkt p
RIGHT JOIN
hersteller h ON (h.id = p.hs_link);
Erläuterung
Hier läuft es eigentlich nur anders herum. Hier wird die "Haupttabelle" produkt "rechts herum" mit der Tabelle
hersteller verbunden. Hier werden also alle Datensätze der rechten Tabelle angezeigt und fehlende der linken mit
NULL ausgefüllt.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt