23rd Jun 2022 10 Leseminuten SQL JOIN-Typen erklärt Marija Ilic JOIN Inhaltsverzeichnis Was ist ein SQL JOIN? Lernen Sie die Datenbank kennen Die 4 JOIN-Typen von SQL INNER JOIN LEFT JOIN RIGHT JOIN FULL (OUTER) JOIN Nächstes Thema: Üben Sie SQL-JOINs 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: INNER JOIN (auch bekannt als "einfacher" JOIN). Dies ist die häufigste Art von JOIN. LEFT JOIN (oder LEFT OUTER JOIN) RIGHT JOIN (oder RIGHT OUTER JOIN) FULL JOIN (oder FULL 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_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: 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. 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: 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: 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. Tags: JOIN