Zurück zur Artikelliste Artikel
21 Leseminuten

9 praktische Beispiele für SQL LEFT JOIN

LEFT JOIN ist eine der häufigsten SQL-Varianten JOINs. Vergewissern Sie sich, dass Sie alle Einzelheiten kennen, indem Sie alle neun Beispiele aus der Praxis durchgehen. LEFT JOIN Beispiele durch.

LEFT JOIN - neben INNER JOIN - ist eines der wichtigsten SQL-Werkzeuge, die Sie für die Arbeit mit Daten aus zwei oder mehr Tabellen benötigen. Aber wie und wann sollten Sie es verwenden? Diese neun Beispiele auf LEFT JOIN zeigen Ihnen den Weg.

Hören Sie zum ersten Mal von JOIN? Dann haben wir für Sie einen umfassenden SQL-JOINs Kurs vorbereitet. Sie lernen von Grund auf alle SQL JOIN Typen kennen, verschiedene Möglichkeiten, zwei oder mehr Tabellen zu verbinden, und wann Sie welche Art von JOIN verwenden sollten. Sie lernen sogar, wie Sie eine Tabelle selbst verbinden und wie Sie Nicht-Equi Joins verwenden. Am Ende des Kurses werden Sie 99 interaktive Aufgaben gelöst haben.

Die SQL LEFT JOIN-Grundlagen

LEFT JOIN ist eine von mehreren Arten von SQL JOIN. Der Zweck von JOINist es, die Daten aus zwei oder mehr Tabellen zu erhalten. LEFT JOIN erreicht dieses Ziel, indem es alle Daten aus der ersten (linken) Tabelle und nur die übereinstimmenden Zeilen aus der zweiten (rechten) Tabelle zurückgibt. Die nicht übereinstimmenden Werte aus der rechten Tabelle werden als NULL angezeigt.

Was ist der Unterschied zu anderen JOIN? Hier ist ein kurzer Überblick, aber für ein noch besseres Verständnis sehen Sie sich diese SQL JOIN-Beispiele an.

  • (INNER) JOIN - Gibt nur die übereinstimmenden Zeilen aus den verbundenen Tabellen zurück. Hier finden Sie einen Artikel, in dem Sie mehr über INNER JOIN erfahren.
  • RIGHT (OUTER) JOIN - Gibt alle Daten aus der rechten Tabelle und nur die übereinstimmenden Zeilen aus der linken Tabelle zurück. Die Werte der nicht übereinstimmenden Zeilen sind NULL.
  • FULL (OUTER) JOIN - Gibt alle Zeilen aus den beiden verbundenen Tabellen zurück. Wenn es nicht übereinstimmende Zeilen zwischen den Tabellen gibt, werden sie als NULL angezeigt. Sie können mehr darüber in unserem Artikel über FULL JOIN erfahren.
  • CROSS JOIN - Gibt alle Kombinationen aller Zeilen aus den verbundenen Tabellen zurück, d. h. ein kartesisches Produkt. Weitere Informationen finden Sie in diesem Artikel über CROSS JOIN.

Die Wörter in Klammern in den obigen JOIN Namen sind nicht obligatorisch; SQL akzeptiert sowohl vollständige als auch kurze Versionen.

Das bedeutet, dass LEFT JOIN dasselbe ist wie LEFT OUTER JOIN. Also, ja, LEFT JOIN ist eine äußere Art der Verknüpfung, zusammen mit RIGHT JOIN und FULL JOIN.

Als SQL-Benutzer schreiben wir normalerweise nur LEFT JOIN. Der Grund dafür? Es ist kürzer, und wir sind faul.

Mehr dazu erfahren Sie in dem Artikel, der erklärt, wie LEFT JOIN funktioniert.

SQL LEFT JOIN-Syntax

Die Syntax von LEFT JOIN lautet wie folgt.

SELECT …
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;

Die beiden wichtigsten Punkte sind das Schlüsselwort LEFT JOIN und die Verknüpfungsklausel ON. Die erste verbundene Tabelle wird in der FROM Klausel referenziert, dann wird LEFT JOIN hinzugefügt, gefolgt von der zweiten Tabelle, die verbunden werden soll.

Die Tabellen werden anhand übereinstimmender Spaltenwerte verbunden; Sie verweisen auf diese Spalten in der ON -Klausel und setzen ein Gleichheitszeichen zwischen sie. Dadurch werden die Tabellen verbunden, bei denen die Spalte der einen Tabelle gleich der Spalte der zweiten Tabelle ist. Dies ist die gebräuchlichste Art von LEFT JOIN. Sie wird wegen des Gleichheitszeichens als equi-join bezeichnet. Es können auch andere Vergleichsoperatoren verwendet werden; diese sind die Nicht-Gleichheits-Joins und liegen außerhalb des Rahmens dieses Artikels.

All dies wird auch in unserem SQL JOIN Cheat Sheet erklärt. Halten Sie es bei den folgenden Beispielen in der Nähe; es wird Ihnen helfen, sie besser zu verstehen.

