Zurück zur Artikelliste Artikel
8 Leseminuten

Wie man mehrere Tabellen in SQL LEFT JOINen kann

Kannst du in SQL drei Tabellen LEFT JOINen? Ja, natürlich! Du kannst mehrere LEFT JOINs in einer Abfrage verwenden, wenn du sie für deine Analyse brauchst. In diesem Artikel zeige ich dir anhand einiger Beispiele, wie du mehrere Tabellen in SQL LEFT JOINen kannst und wie du dabei einige häufige Fallstricke vermeidest.

Was ist ein LEFT JOIN?

Erinnern wir uns zunächst einmal daran, was ein LEFT JOIN ist und wie man ihn verwendet. Du erinnerst dich vielleicht daran, dass ein INNER JOIN nur die Datensätze zurückgibt, die sich in beiden Tabellen befinden. Im Gegensatz dazu liefert ein LEFT JOIN in SQL alle Datensätze (oder Zeilen) aus der linken Tabelle und nur die übereinstimmenden Datensätze (oder Zeilen) aus der rechten Tabelle. Das heißt, wenn eine bestimmte Zeile in der linken Tabelle vorhanden ist, aber nicht in der rechten, enthält das Ergebnis diese Zeile, aber mit einem NULL-Wert in jeder Spalte der rechten Tabelle. Wenn ein Datensatz aus der rechten Tabelle nicht in der linken Tabelle enthalten ist, wird er auch nicht in das Ergebnis aufgenommen.

Join

Die allgemeine Syntax für einen LEFT JOIN lautet wie folgt:

SELECT Spaltennamen
FROM Tabelle1
LEFT JOIN Tabelle2
  ON Tabelle1.Gemeinsame_Spalte = Tabelle2.Gemeinsame_Spalte;

Wenn du mehr über SQL-Joins wissen willst, schau dir diesen umfassenden Leitfaden an. Wenn du verschiedene Arten von Joins üben möchtest, schau dir unseren interaktiven SQL-JOINs Kurs mit über 90 praktischen Übungen an.

Der LEFT JOIN wird häufig für analytische Aufgaben verwendet. Erstens ist er sehr nützlich, um Datensätze in einer bestimmten Tabelle zu Identifizieren, zu denen es in einer anderen Tabelle keine passenden Datensätze gibt. In diesem Fall kannst du der Abfrage eine WHERE-Klausel hinzufügen, um aus dem Ergebnis der Verknüpfung die Zeilen mit NULL Werten in allen Spalten der zweiten Tabelle auszuwählen. Vergewissere dich jedoch zunächst, dass deine zweite Tabelle keine Datensätze mit NULL Werten in allen Spalten außer dem gemeinsamen Feld enthält, das für den Join verwendet wird. Alternativ kannst du auch eine Spalte aus der zweiten Tabelle verwenden, die keine NULL Werte enthält, falls es eine gibt.

Hier ist ein weiteres Szenario. Stell dir vor, du betreibst einen Online-Buchladen und möchtest die Kunden mit Bestellungen in den letzten 6 Monaten mit den Kunden vergleichen, die im gleichen Zeitraum inaktiv waren. In diesem Fall wollen wir, dass das Ergebnis ALLE Kunden umfasst - sowohl die aktiven als auch die inaktiven -, indem wir die Daten über unsere Kunden mit den Daten über die letzten Verkäufe verknüpfen. Das ist die perfekte Anwendung für einen LEFT JOIN.

Hier sind die Kunden- und Verkauf-Tabellen aus unserem Buchladen.

Kunden

IdVormameNachnameGeschlechtAlterKunde_Seit
1DanielBlackM342014-10-13
2ErikBrownM252015-06-10
3DianaTrumpW392015-10-25
4AnnaYaoW192017-02-20
5ChristianSandersM422018-01-31

Verkaeufe

IdDatumBuch_IdKunde_IdMengeBetrag
12019-09-0223114.99
22019-10-0112112.99
32019-10-0134115.75

