Zurück zur Artikelliste Artikel
10 Leseminuten

SQL JOIN-Typen erklärt

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_idoverdraft_amtcustomer_idtype_idsegment
25568891200042RET
1323598795155011RET
2225546500052RET
5516229600045RET
5356222750055RET
2221889540012RET
245568812500502CORP
13224886562500511CORP
13235987953100521CORP
13231115951220531CORP

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_idnamelastnamegendermarital_status
1MARCTESCOMY
2ANNAMARTINFN
3EMMAJOHNSONFY
4DARIOPENTALMN
5ELENASIMSONFN
6TIMROBITHMN
7MILAMORRISFN
8JENNYDWARTHFY

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:

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:

INNER JOIN

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_status
FROM 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 die account und customer 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:

JOIN
  • 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 Tabelle customer Tabelle werden ebenfalls angezeigt.

Nach der Ausführung dieses Codes gibt SQL folgendes zurück:

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY

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.

LEFT JOIN

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_status
FROM 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_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY
245568812500502CORPNULLNULLNULLNULL
13224886562500511CORPNULLNULLNULLNULL
13235987953100521CORPNULLNULLNULLNULL
13231115951220531CORPNULLNULLNULLNULL

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:

RIGHT JOIN

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_status
FROM 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_idoverdraft_amounttype_idsegmentcustomer_idcustomer_idnamelastnamegendermarital_status
132359879515501RET11MARCTESCOMY
222188954002RET11MARCTESCOMY
NULLNULLNULLNULLNULL2ANNAMARTINFN
NULLNULLNULLNULLNULL3EMMAJOHNSONFY
2556889120002RET44DARIOPENTALMN
551622960005RET44DARIOPENTALMN
222554650002RET55ELENASIMSONFN
535622275005RET55ELENASIMSONFN
NULLNULLNULLNULLNULL6TIMROBITHMN
NULLNULLNULLNULLNULL7MILAMORRISFN
NULLNULLNULLNULLNULL8JENNYDWARTHFY

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 der account 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:

FULL (OUTER) JOIN

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_status
FROM account 
FULL JOIN customer 

ON account.customer_id=customer.customer_id;

Das Ergebnis sieht nun wie folgt aus:

account_idoverdraft_amountcustomer_idtype_idsegmentnamelastnamegendermarital_status
25568891200042RETDARIOPENTALMN
1323598795155011RETMARCTESCOMY
2225546500052RETELENASIMSONFN
5516229600045RETDARIOPENTALMN
5356222750055RETELENASIMSONFN
2221889540012RETMARCTESCOMY
245568812500502CORPNULLNULLNULLNULL
13224886562500511CORPNULLNULLNULLNULL
13235987953100521CORPNULLNULLNULLNULL
13231115951220531CORPNULLNULLNULLNULL
NULLNULL2NULLNULLANNAMARTINFN
NULLNULL3NULLNULLEMMAJOHNSONFY
NULLNULL6NULLNULLTIMROBITHMN
NULLNULL7NULLNULLMILAMORRISFN
NULLNULL8NULLNULLJENNYDWARTHFY

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.