LEFT JOIN Beispiele

Ich möchte Ihnen nun einige praktische Beispiele für die Verwendung von LEFT JOIN zeigen. Ich beginne mit einem einfachen, unkomplizierten Beispiel, um Ihnen zu zeigen, wie LEFT JOIN mit echten Daten funktioniert.

Beispiel 1: Einfacher LEFT JOIN

Ich werde mit zwei Tabellen arbeiten. Die erste ist companyin der eine Liste von Elektronikfirmen gespeichert ist. Verwenden Sie dieses Script, um die Tabelle zu erstellen.

idcompany_name
1Lenovo
2Apple
3Samsung
4Huawei
5Fairphone

Die zweite Tabelle ist die product Tabelle. Das Skript zum Erstellen der Tabelle finden Sie hier.

idproduct_namecompany_id
1Fairphone 45
2Galaxy S24 Ultra3
3Galaxy Z Flip53
4iPhone 15 Pro2
5Fairbuds XL5
6MacBook Pro 16' M3 Pro2
7iPad Air 10.9' M12
8Galaxy Tab S9 FE+3

Schauen wir uns die beiden Tabellen unter LEFT JOIN an und sehen, was passiert:

SELECT company_name,
	 product_name
FROM company
LEFT JOIN product
ON company.id = product.company_id
ORDER BY company_name;

Ich wähle das Unternehmen und den Produktnamen aus. Dies sind die Spalten aus zwei Tabellen. Ich muss also die Tabellen verbinden, um diese Spalten in der Ausgabe zu erhalten.

Die linke Tabelle ist companyund ich referenziere sie in FROM. Dann füge ich die LEFT JOIN und die zweite Tabelle hinzu, die lautet product.

In der ON Klausel gebe ich die Spalten an, über die die Tabellen verknüpft werden sollen. In diesem Fall ist es die Spalte id aus der ersten und die Spalte company_id aus der zweiten Tabelle.

Ich habe ORDER BY verwendet, um die Ausgabe besser lesbar zu machen. (Sie brauchen ORDER BY nicht, damit die Verknüpfung funktioniert.)

Apropos Ausgabe, hier ist sie.

company_nameproduct_name
AppleiPhone 15 Pro
AppleiPad Air 10.9' M1
AppleMacBook Pro 16' M3 Pro
FairphoneFairphone 4
FairphoneFairbuds XL
HuaweiNULL
LenovoNULL
SamsungGalaxy Z Flip5
SamsungGalaxy S24 Ultra
SamsungGalaxy Tab S9 FE+

Die Ausgabe zeigt eine Liste aller Unternehmen, was mit der LEFT JOIN übereinstimmt, die alle Daten aus der linken Tabelle anzeigt.

Wenn ein Unternehmen mehrere Produkte hat, werden alle diese Produkte aufgelistet und der Name des Unternehmens wird dupliziert. Wenn es keine Produkte des Unternehmens gibt (Huawei und Lenovo), lautet der Wert der Spalte product_name NULL .

Beispiel 2: Ein LEFT JOIN-Beispiel aus der Praxis

Schauen wir uns nun ein gängiges Szenario an. In diesem Beispiel möchten Sie alle Abteilungen und ihre Mitarbeiter auflisten, aber auch die Abteilungen ohne Mitarbeiter anzeigen, falls es solche gibt.

Um dies zu erreichen, benötigen Sie LEFT JOIN.

Hier ist die Tabelle department und ihr Skript. Es ist eine Liste von Abteilungen.

iddepartment_name
1Sales
2Accounting
3IT
4HR
5Operations

Die zweite Tabelle ist employee, die eine Liste der Mitarbeiter ist. Hier ist das Skript.

idfirst_namelast_namedepartment_id
1BobEstevez3
2FrancescaGotze2
3FrankGordon2
4MilicentJohnson3
5HansHandkeNULL
6KatieKeaton1
7LucaDi FrancescoNULL
8ZoeJong1
9PatrickRose2
10BillieThompsonNULL

Die Werte von NULL bedeuten, dass diesem Mitarbeiter noch keine Abteilung zugewiesen wurde.

Um die Abteilungen und ihre Mitarbeiter - sowie die Abteilungen ohne Mitarbeiter - anzuzeigen, wird folgender Code verwendet:

SELECT department.id AS department_id,
	 department_name,
	 employee.id AS employee_id,
       first_name,
       last_name	   
FROM department
LEFT JOIN employee
ON department.id = employee.department_id
ORDER BY department_id, employee_id;

Ich wähle die ID aus der Tabelle department und benenne sie in department_id um. Die zweite ausgewählte Spalte aus derselben Tabelle ist department_name. Die ausgewählten Daten aus der employee Tabelle sind id (umbenannt in employee_id) und die Namen der Mitarbeiter. Diese Umbenennung der Spalten dient nur dazu, die Ausgabe leichter lesbar zu machen.

Jetzt kann ich auf die Tabelle department in FROM und LEFT JOIN mit der Tabelle employee. Die Tabellen werden verbunden, wenn die Abteilungs-IDs gleich sind.

