Was ist der Unterschied zwischen INNER JOIN, LEFT JOIN, RIGHT JOIN und FULL JOIN in SQL? Wann sollten Sie jeden einzelnen verwenden? Wir haben hier die Antworten für Sie.
Sie möchten Daten aus zwei oder mehr verschiedenen Tabellen kombinieren, sind sich aber nicht sicher, wie Sie das in SQL machen sollen. Kein Problem. In diesem Artikel zeige ich Ihnen, wie Sie die SQL-Klausel JOIN
verwenden können, um Daten aus zwei Tabellen zusammenzuführen. Es gibt verschiedene SQL JOIN
Typen, die Sie für unterschiedliche Ergebnisse verwenden können. Wenn Sie die Unterschiede zwischen INNER JOIN
, LEFT JOIN
, RIGHT JOIN
und FULL JOIN
kennenlernen möchten, lesen Sie weiter. Dieser Artikel ist für Sie.
Beginnen wir mit den Grundlagen: Was ist eine JOIN
Anweisung und wie funktioniert sie?
Was ist ein SQL JOIN?
Eine JOIN
Klausel wird verwendet, wenn Sie Daten aus zwei oder mehr Tabellen in einem Datensatz kombinieren müssen. Datensätze aus beiden Tabellen werden auf der Grundlage einer Bedingung (auch JOIN
Prädikat genannt) abgeglichen, die Sie in der JOIN
Klausel angeben. Wenn die Bedingung erfüllt ist, werden die Datensätze in die Ausgabe aufgenommen.
In diesem Artikel werde ich das Konzept von SQL JOIN
und die verschiedenen JOIN
Typen anhand von Beispielen erläutern. Bevor wir also weitermachen, werfen wir einen Blick auf die Tabellen, die wir in diesem Artikel verwenden werden.
Lernen Sie die Datenbank kennen
Wir werden Tabellen aus einer fiktiven Bankdatenbank verwenden. Die erste Tabelle ist called
Konto und enthält Daten zu den Bankkonten der Kunden:
account_id | overdraft_amt | customer_id | type_id | segment |
---|---|---|---|---|
2556889 | 12000 | 4 | 2 | RET |
1323598795 | 1550 | 1 | 1 | RET |
2225546 | 5000 | 5 | 2 | RET |
5516229 | 6000 | 4 | 5 | RET |
5356222 | 7500 | 5 | 5 | RET |
2221889 | 5400 | 1 | 2 | RET |
2455688 | 12500 | 50 | 2 | CORP |
1322488656 | 2500 | 51 | 1 | CORP |
1323598795 | 3100 | 52 | 1 | CORP |
1323111595 | 1220 | 53 | 1 | CORP |
Tabelle "Konto
Diese Tabelle enthält 10 Datensätze (10 Konten) und fünf Spalten:
account_id
- Eindeutige Identifizierung jedes Kontos.overdraft_amount
- Das Überziehungslimit für jedes Konto.customer_id
- Eindeutige Identifizierung jedes Kunden.type_id
- Identifiziert die Art des Kontos.segment
- Enthält die Werte "RET" (für Privatkunden) und "CORP" (für Firmenkunden).
Die zweite Tabelle heißt customer
und enthält kundenbezogene Daten:
customer_id | name | lastname | gender | marital_status |
---|---|---|---|---|
1 | MARC | TESCO | M | Y |
2 | ANNA | MARTIN | F | N |
3 | EMMA | JOHNSON | F | Y |
4 | DARIO | PENTAL | M | N |
5 | ELENA | SIMSON | F | N |
6 | TIM | ROBITH | M | N |
7 | MILA | MORRIS | F | N |
8 | JENNY | DWARTH | F | Y |
Kundentabelle
Diese Tabelle enthält acht Datensätze und fünf Spalten:
customer_id
- Eindeutige Identifizierung jedes Kontos.name
- Den Vornamen des Kunden.lastname
- Der Nachname des Kunden.gender
- Das Geschlecht des Kunden (M oder F).marital_status
- Ob der Kunde verheiratet ist (J oder N).
Nun, da wir diese beiden Tabellen haben, können wir sie kombinieren, um zusätzliche Ergebnisse in Bezug auf Kunden- oder Kontodaten anzuzeigen. JOIN
kann uns helfen, Antworten auf Fragen zu erhalten wie:
- Wem gehören die einzelnen Konten in der
account
Tabelle? - Wie viele Konten hat Marc Tesco?
- Wie viele Konten besitzt eine Kundin?
- Wie hoch ist der gesamte Überziehungsbetrag für alle Konten von Emma Johnson?
Um jede dieser Fragen zu beantworten, müssen wir zwei Tabellen kombinieren (account
und customer
) unter Verwendung einer Spalte, die in beiden Tabellen vorkommt (in diesem Fall customer_id
). Sobald wir die beiden Tabellen zusammenführen, haben wir Konto- und Kundeninformationen in einer einzigen Ausgabe.
Denken Sie daran, dass in der Tabelle account
Tabelle gibt es einige Kunden, die in der customer
Tabelle zu finden sind. (Informationen über Firmenkunden sind an anderer Stelle gespeichert.) Beachten Sie auch, dass einige Kunden-IDs nicht in der account
Tabelle vorhanden sind; einige Kunden haben keine Konten.
Es gibt mehrere Möglichkeiten, zwei Tabellen zu kombinieren. Oder anders ausgedrückt: Es gibt mehrere verschiedene SQL JOIN
Typen.
Die 4 JOIN-Typen von SQL
Zu den Typen von SQL JOIN
gehören:
INNER JOIN
(auch bekannt als "einfacher"JOIN
). Dies ist die häufigste Art von JOIN.LEFT JOIN
(oderLEFT OUTER JOIN
)RIGHT JOIN
(oderRIGHT OUTER JOIN
)FULL JOIN
(oderFULL OUTER JOIN
)- Self-Joins und Cross-Joins sind in SQL ebenfalls möglich, werden aber in diesem Artikel nicht behandelt. Weitere Informationen finden Sie unter Ein illustrierter Leitfaden zum SQL Self Join und An Illustrated Guide to the SQL Cross Join.
Gehen wir näher auf die ersten vier Typen von SQL JOIN
ein. Ich werde die Logik und die Syntax jedes Typs anhand eines Beispiels erklären. Manchmal werden bei der Erläuterung von SQL JOIN-Typen Venn-Diagramme verwendet. Ich werde sie hier nicht verwenden, aber wenn das Ihr Ding ist, schauen Sie sich den Artikel Wie man SQL JOINs lernt an.
INNER JOIN
INNER JOIN
wird verwendet, um übereinstimmende Datensätze aus beiden Tabellen anzuzeigen. Dies wird auch als einfacher JOIN
bezeichnet. Wenn Sie das Schlüsselwort INNER
(oder ein anderes Schlüsselwort, wie LEFT
, RIGHT
oder FULL
) weglassen und nur JOIN
verwenden, erhalten Sie standardmäßig diese Art von Verknüpfung.
Normalerweise gibt es zwei (oder mehr) Tabellen in einer Join-Anweisung. Wir nennen sie die linke und die rechte Tabelle. Die linke Tabelle befindet sich in der FROM
Klausel - und damit links vom JOIN
Schlüsselwort. Die rechte Tabelle befindet sich zwischen den Schlüsselwörtern JOIN
und ON
bzw. rechts vom Schlüsselwort JOIN
.
Wenn die Bedingung JOIN
in einer INNER JOIN
erfüllt ist, wird dieser Datensatz in den Datensatz aufgenommen. Er kann aus einer der beiden Tabellen stammen. Wenn der Datensatz die Kriterien nicht erfüllt, wird er nicht aufgenommen. Die folgende Abbildung zeigt, was passieren würde, wenn die Farbe Blau das Verknüpfungskriterium für die linke und rechte Tabelle wäre:
Schauen wir uns einmal an, wie INNER JOIN
in unserem Beispiel funktioniert. Ich werde eine einfache JOIN
auf Konto und Kunde ausführen, um Folgendes anzuzeigen account
und customer
Informationen in einer Ausgabe:
SELECT account.*, customer.name, customer.lastname, customer.gender, customer.marital_statusFROM account JOIN customer ON account.customer_id=customer.customer_id;
Hier ist eine kurze Erklärung, was vor sich geht:
- Ich verwende
JOIN
, weil wir dieaccount
undcustomer
Tabellen zusammenführen. - Das Prädikat
JOIN
ist hier durch Gleichheit definiert:
account.customer_id = customer.customer_id
Mit anderen Worten: Die Datensätze werden anhand der Werte in der Spalte customer_id
abgeglichen:
- Datensätze, die denselben Kunden-ID-Wert haben, werden abgeglichen. (Sie sind in der obigen Abbildung farbig dargestellt.) Datensätze, die in keiner der beiden Tabellen eine Übereinstimmung aufweisen (grau dargestellt), werden nicht in die Ergebnismenge aufgenommen.
- Für Datensätze, die übereinstimmen, werden alle Attribute aus der
account
Tabelle in der Ergebnismenge angezeigt. Die Attribute Name, Nachname, Geschlecht und Familienstand aus der Tabellecustomer
Tabelle werden ebenfalls angezeigt.
Nach der Ausführung dieses Codes gibt SQL folgendes zurück:
account_id | overdraft_amount | customer_id | type_id | segment | name | lastname | gender | marital_status |
---|---|---|---|---|---|---|---|---|
2556889 | 12000 | 4 | 2 | RET | DARIO | PENTAL | M | N |
1323598795 | 1550 | 1 | 1 | RET | MARC | TESCO | M | Y |
2225546 | 5000 | 5 | 2 | RET | ELENA | SIMSON | F | N |
5516229 | 6000 | 4 | 5 | RET | DARIO | PENTAL | M | N |
5356222 | 7500 | 5 | 5 | RET | ELENA | SIMSON | F | N |
2221889 | 5400 | 1 | 2 | RET | MARC | TESCO | M | Y |
INNER JOIN Ergebnis
Wie bereits erwähnt, werden nur farbige (übereinstimmende) Datensätze zurückgegeben; alle anderen werden verworfen. Aus betriebswirtschaftlicher Sicht wurden alle Einzelhandelskonten mit detaillierten Informationen über ihre Inhaber angezeigt. Nicht-Einzelhandelskonten wurden nicht angezeigt, da ihre Kundeninformationen nicht in der Tabelle customer
Tabelle gespeichert sind.
LEFT JOIN
Manchmal müssen Sie alle Datensätze aus der linken Tabelle beibehalten - auch wenn einige keine Übereinstimmung in der rechten Tabelle haben. Im letzten Beispiel wurden die grauen Zeilen in der Ausgabe nicht angezeigt. Dabei handelt es sich um Firmenkonten. In einigen Fällen möchten Sie sie vielleicht im Datensatz haben, auch wenn ihre Kundendaten leer bleiben. Wenn wir ungepaarte Datensätze aus der linken Tabelle zurückgeben möchten, sollten wir eine LEFT JOIN
schreiben. Unten können Sie sehen, dass die LEFT JOIN
alles in der linken Tabelle und passende Zeilen in der rechten Tabelle zurückgibt.
Hier sehen Sie, wie die vorherige Abfrage aussehen würde, wenn wir LEFT JOIN
statt INNER JOIN
verwenden würden:
SELECT account.*, customer.name, customer.lastname, customer.gender, customer.marital_statusFROM account LEFT JOIN customer ON account.customer_id=customer.customer_id;
Die Syntax ist identisch. Das Ergebnis ist jedoch nicht dasselbe. Jetzt können wir die Firmenkonten (graue Datensätze) in den Ergebnissen sehen:
account_id | overdraft_amount | customer_id | type_id | segment | name | lastname | gender | marital_status |
---|---|---|---|---|---|---|---|---|
2556889 | 12000 | 4 | 2 | RET | DARIO | PENTAL | M | N |
1323598795 | 1550 | 1 | 1 | RET | MARC | TESCO | M | Y |
2225546 | 5000 | 5 | 2 | RET | ELENA | SIMSON | F | N |
5516229 | 6000 | 4 | 5 | RET | DARIO | PENTAL | M | N |
5356222 | 7500 | 5 | 5 | RET | ELENA | SIMSON | F | N |
2221889 | 5400 | 1 | 2 | RET | MARC | TESCO | M | Y |
2455688 | 12500 | 50 | 2 | CORP | NULL | NULL | NULL | NULL |
1322488656 | 2500 | 51 | 1 | CORP | NULL | NULL | NULL | NULL |
1323598795 | 3100 | 52 | 1 | CORP | NULL | NULL | NULL | NULL |
1323111595 | 1220 | 53 | 1 | CORP | NULL | NULL | NULL | NULL |
Left join - Konto mit Kunde
Beachten Sie, dass Attribute wie Name, Nachname, Geschlecht und Familienstand in den letzten vier Zeilen mit NULLs
aufgefüllt sind. Das liegt daran, dass diese grauen Zeilen keine Übereinstimmungen in der customer
Tabelle gibt (d. h. customer_id
Werte von 50, 51, 52 und 53 sind nicht in der customer
Tabelle vorhanden). Daher wurden diese Attribute in diesem Ergebnis NULL gelassen.
RIGHT JOIN
Ähnlich wie bei LEFT JOIN
behält RIGHT JOIN
alle Datensätze aus der rechten Tabelle (auch wenn es keinen passenden Datensatz in der linken Tabelle gibt). Hier ist das bekannte Bild, um Ihnen zu zeigen, wie es funktioniert:
Auch hier verwenden wir dasselbe Beispiel. Allerdings haben wir LEFT JOIN
durch RIGHT JOIN
ersetzt:
SELECT account.account_id, account.overdraft_amount, account.type_id, account.segment, account.customer_id, customer.customer_id customer.name, customer.lastname, customer.gender, customer.marital_statusFROM account RIGHT JOIN customer ON account.customer_id=customer.customer_id;
Die Syntax ist größtenteils die gleiche. Ich habe eine weitere kleine Änderung vorgenommen: Zusätzlich zu account.customer_id
habe ich auch die Spalte customer.customer_id
in die Ergebnismenge aufgenommen. Ich habe dies getan, um Ihnen zu zeigen, was mit Datensätzen aus der Tabelle customer
Tabelle, die keine Übereinstimmung mit der linken (account
) Tabelle haben.
Hier ist das Ergebnis:
account_id | overdraft_amount | type_id | segment | customer_id | customer_id | name | lastname | gender | marital_status |
---|---|---|---|---|---|---|---|---|---|
1323598795 | 1550 | 1 | RET | 1 | 1 | MARC | TESCO | M | Y |
2221889 | 5400 | 2 | RET | 1 | 1 | MARC | TESCO | M | Y |
NULL | NULL | NULL | NULL | NULL | 2 | ANNA | MARTIN | F | N |
NULL | NULL | NULL | NULL | NULL | 3 | EMMA | JOHNSON | F | Y |
2556889 | 12000 | 2 | RET | 4 | 4 | DARIO | PENTAL | M | N |
5516229 | 6000 | 5 | RET | 4 | 4 | DARIO | PENTAL | M | N |
2225546 | 5000 | 2 | RET | 5 | 5 | ELENA | SIMSON | F | N |
5356222 | 7500 | 5 | RET | 5 | 5 | ELENA | SIMSON | F | N |
NULL | NULL | NULL | NULL | NULL | 6 | TIM | ROBITH | M | N |
NULL | NULL | NULL | NULL | NULL | 7 | MILA | MORRIS | F | N |
NULL | NULL | NULL | NULL | NULL | 8 | JENNY | DWARTH | F | Y |
RIGHT JOIN Ergebnis
Wie Sie sehen können, wurden alle Datensätze aus der rechten Tabelle in die Ergebnismenge aufgenommen. Denken Sie daran:
- Bei nicht übereinstimmenden Kunden-IDs aus der rechten Tabelle (Nummern 2, 3, 6, 7 und 8, in grau dargestellt) werden die Kontoattribute in dieser Ergebnismenge auf NULL gesetzt. Es handelt sich um Einzelhandelskunden, die kein Bankkonto haben - und somit keine Datensätze in der
account
Tabelle. - Sie könnten erwarten, dass die resultierende Tabelle acht Datensätze enthält, da dies die Gesamtzahl der Datensätze in der
customer
Tabelle ist. Dies ist jedoch nicht der Fall. Wir haben 11 Datensätze, weil die Kunden-IDs 1, 4 und 5 jeweils zwei Konten in deraccount
Tabelle haben. Es werden alle möglichen Übereinstimmungen angezeigt.
FULL (OUTER) JOIN
Ich habe Ihnen gezeigt, wie Sie alle Datensätze aus der linken oder rechten Tabelle behalten können. Was aber, wenn Sie alle Datensätze aus beiden Tabellen behalten wollen? In unserem Fall würden Sie alle übereinstimmenden Datensätze plus alle Firmenkonten plus alle Kunden ohne Konten anzeigen wollen. Hierfür können Sie FULL OUTER JOIN
verwenden. Dieser JOIN
Typ verbindet alle übereinstimmenden Spalten und zeigt auch alle nicht übereinstimmenden Spalten aus beiden Tabellen an. Unbekannte Attribute werden mit NULLs
aufgefüllt. Sehen Sie sich das folgende Bild an:
Hier ist die FULL OUTER JOIN
Syntax:
SELECT account.*, CASE WHEN customer.customer_id IS NULL THEN account.customer_id ELSE customer.customer_id END customer_id customer.name, customer.lastname, customer.gender, customer.marital_statusFROM account FULL JOIN customer
ON account.customer_id=customer.customer_id;
Das Ergebnis sieht nun wie folgt aus:
account_id | overdraft_amount | customer_id | type_id | segment | name | lastname | gender | marital_status |
---|---|---|---|---|---|---|---|---|
2556889 | 12000 | 4 | 2 | RET | DARIO | PENTAL | M | N |
1323598795 | 1550 | 1 | 1 | RET | MARC | TESCO | M | Y |
2225546 | 5000 | 5 | 2 | RET | ELENA | SIMSON | F | N |
5516229 | 6000 | 4 | 5 | RET | DARIO | PENTAL | M | N |
5356222 | 7500 | 5 | 5 | RET | ELENA | SIMSON | F | N |
2221889 | 5400 | 1 | 2 | RET | MARC | TESCO | M | Y |
2455688 | 12500 | 50 | 2 | CORP | NULL | NULL | NULL | NULL |
1322488656 | 2500 | 51 | 1 | CORP | NULL | NULL | NULL | NULL |
1323598795 | 3100 | 52 | 1 | CORP | NULL | NULL | NULL | NULL |
1323111595 | 1220 | 53 | 1 | CORP | NULL | NULL | NULL | NULL |
NULL | NULL | 2 | NULL | NULL | ANNA | MARTIN | F | N |
NULL | NULL | 3 | NULL | NULL | EMMA | JOHNSON | F | Y |
NULL | NULL | 6 | NULL | NULL | TIM | ROBITH | M | N |
NULL | NULL | 7 | NULL | NULL | MILA | MORRIS | F | N |
NULL | NULL | 8 | NULL | NULL | JENNY | DWARTH | F | Y |
Ergebnis der vollständigen äußeren Verknüpfung
Beachten Sie, dass in den letzten fünf Zeilen die Kontoattribute mit NULLen gefüllt sind. Das liegt daran, dass diese Kunden keine Datensätze in der account
Tabelle haben. Beachten Sie auch, dass bei den Kunden 50, 51, 52 und 53 Vor- oder Nachnamen und andere Attribute aus der Tabelle customer
Tabelle mit NULLen gefüllt sind. Das liegt daran, dass sie nicht in der customer
Tabelle nicht existieren. Hier ist customer_id
in der Ergebnistabelle niemals NULL, weil wir customer_id
mit einer CASE WHEN
-Anweisung definiert haben:
CASE WHEN customer.customer_id IS NULL THEN account.customer_id ELSE customer.customer_id END customer_id
Das bedeutet, dass customer_id
in der Ergebnistabelle eine Kombination aus account.customer_id
und customer.customer_id
ist (d. h. wenn eine Spalte NULL ist, wird die andere verwendet). Wir könnten auch beide Spalten in der Ausgabe anzeigen, aber diese CASE WHEN
Anweisung ist praktischer.
Es ist in Ordnung, wenn Sie verwirrt sind von all den verschiedenen SQL-JOINs und was sie tun. Bleiben Sie einfach dabei. Ich empfehle Ihnen, einen Blick auf unser SQL JOIN Cheat Sheet zu werfen. Bewahren Sie es in Ihrer Nähe auf; es ist beim Programmieren sehr nützlich. Es ist auch hilfreich, unseren Artikel über das Üben von SQL-JOINs zu lesen. Je mehr Sie lernen und üben, desto klarer wird SQL-JOINs.
Nächstes Thema: Üben Sie SQL-JOINs
In diesem Artikel haben wir verschiedene SQL JOIN
Typen eingeführt. Innere, linke, rechte und vollständige Joins liefern alle unterschiedliche Ergebnisse. Jetzt müssen Sie dieses Wissen in die Tat umsetzen! Unter LearnSQL.de finden Sie weitere Beispiele, mit denen Sie üben können. Unsere interaktiven SQL-Abfragen und SQL-JOINs Kurse behandeln JOIN-Themen, also probieren Sie sie aus.