Um diese beiden Tabellen zu verbinden und die Informationen zu erhalten, die wir für die Analyse benötigen, verwenden wir die folgende SQL-Abfrage:

SELECT k.Id, k.Vorname, k.Nachname, k.Geschlecht, k.Alter, k.Kunde_Seit,    
       v.Datum AS Verkaufsdatum, sum(v.Betrag) AS Ausgaben_Insgesamt
FROM Kunden k
LEFT JOIN Verkauf v
ON k.Id = v.Kunde_Id
GROUP BY k.Id;

Damit behalten wir alle Datensätze über die Kunden, fügen das Verkaufsdatum hinzu und berechnen den Gesamtbetrag, den sie ausgegeben haben. In der Tabelle unten sind die Zeilen, die bei einem INNER JOIN vorhanden wären, blau hervorgehoben, während das Gelb zusätzliche Datensätze aufgrund des LEFT JOIN kennzeichnet.

IdVornameNachnameGeschlechtAlterKunde_SeitVerkaufsdatumAusgaben_Insgesamt
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-0112.99
3DianaTrumpW392015-10-252019-09-0214.99
4AnnaYaoW192017-02-202019-10-0115.75
5ChristianSandersM422018-01-31[NULL][NULL]

Wie du siehst, haben die Kunden, die in dem betreffenden Zeitraum nicht eingekauft haben, einen NULL Wert für das Verkaufsdatum und den Gesamtbetrag, da von ihnen keine Datensätze in der Verkauf-Tabelle vorhanden sind. So funktioniert ein LEFT JOIN. Vielleicht möchtest du LEFT JOINs und andere Arten von Joins in unserem umfassenden SQL-JOINs Kurs üben oder schau dir unseren SQL-Praxis Kurs mit mehreren SQL-Übungen an, um verschiedene SQL-Konstruktionen zu üben.

Kommen wir nun zu den komplizierteren Fällen!

Mehrere LEFT JOINs in einer Abfrage

Manchmal musst du mehr als zwei Tabellen LEFT JOINen, um die für bestimmte Analysen benötigten Daten zu erhalten. Glücklicherweise kann das Schlüsselwort LEFT JOIN mit mehreren Tabellen in SQL verwendet werden.

Schauen wir uns ein Beispiel an. Wir wollen analysieren, wie sich unsere jüngste Werbekampagne auf das Verhalten unserer Kunden ausgewirkt hat.

Werbeaktionen

IdKampagneKunde_IdDatum
1SMS_discount1022019-09-01
2SMS_discount1032019-09-01
3SMS_discount1052019-09-01

Um dies zu tun, müssen wir die Daten über Kunden-, Verkauf-, und Werbeaktionen-Tabelle verbinden.

SELECT k.Id, k.Vorname, k.Nachname, k.Geschlecht, k.Alter, k.Kunde_Seit, 
   v.Datum AS Verkauf, w.Datum AS Aktion
FROM Kunden k
LEFT JOIN Verkauf v
ON k.Id = v.Kunde_Id
LEFT JOIN Werbeaktionen w
ON k.Id = w.Kunde_Id;

Hier ist das Ergebnis der Verknüpfung:

IdVornameNachnameGeschlechtAlterKunde_SeitVerkaufAktion
1DanielBlackM342014-10-13[NULL][NULL]
2ErikBrownM252015-06-102019-10-012019-09-01
3DianaTrumpW392015-10-252019-09-022019-09-01
4AnnaYaoW192017-02-202019-10-01[NULL]
5ChristianSandersM422018-01-31[NULL]2019-09-01

Wie du siehst, haben wir durch die Verwendung eines LEFT JOIN die Datensätze aller unserer Kunden erhalten, unabhängig von der Kaufhistorie oder der Teilnahme an den Werbeaktionen. Zum Beispiel ist Kunde 1 im Ergebnis der Verknüpfung enthalten, obwohl er weder eingekauft noch eine Werbebotschaft erhalten hat. Wir haben auch Kunde 4, der ein Buch gekauft, aber keine Werbenachricht erhalten hat, sowie Kunde 5, der eine Werbenachricht erhalten, aber nicht eingekauft hat. Schließlich werden auch die Kunden, die eingekauft und Werbenachrichten erhalten haben (Kunden 2 und 3), in das Ergebnis einbezogen.