Schließlich sortiere ich die Ausgabe nach der Abteilung und dann nach der Mitarbeiter-ID, um sie besser lesbar zu machen. Hier ist das Ergebnis:

department_iddepartment_nameemployee_idfirst_namelast_name
1Sales6KatieKeaton
1Sales8ZoeJong
2Accounting2FrancescaGotze
2Accounting3FrankGordon
2Accounting9PatrickRose
3IT1BobEstevez
3IT4MilicentJohnson
4HRNULLNULLNULL
5OperationsNULLNULLNULL

Die Ausgabe zeigt alle Abteilungen und ihre Mitarbeiter. Es werden auch zwei Abteilungen angezeigt, die keine Mitarbeiter haben: HR und Operations. Es könnte sein, dass die Datenbank noch nicht aktualisiert wurde und die neuen Mitarbeiter noch nicht der Abteilung zugeordnet sind.

Beispiel 3: Ein weiteres LEFT JOIN-Beispiel aus der Praxis

Ein weiteres typisches Beispiel für LEFT JOIN ist, wenn Sie alle Kunden und ihre Bestellungen finden möchten - aber auch die Kunden, die noch keine Bestellungen aufgegeben haben.

Für dieses Beispiel werde ich den folgenden Datensatz verwenden. Die erste Tabelle ist customerdie eine einfache Liste von Kunden ist. Hier ist das Skript.

idfirst_namelast_name
1FlorentinusGlöckner
2EmanAdcock
3ErikNyman
4LeebaKubo
5LiasVámos
6LavanyaNikolaev
7RishiPetit
8ChristieFodor
9AndrisLončar
10JulianaHarlan

Die zweite Tabelle im Dataset ist orders. Sie können sie mit diesem Skript selbst erstellen.

So schreibe ich den Code, um das gewünschte Ergebnis zu erzielen:

SELECT customer.first_name, 
       customer.last_name,
	 orders.id AS order_id,
	 orders.order_date
FROM customer
LEFT JOIN orders
ON customer.id = orders.customer_id;

Ich wähle die Namen der Kunden aus der Tabelle customer. Die Informationen über die Bestellungen stammen logischerweise aus der Tabelle orders.

Die linke Tabelle ist customerund ich möchte alle ihre Zeilen. Ich LEFT JOIN es mit der Tabelle orders über die Kunden-ID.

Die Ausgabe sieht wie folgt aus:

first_namelast_nameorder_idorder_date
LiasVámos12024-01-01
EmanAdcock22024-01-08
ChristieFodor32024-01-08
AndrisLončar42024-01-12
LiasVámos52024-01-18
LavanyaNikolaev62024-01-22
JulianaHarlanNULLNULL
LeebaKuboNULLNULL
FlorentinusGlöcknerNULLNULL
ErikNymanNULLNULL
RishiPetitNULLNULL

Sie können sehen, dass alle Kunden und ihre Bestellungen angezeigt werden. Wo der Kunde keine Bestellungen hat, gibt es NULL.

Wenn Sie mehr üben möchten, sehen Sie sich diesen Artikel an, in dem vier weitere LEFT JOIN-Beispiele gezeigt werden .

Beispiel 4: LEFT JOIN mit 3 Tabellen

In diesem LEFT JOIN Beispiel zeige ich Ihnen, wie Sie drei Tabellen miteinander verknüpfen können.

Werfen wir zunächst einen Blick auf den Datensatz.

Die erste Tabelle ist writermit dem Skript hier. Es ist einfach eine Liste von Autoren.

idfirst_namelast_name
1BernardineEvaristo
2AlbertCamus
3GeorgeOrwell
4ÉmileZola
5MilanKundera
6CharlesDickens
7BohumilHrabal
8WitoldGombrowicz

Die zweite Tabelle ist Übersetzer. Es ist eine Liste von Buchübersetzern. Das Skript zur Erstellung dieser Tabelle finden Sie hier.

idfirst_namelast_name
1JenniferCroft
2PeterConstantine
3EwaldOsers

Die letzte Tabelle ist " Buch", die Informationen über die einzelnen Bücher enthält. Hier ist das Skript.

idbook_titlepublication_yearwriter_idtranslator_id
1The Plague200823
2Cosmos201581
3Manifesto: On Never Giving Up20211NULL
4Girl, Woman, Other20191NULL
5The Stranger202223
6Germinal201243
7198420203NULL

Wenn der Wert in der Spalte translator_id NULL ist, handelt es sich bei diesem Buch nicht um eine Übersetzung.

In diesem Beispiel möchte ich alle Autoren anzeigen, unabhängig davon, ob sie ein Buch haben oder nicht. Ich möchte auch die Informationen über den Übersetzer des Buches anzeigen.

So sollte der Code aussehen:

SELECT writer.first_name AS writer_first_name,
	 writer.last_name AS writer_last_name,
	 book_title,
	 translator.first_name AS translator_first_name,
	 translator.last_name AS translator_last_name
FROM writer
LEFT JOIN book
ON writer.id = book.writer_id
LEFT JOIN translator
ON book.translator_id = translator.id;

Ich wähle die Namen der Autoren, die Titel ihrer Bücher und die Namen der Übersetzer aus. Um alle diese Daten zu erhalten, muss ich alle drei Tabellen verbinden.

Die Verknüpfung von drei (oder mehr) Tabellen wird in Form einer Kette durchgeführt. Nachdem Sie die ersten beiden Tabellen verknüpft haben, fügen Sie eine weitere Verknüpfung hinzu, verweisen auf die dritte Tabelle und geben die Verknüpfungsbedingung in der zweiten ON -Klausel an.

Zunächst verweise ich auf die Tabelle writerund LEFT JOIN mit der Tabelle book auf dem Writer ID.

Dann füge ich die zweite LEFT JOIN hinzu. Ich verwende sie, um die zweite Tabelle (book) mit der Tabelle translator über die Übersetzer-ID.

Warum sind diese LEFT JOINdas Ergebnis der Beziehung zwischen den Tabellen? Die erste LEFT JOIN ist da, weil es Autoren ohne Buch geben kann. Dies gilt jedoch auch für die Beziehung zwischen den Tabellen book und translator: ein Buch kann eine Übersetzung sein oder auch nicht, also kann es einen entsprechenden Übersetzer haben oder auch nicht. Sie müssen also auch die LEFT JOIN dazwischen verwenden, weil Sie die Bücher unabhängig davon anzeigen wollen, ob es sich um Übersetzungen handelt oder nicht.

Hier ist die Codeausgabe:

writer_first_namewriter_last_namebook_titletranslator_first_nametranslator_last_name
AlbertCamusThe PlagueEwaldOsers
WitoldGombrowiczCosmosJenniferCroft
BernardineEvaristoManifesto: On Never Giving UpNULLNULL
BernardineEvaristoGirl, Woman, OtherNULLNULL
AlbertCamusThe StrangerEwaldOsers
ÉmileZolaGerminalEwaldOsers
GeorgeOrwell1984NULLNULL
MilanKunderaNULLNULLNULL
CharlesDickensNULLNULLNULL
BohumilHrabalNULLNULLNULL

Wie Sie sehen können, werden die Bücher von Bernardine Evaristo angezeigt, obwohl sie keine Übersetzungen sind. Das liegt daran, dass ich LEFT JOIN als zweiten Join verwendet habe.

Außerdem werden Milan Kundera, Charles Dickens und Bohumil Hrabal angezeigt, obwohl sie keine Bücher und somit auch keine Übersetzer haben.

Beispiel 5: "Erzwungener" LEFT JOIN mit drei Tabellen

Normalerweise ergibt sich die Wahl von LEFT JOIN aus der Art der Tabellenbeziehungen. Manchmal sind wir jedoch "gezwungen", die LEFT JOIN zu verwenden. Sie werden bald sehen, was ich meine.

Die erste Tabelle im Datensatz ist eine Liste von Direktoren mit dem Namen director. Hier ist das Skript.

idfirst_namelast_name
1StanleyKubrick
2CélineSciamma
3WoodyAllen
4LynneRamsay
5KrzysztofKieślowski

Als nächstes folgt die Tabelle streaming_platformdie eine Liste der verfügbaren Streaming-Plattformen enthält. Sie können die Tabelle mit diesem Skript erstellen.

idplatform_name
1Netflix
2HBO
3Hulu
4Mubi
5Apple TV

Die dritte Tabelle ist streaming_catalogue. Sie enthält Informationen über Filme und ist über director_id und streaming_platform_id mit den ersten beiden Tabellen verknüpft. Hier ist das Skript zum Erstellen der Tabelle.

idmovie_titlerelease_yeardirector_idstreaming_platform_idstarted_showingended_showing
1Three Colours: Blue1993542023-02-282023-09-30
2Three Colours: White1994542023-02-282023-09-30
3Three Colours: Red1994542023-02-282023-09-30
4Manhattan Murder Mystery1993312023-08-15NULL
5Portrait of a Lady on Fire2019212023-01-012023-09-28
6Three Colours: Blue1993522024-01-15NULL
7Three Colours: White1994522024-01-15NULL
8Three Colours: Red1994522024-01-15NULL
9Tomboy2011212020-04-012021-04-01
10Vicky Cristina Barcelona2008312023-10-01NULL

Die Werte NULL in der Spalte ended_showing bedeuten, dass der Film noch auf der Plattform gezeigt wird.

Ich möchte alle Regisseure, ihre Filme und die Streaming-Plattformen anzeigen, die ihre Filme zeigen (oder gezeigt haben). Außerdem möchte ich die Regisseure anzeigen, deren Filme nicht gestreamt werden.

Die Beziehung zwischen den Tabellen ist, dass jeder Film einen Regisseur haben muss, aber nicht umgekehrt. Außerdem muss jeder Film im Katalog eine Streaming-Plattform haben, aber nicht jede Streaming-Plattform muss im Katalog enthalten sein.