Beachte, dass wir in diesem Beispiel ein gemeinsames Feld aus der ersten Tabelle verwendet haben, um die zweite und die dritte Tabelle zu verknüpfen. Das ist jedoch nicht immer der Fall. Schauen wir uns einen Fall an, in dem ein gemeinsames Feld aus der zweiten Tabelle zum Left-Join mit der dritten, aber nicht mit der ersten Tabelle verwendet wird.

Wir wollen herausfinden, welche Buchgattungen unsere Kunden am meisten interessieren. Diese Informationen sind sehr wertvoll, denn sie helfen uns, unseren Kunden mit spezifischen Buchempfehlungen ein persönlicheres Erlebnis zu bieten. Für diese Analyse benötigen wir die Daten von Kunden, Verkauf, und Buecher. Die ersten beiden haben wir bereits in unserem ersten Beispiel verknüpft. Dazu verwenden wir die Buecher-Tabelle.

Buecher

IdNameAutorGenreMengePreis
1Der Herr der RingeJ. R. R. TolkienFantasie712.99
2LolitaVladimir NabokovRoman414.99
4Der HobbitJ. R. R. TolkienFantasie1010.75
5Tod auf dem NilAgatha ChristieKrimi89.75

Um die Daten zu erhalten, die wir brauchen, um zu analysieren, welche Bücher und Genres unsere Kunden bevorzugen, verwenden wir die folgende Abfrage:

SELECT k.Id, k.Vorname, k.Nachname, v.Datum AS Verkauf, 
 b.Name AS Buch, b.Genre
FROM Kunden k
LEFT JOIN Verkauf v
ON k.Id = v.Kunde_Id
LEFT JOIN Buecher b
ON v.Buch_Id = b.Id;

Hier ist das Ergebnis der Verknüpfung, bei der die Kundendaten mit den Daten über die kürzlich gekauften Bücher (falls vorhanden) kombiniert werden.

IdVornameNachnameVerkaufBuchGenre
1DanielBlack[NULL][NULL][NULL]
2ErikBrown2019-10-01Der Herr der RingeFantasie
3DianaTrump2019-09-02LolitaRomand
4AnnaYao2019-10-01[NULL][NULL]
5ChristianSanders[NULL][NULL][NULL]

Wir haben zwei Kunden (1 und 5), die nichts gekauft haben und daher keine entsprechenden Datensätze in der Verkauf Tabelle haben. Diese Zeilen werden jedoch durch einen LEFT JOIN beibehalten. Außerdem enthält die Tabelle die Zeile von Kundin 4, die vor kurzem ein Buch gekauft hat, das sich nicht in unserer Datenbank befindet und daher keine Daten aus der Buecher-Tabelle enthält. Das Ergebnis der Verknüpfung enthält diesen Datensatz aufgrund des LEFT JOINs trotzdem.

Wie du siehst, kann der LEFT JOIN in SQL mit mehreren Tabellen verwendet werden. Um sicherzustellen, dass du die erwarteten Ergebnisse erhältst, solltest du jedoch die Probleme beachten, die bei der Verknüpfung von mehr als zwei Tabellen auftreten können.

Zu beachtende Dinge bei mehreren LEFT JOINs

Die Verknüpfung mehrerer Tabellen in SQL kann knifflig sein. Hier sind einige Überlegungen zur Verwendung von LEFT JOINs, insbesondere bei mehreren Tabellen.