Ich beginne mit dem Schreiben des Codes, indem ich die Namen der Regisseure, die Filmtitel, die Namen der Plattformen und das Datum des Beginns und des Endes der Vorstellung auswähle.

Aus den vorangegangenen Beispielen wissen Sie, dass eine Verknüpfung der Tabelle director mit der Tabelle streaming_catalogue über die Spalte mit der ID des Regisseurs verknüpft wird. Dies tue ich, um sicherzustellen, dass auch die Regisseure angezeigt werden, die keine Filme im Katalog haben.

Jetzt füge ich die zweite LEFT JOIN hinzu, um die streaming_catalogue Tabelle mit der streaming_platform Tabelle über die Plattform-ID zu verbinden.

SELECT first_name AS director_first_name,
	 last_name AS director_last_name,
	 movie_title,
	 platform_name,
	 started_showing, 
	 ended_showing
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
LEFT JOIN streaming_platform
ON streaming_catalogue.streaming_platform_id = streaming_platform.id;

Die Abfrage gibt diese Ausgabe zurück:

director_first_namedirector_last_namemovie_titleplatform_namestarted_showingended_showing
KrzysztofKieślowskiThree Colours: BlueMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: WhiteMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: RedMubi2023-02-282023-09-30
WoodyAllenManhattan Murder MysteryNetflix2023-08-15NULL
CélineSciammaPortrait of a Lady on FireNetflix2023-01-012023-09-28
KrzysztofKieślowskiThree Colours: BlueHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: WhiteHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: RedHBO2024-01-15NULL
CélineSciammaTomboyNetflix2020-04-012021-04-01
WoodyAllenVicky Cristina BarcelonaNetflix2023-10-01NULL
LynneRamsayNULLNULLNULLNULL
StanleyKubrickNULLNULLNULLNULL

Die Ausgabe zeigt alle Regisseure, ihre Filme und die Plattformen, auf denen sie gezeigt werden oder wurden.

Die Filme mit allen Daten außer NULL in den ended_showing Spalten können immer noch auf einer bestimmten Plattform gesehen werden.

Obwohl es keine Filme im Katalog gibt, sind Lynne Ramsay und Stanley Kubrick ebenfalls aufgeführt. Dies ist daran zu erkennen, dass ihre Namen, aber keine anderen Daten vorhanden sind.

Ich konnte sie finden, weil ich zwei LEFT JOINs verwendet habe. Die erste LEFT JOIN ist nicht fragwürdig; ich musste sie verwenden, falls es Regisseure ohne Filme gibt. Es stellte sich heraus, dass es sie gibt.

Aber was ist mit dem zweiten LEFT JOIN? Ich war gewissermaßen gezwungen, sie zu verwenden, um all die Regisseure ohne Filme zu behalten und das gewünschte Ergebnis zu erhalten. Warum "gezwungen"? Nun, lassen Sie uns INNER JOIN anstelle des zweiten LEFT JOIN verwenden, und Sie werden sehen.

SELECT first_name AS director_first_name,
	 last_name AS director_last_name,
	 movie_title,
	 platform_name,
	 started_showing, 
	 ended_showing
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
JOIN streaming_platform
ON streaming_catalogue.streaming_platform_id = streaming_platform.id;

In der Ausgabe fehlen jetzt Lynne Ramsay und Stanley Kubrick!

director_first_namedirector_last_namemovie_titleplatform_namestarted_showingended_showing
KrzysztofKieślowskiThree Colours: BlueMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: WhiteMubi2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: RedMubi2023-02-282023-09-30
WoodyAllenManhattan Murder MysteryNetflix2023-08-15NULL
CélineSciammaPortrait of a Lady on FireNetflix2023-01-012023-09-28
KrzysztofKieślowskiThree Colours: BlueHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: WhiteHBO2024-01-15NULL
KrzysztofKieślowskiThree Colours: RedHBO2024-01-15NULL
CélineSciammaTomboyNetflix2020-04-012021-04-01
WoodyAllenVicky Cristina BarcelonaNetflix2023-10-01NULL

Warum ist das so? Weil INNER JOIN nur die übereinstimmenden Zeilen aus den verbundenen Tabellen zurückgibt. Mit der ersten LEFT JOIN konnte ich also die Regisseure ohne Filme ausgeben. Gut gemacht!

Aber dann habe ich INNER JOIN verwendet und alles durcheinander gebracht! INNER JOIN hebt die erste LEFT JOIN auf, da sie nur die übereinstimmenden Zeilen zwischen streaming_catalogue und streaming_platform.

Da Lynne Ramsay und Stanley Kubrick keine Filme in der Tabelle haben streaming_cataloguehaben, können ihre nicht existierenden Filme nicht in der streaming_platform Tabelle gefunden werden und erscheinen nicht im Endergebnis.

Hier finden Sie einen Artikel mit weiteren Tipps und Beispielen für LEFT JOINing mehrerer Tabellen.

Beispiel 6: LEFT JOIN mit WHERE

Fahren wir mit den SQL LEFT JOIN Beispielen fort und verwenden wir die gleichen Daten wie im vorherigen Beispiel.

Dieses Beispiel zeigt Ihnen, wie LEFT JOIN mit der Klausel WHERE verwendet werden kann.

Der folgende Code tut genau das, um die Regisseure, ihre Filme sowie das Anfangs- und Enddatum der Vorführungen zu finden. Es werden jedoch nicht alle Filme angezeigt, sondern nur diejenigen, deren Aufführung vor dem 1. Oktober 2023 endete.

SELECT first_name,
	 last_name,
	 movie_title, 
	 started_showing, 
	 ended_showing
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
WHERE ended_showing < '2023_10_01';

Nachdem ich die erforderlichen Spalten ausgewählt habe, habe ich die Tabelle LEFT JOIN director mit der Tabelle streaming_ catalog. Die Tabellen sind über die ID des Regisseurs verbunden.

Ich verwende die WHERE Klausel, um nur die Filme auszugeben, deren Vorführung vor dem 1. Oktober 2023 endete. In WHERE vergleiche ich die Spalte ended_showing mit dem gewünschten Stichtag mit dem Vergleichsoperator "kleiner als" (<).

Hier ist die Ausgabe. Kein Film endete nach dem 1. Oktober 2023.

first_namelast_namemovie_titlestarted_showingended_showing
KrzysztofKieślowskiThree Colours: Blue2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: White2023-02-282023-09-30
KrzysztofKieślowskiThree Colours: Red2023-02-282023-09-30
CélineSciammaPortrait of a Lady on Fire2023-01-012023-09-28
CélineSciammaTomboy2020-04-012021-04-01

Beispiel 7: WHERE vs. ON in LEFT JOIN

Ich zeige Ihnen nun, wie die Wirkung von LEFT JOIN aufgehoben werden kann, wenn WHERE in der rechten Tabelle verwendet wird. Und natürlich zeige ich Ihnen auch, wie man das beheben kann.

Ich verwende wieder denselben Datensatz wie im vorherigen Beispiel. Nehmen wir an, ich möchte ihn abfragen und alle Regisseure abrufen, unabhängig davon, ob sie einen Film in der Datenbank haben oder nicht. Für die Regisseure, die einen Film haben, möchte ich nur Filme anzeigen, die 1993 veröffentlicht wurden.

Ich könnte versuchen, dies zu erreichen, indem ich diese Abfrage schreibe:

SELECT DISTINCT first_name,
	   	    last_name,
	   	    movie_title, 
	   	    release_year
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id
WHERE release_year = 1993;

Zuerst wähle ich die erforderlichen Spalten aus. Ich verwende SELECT DISTINCT, um Zeilendopplungen zu vermeiden, da einige Filme mehr als einmal in der Tabelle vorkommen streaming_catalogue.

Jetzt gebe ich LEFT JOIN die Tabelle director mit streaming_catalogue für die ID des Regisseurs.

Der letzte Schritt wäre, die WHERE Klausel zu verwenden und nur Filme abzurufen, die 1993 veröffentlicht wurden.

Schauen wir uns die Ausgabe an:

first_namelast_namemovie_titlerelease_year
KrzysztofKieślowskiThree Colours: Blue1993
WoodyAllenManhattan Murder Mystery1993

Nein, das ist nicht richtig! Ich habe nur zwei Regisseure statt fünf. Zur Erinnerung: Ich wollte eine Liste aller Regisseure. Warum ist das passiert, obwohl ich LEFT JOIN verwendet habe?

Der Grund dafür ist, dass der Filter in WHERE, wenn er auf Daten aus der rechten Tabelle angewendet wird, die Wirkung von LEFT JOIN aufhebt. Erinnern Sie sich, wenn der Regisseur keine Filme in der Tabelle hat, dann werden die Werte in der Spalte release_year NULL sein. Das ist das Ergebnis von LEFT JOIN. Und der Filter in WHERE wird auch NULLvon der Ausgabe ausschließen.

Wie können Sie nun alle Regisseure auflisten und gleichzeitig den Filter auf das Erscheinungsjahr anwenden? Die Antwort ist, dass Sie die Filterbedingung von WHERE nach ON verschieben sollten.

SELECT DISTINCT first_name,
	          last_name,
	          movie_title, 
	          release_year
FROM director
LEFT JOIN streaming_catalogue
ON director.id = streaming_catalogue.director_id AND release_year = 1993;

Die Bedingung für das Veröffentlichungsjahr wird nun zur zweiten Verknüpfungsbedingung in der Klausel ON. Die zweite (dritte, vierte...) Bedingung wird mit dem Schlüsselwort AND hinzugefügt.

Sehen Sie, die Ausgabe ist jetzt korrekt:

first_namelast_namemovie_titlerelease_year
StanleyKubrickNULLNULL
LynneRamsayNULLNULL
CélineSciammaNULLNULL
KrzysztofKieślowskiThree Colours: Blue1993
WoodyAllenManhattan Murder Mystery1993