Im Gegensatz zum INNER JOIN spielt die Reihenfolge der Tabellen beim LEFT JOIN eine wichtige Rolle, und die Ergebnisse können ganz anders aussehen, wenn sich die Reihenfolge in deiner SQL-Abfrage ändert. Wenn du die Reihenfolge der Tabellen in einem LEFT JOIN festlegst, gilt die allgemeine Regel, dass du mit der Tabelle beginnst, von der du alle Datensätze im Endergebnis behalten willst.

Beachte auch, dass ein LEFT JOIN alle Joins in einer Abfrage kaskadiert. Wenn du einen LEFT JOIN verwendest, sollten oft auch die nachfolgenden Tabellen links gejoint werden. Bei einem INNER JOIN werden Datensätze gelöscht, die nicht auf beiden Seiten des Joins gefunden wurden, und du könntest alle Datensätze verlieren, die du behalten möchtest - der Grund, warum du einen LEFT JOIN anstelle des üblichen INNER JOINs verwendest.

Außerdem sollte ein LEFT JOIN für die dritte Tabelle verwendet werden, wenn die erste Tabelle Datensätze enthält, die in der zweiten Tabelle nicht zu finden sind (was bei LEFT JOINs häufig vorkommt!) und ein anderes gemeinsames Feld für die Verknüpfung der zweiten und dritten Tabelle verwendet wird. Wenn du in dieser Situation einen INNER JOIN verwendest, lässt du alle Datensätze aus der ersten Tabelle fallen, die nicht mit der zweiten und dritten Tabelle übereinstimmen.

Das ist der Fall in unserem obigen Beispiel, in dem wir die Tabellen Kunden, Verkauf und Buecher verbunden haben. Schauen wir uns an, was passiert, wenn wir einen INNER JOIN statt eines LEFT JOIN verwenden, um die Daten aus der Buecher Tabelle zu ermitteln:

SELECT k.Id, k.Vorname, k.Nachname, v.Datum AS Verkauf, 
 b.Name AS Buch, b.Genre
FROM Kunden k
LEFT JOIN Verkauf v
ON k.Id = v.Kunde_Id
INNER JOIN Buecher b
ON s.Buch_Id = b.Id;
IdVornameNachnameVerkaufBuchGenre
2ErikBrown2019-10-01Der Herr der RingeFantasie
3DianaTrump2019-09-02LolitaRoman

Wie du siehst, erhalten wir jetzt nur noch zwei statt fünf Datensätze. Beim INNER JOIN haben wir einen Datensatz verloren, der dem Kauf des Buches entspricht, das nicht in der Buecher Tabelle enthalten ist. Außerdem haben wir die Informationen über die beiden Kunden verloren, die in letzter Zeit nichts gekauft haben - die Datensätze, die wir durch den Left-Join der Verkauf-Tabelle erhalten hatten. Das liegt daran, dass wir die dritte Tabelle über ein gemeinsames Feld mit der zweiten Tabelle verknüpft haben und diese Spalte ist NULL für alle Zeilen aus der ersten Tabelle, die nicht in der zweiten Tabelle enthalten sind. Daher werden diese Datensätze nicht mit der dritten Tabelle abgeglichen und anschließend durch den INNER JOIN im letzten Teil unserer Abfrage gelöscht.

Zeit, mehrere LEFT JOINs zu üben!

Du hast eine Menge über LEFT JOINs gelernt! Du kennst jetzt sogar die Feinheiten der Linksverknüpfung mehrerer Tabellen in einer SQL-Abfrage. Lass uns deine neu erworbenen Fähigkeiten üben:

  • Unser SQL-JOINs Kurs bietet umfassendes Übungsmaterial für verschiedene Arten von Joins, darunter LEFT JOINs, INNER JOINs, Self Joins, Non-Equi Joins und natürlich Joins mehrerer Tabellen in einer Abfrage.
  • Unser SQL-Praxis Kurs bietet mehrere interaktive, praktische SQL-Kurse, in denen du verschiedene SQL-Konstruktionen wie JOINs, GROUP BY, Aggregation und vieles mehr üben kannst.

Danke fürs Lesen und viel Spaß beim Lernen!