Mehr dazu erfahren Sie in diesem Artikel über den Unterschied zwischen WHERE und ON in SQL-JOINs.

Beispiel 8: LEFT JOIN mit Alias

In allen vorherigen Beispielen war die Verwendung von Aliasen für die Tabellen in LEFT JOIN nicht notwendig. Es hätte Ihnen vielleicht geholfen, die Namen der Tabellen zu verkürzen und den Code etwas schneller zu schreiben. Hilfreich, ja, aber nicht zwingend erforderlich.

Aliasnamen werden jedoch obligatorisch, wenn Sie LEFT JOINING die Tabelle mit sich selbst verknüpfen - d. h. wenn Sie die Tabelle selbst verknüpfen.

Schauen wir uns an, wie dies in einem Beispiel funktioniert, in dem ich die Namen aller Mitarbeiter und die Namen ihrer Manager abrufen möchte. Ich möchte, dass diese Liste die Mitarbeiter enthält, die keinen Vorgesetzten haben.

Ich werde dies in der Tabelle mit dem Namen employees_managers. Hier ist das Skript:

idfirst_namelast_namemanager_id
1LindKaiser2
2IanMcKune8
3DeckTrustrieNULL
4RupertaNind1
5GarrotCharsleyNULL
6AtheneFedoronko8
7PriscillaCrocombeNULL
8StafaniSidebottom8
9MarveTrustie1
10AntonyMarple2

Dies ist eine Liste der Angestellten. Die Spalte manager_id enthält die ID des Mitarbeiters, der der Vorgesetzte des jeweiligen Mitarbeiters ist. Einige Mitarbeiter haben keine Vorgesetzten, daher lautet der Wert NULL.

Um die gewünschte Aufgabe zu erfüllen, muss ich diese Abfrage schreiben:

SELECT e.first_name AS employee_first_name, 
	 e.last_name AS employee_last_name, 
	 m.first_name AS manager_first_name,
	 m.last_name AS manager_last_name
FROM employees_managers e
LEFT JOIN employees_managers m
ON e.manager_id = m.id;

Ich referenziere die Tabelle in der FROM Klausel und gebe ihr den Alias e. Diese Tabelle wird als Mitarbeiterdaten dienen.

Dann verweise ich auf die gleiche Tabelle in LEFT JOIN und gebe ihr den Alias m. Sie wird für die Daten der Manager verwendet.

Auf diese Weise konnte ich die Tabelle mit sich selbst verknüpfen. Das ist nichts anderes als die Verknüpfung zweier verschiedener Tabellen. Beim Self-Join wirkt eine Tabelle wie zwei Tabellen. Sie müssen ihnen nur Aliasnamen geben, damit SQL weiß, auf welche Tabelle Sie sich beziehen.

Die Tabelle wird selbst-gejoint, wobei die Manager-ID aus der Tabelle "employee" der Mitarbeiter-ID aus der Tabelle "manager" entspricht. Auf diese Weise erhalte ich alle Mitarbeiter und ihre Manager.

Jetzt, da die Tabellen vorhanden sind, muss ich nur noch die erforderlichen Spalten auswählen. Auch hier verwende ich zur Unterscheidung verschiedene Tabellenalias, um die Namen der Mitarbeiter und Manager zu erhalten.

Hier ist die Ausgabe:

employee_first_nameemployee_last_namemanager_first_namemanager_last_name
LindKaiserIanMcKune
IanMcKuneStafaniSidebottom
DeckTrustrieNULLNULL
RupertaNindLindKaiser
GarrotCharsleyNULLNULL
AtheneFedoronkoStafaniSidebottom
PriscillaCrocombeNULLNULL
StafaniSidebottomStafaniSidebottom
MarveTrustieLindKaiser
AntonyMarpleIanMcKune

Wie Sie sehen können, handelt es sich um eine vollständige Liste der Mitarbeiter und ihrer Manager. Deck Trustrie, Garrot Charsley und Priscilla Crocombe haben keine Manager. Sie befinden sich an der Spitze der hierarchischen Struktur des Unternehmens.

Beispiel 9: LEFT JOIN mit GROUP BY

Kehren wir nun zu Beispiel 2 zurück, wo wir mit einer Liste von Abteilungen und Mitarbeitern gearbeitet haben.

Ein einfaches Beispiel für LEFT JOIN mit GROUP BY wäre, alle Abteilungen aufzulisten und die Anzahl der Mitarbeiter in jeder Abteilung zu zählen:

SELECT department_name,
	 COUNT(employee.id) AS number_of_employees
FROM department
LEFT JOIN employee
ON department.id = employee.department_id
GROUP BY department_name;

Ich wähle die Abteilung aus und verwende die Aggregatfunktion COUNT() auf die Spalte der Mitarbeiter-ID, um die Anzahl der Mitarbeiter zu ermitteln.

Die Daten stammen aus zwei Tabellen. Ich muss LEFT JOIN die department Tabelle mit der employee Tabelle verbinden, da ich auch Abteilungen ohne Mitarbeiter haben möchte. Die Tabellen sind über die Abteilungs-ID verbunden.

Da ich eine Aggregatfunktion verwendet habe, muss ich die Daten auch gruppieren. Dazu verwende ich die GROUP BY Klausel. Durch die Gruppierung der Ausgabe nach dem Abteilungsnamen wird die Anzahl der Mitarbeiter für jede Abteilung angezeigt.

Sehen Sie sich das mal an. Schön, nicht wahr?

department_namenumber_of_employees
Accounting3
Operations0
Sales2
IT2
HR0

Lassen Sie uns nun ein anderes Beispiel ausprobieren und COUNT(*) verwenden, anstatt COUNT() auf eine bestimmte Spalte anzuwenden.

Diesmal verwende ich die Daten über die Unternehmen und ihre Produkte aus Beispiel 1. In diesem Beispiel möchte ich alle Unternehmen abrufen und die Anzahl der Produkte anzeigen, die sie haben.

Schauen wir uns an, was passiert, wenn ich COUNT(*) verwende:

SELECT company_name,
	 COUNT(*) AS number_of_products
FROM company
LEFT JOIN product
ON company.id = product.company_id
GROUP BY company_name;

Die Tabellen company und product sind LEFT JOINauf der Grundlage der Firmen-ID. Ich verwende COUNT(*) und GROUP BY, um die Anzahl der Produkte nach Unternehmen zu ermitteln.

Dies ist die Ausgabe:

company_namenumber_of_products
Huawei1
Lenovo1
Samsung3
Apple3
Fairphone2

Ich kann Ihnen jedoch sagen, dass diese Ausgabe nicht richtig ist: Huawei und Lenovo hätten null Produkte haben müssen. Wie kommt es zu diesem Fehler?

Der Übeltäter ist COUNT(*)! Das Sternchen in der Funktion COUNT() bedeutet, dass sie alle Zeilen zählt, auch die von NULL. Wird es jetzt klarer? Ja, das ist richtig: Wenn die Unternehmen ohne Produkte LEFT JOINsind, haben sie NULL Produkte. Dies ist jedoch immer noch ein Wert, und COUNT(*) betrachtet jeden NULL Wert als ein Produkt. Mit anderen Worten, auch die Unternehmen ohne Produkte werden als ein Produkt angezeigt.

Um dies zu beheben, verwenden Sie COUNT(expression). In diesem Fall bedeutet das COUNT(product.id). Bei Verwendung von COUNT() mit einem Spaltennamen wird NULLignoriert:

SELECT company_name,
	 COUNT(product.id) AS number_of_products
FROM company
LEFT JOIN product
ON company.id = product.company_id
GROUP BY company_name;

Die Ausgabe ist nun wie erwartet:

company_namenumber_of_products
Huawei0
Lenovo0
Samsung3
Apple3
Fairphone2

Sie können diesen Artikel über verschiedene Variationen der Aggregatfunktion COUNT() lesen, um mehr Details zu erfahren.

Weitere SQL LEFT JOIN Beispiele und Ressourcen

Aus den obigen Beispielen können Sie ersehen, dass LEFT JOIN in der praktischen Arbeit mit Daten eine breite Anwendung findet. Sie kann für einfache Datenabfragen verwendet werden, bei denen Sie alle Daten aus einer Tabelle und nur die passenden Daten aus einer anderen Tabelle benötigen. Er kann aber auch bei der Verknüpfung mehrerer Tabellen, mit WHERE, in Self-Joins und mit Aggregatfunktionen und GROUP BY verwendet werden.

SQL-Joins sind für die Arbeit mit mehreren Tabellen unerlässlich, was selbst für junge Datenanalysten eine alltägliche Aufgabe ist. Die Kenntnis von Joins ist ein absolutes Muss, wenn Sie sich als fließend in SQL betrachten und in Ihrer Arbeit vorankommen wollen.

Das bedeutet auch, dass Sie LEFT JOIN kennen müssen, da dies einer der beiden am häufigsten verwendeten Join-Typen ist. Aufgrund seiner sehr spezifischen Eigenschaften können viele Aufgaben nur mit Hilfe von LEFT JOIN erledigt werden. Wenn Sie also eine ausführliche Anleitung zu diesen Themen benötigen, laden wir Sie ein, einen Blick auf unseren KursSQL-JOINs zu werfen.

Außerdem müssen Sie all diese Konzepte üben, um sie wirklich zu verinnerlichen. Das bedeutet, dass Sie sowohl LEFT JOIN als auch andere JOIN-Typen üben müssen, damit Sie sie unterscheiden können. Sie können diese 12 JOIN-Übungsfragen oder einige der Vorschläge zum Üben auf SQL-JOINs ausprobieren. Wenn Sie demnächst ein Vorstellungsgespräch mit SQL haben, versuchen Sie, diese 10 SQL JOIN-Fragen zu beantworten. Viel Spaß beim Lernen!