Zurück zur Artikelliste Artikel
11 Leseminuten

7 SQL JOIN Beispiele mit detaillierten Erklärungen

Müssen Sie mehrere Tabellen verknüpfen, um die erforderliche Ergebnismenge zu erhalten? Der SQL JOIN ist ein grundlegendes, aber wichtiges Werkzeug, das von Datenanalysten verwendet wird, die mit relationalen Datenbanken arbeiten. Und ich weiß, dass es schwierig sein kann, aus den zahllosen einführenden Anleitungen zu Joins eine Auswahl zu treffen. In diesem Artikel werde ich mich auf praktische Beispiele mit detaillierten Erklärungen konzentrieren.

Einführung in JOIN

Bei relationalen Datenbanken sind die gewünschten Informationen oft in mehreren Tabellen gespeichert. In solchen Szenarien müssen Sie diese Tabellen miteinander verbinden. An dieser Stelle kommt der SQL JOIN ins Spiel.

Die JOIN-Klausel in SQL wird verwendet, um Zeilen aus mehreren Tabellen auf der Grundlage einer verwandten Spalte zwischen diesen Tabellen zu kombinieren. Einen Überblick über das SQL JOIN-Tool erhalten Sie in diesem Einführungsartikel.

In diesem Leitfaden möchte ich die Grundtypen von SQL-JOINs anhand mehrerer Beispiele behandeln. Ich werde im Detail auf die Syntax jeder Abfrage eingehen, wie sie funktioniert, wie man eine Bedingung aufstellt und wie man die Ergebnisse interpretiert.

Für die Beispiele verwenden wir Informationen über einen Verlag, der Original- und übersetzte Bücher herausgibt. Unsere Datenbank enthält vier Tabellen: books, authors, editors, und translators.

books
idtitletypeauthor_ideditor_idtranslator_id
1Time to Grow Up!original1121
2Your Triptranslated152232
3Lovely Loveoriginal1424
4Dream Your Lifeoriginal1124
5Orangestranslated122531
6Your Happy Lifetranslated152233
7Applied AItranslated132334
8My Last Bookoriginal1128

authors
idfirst_namelast_name
11EllenWriter
12OlgaSavelieva
13JackSmart
14DonaldBrain
15YaoDou

editors
idfirst_namelast_name
21DanielBrown
22MarkJohnson
23MariaEvans
24CathrineRoberts
25SebastianWright
26BarbaraJones
27MatthewSmith

translators
idfirst_namelast_name
31IraDavies
32LingWeng
33KristianGreen
34RomanEdwards

Wenn Sie das Verbinden von Tabellen in SQL mit vielen Beispielen üben wollen, empfehle ich Ihnen den SQL-JOINs Kurs. Er enthält 93 Codierungsaufgaben!

INNER JOIN

Wir beginnen mit einem einfachen INNER JOIN, oder einfach JOIN. Dieser Join-Typ wird verwendet, wenn wir übereinstimmende Datensätze aus zwei Tabellen anzeigen wollen.

Beispiel 1

Nehmen wir an, wir möchten Buchtitel zusammen mit ihren Autoren anzeigen (d. h. Vor- und Nachname des Autors). Die Buchtitel werden in der Tabelle books Tabelle gespeichert, und die Autorennamen werden in der authors Tabelle gespeichert.

In unserer SQL-Abfrage verknüpfen wir diese beiden Tabellen, indem wir die Spalte author_id aus der Tabelle books und die Spalte id aus der Tabelle authors abgleichen:

SELECT b.id, b.title, a.first_name, a.last_name
FROM books b
INNER JOIN authors a
ON b.author_id = a.id
ORDER BY b.id;

In der Anweisung SELECT führen wir die anzuzeigenden Spalten auf: Buch-ID, Buchtitel, Vorname des Autors und Nachname des Autors. In der FROM Klausel geben wir die erste Tabelle an, die verknüpft werden soll (auch als linke Tabelle bezeichnet). In der Klausel INNER JOIN geben wir die zweite Tabelle an, die verknüpft werden soll (auch als rechte Tabelle bezeichnet).

Dann teilen wir der Datenbank mit dem Schlüsselwort ON mit, welche Spalten für den Abgleich der Datensätze verwendet werden sollen (d. h. die Spalte author_id aus der Tabelle books Tabelle und die Spalte id aus der authors Tabelle).

Beachten Sie auch, dass wir Aliasnamen für Tabellennamen verwenden (d.h., b für books und a für authors). Wir weisen die Aliasnamen in den Klauseln FROM und INNER JOIN zu und verwenden sie in der gesamten Abfrage. Die Tabellen-Aliase reduzieren die Tipparbeit und machen die Abfrage lesbarer.

Hier ist die Ergebnismenge:

idtitlefirst_namelast_name
1Time to Grow Up!EllenWriter
2Your TripYaoDou
3Lovely LoveDonaldBrain
4Dream Your LifeEllenWriter
5OrangesOlgaSavelieva
6Your Happy LifeYaoDou
7Applied AIJackSmart
8My Last BookEllenWriter

Für jeden Datensatz in der linken Tabelle (d. h., books) überprüft die Abfrage die author_id und sucht dann nach demselben id in der ersten Spalte der authors Tabelle. Dann wird der entsprechende Vor- und Nachname abgefragt.

Beachten Sie, dass die Reihenfolge der Tabellen beim INNER JOIN oder beim einfachen JOIN keine Rolle spielt. Die Ergebnismenge wäre genau die gleiche, wenn wir die authors Tabelle in die FROM Klausel und die books in die INNER JOIN -Klausel setzen.

INNER JOIN zeigt nur Datensätze an, die in beiden Tabellen vorhanden sind. In unserem Beispiel haben alle Bücher einen entsprechenden Autor und alle Autoren haben mindestens ein entsprechendes Buch. Schauen wir uns also an, was passiert, wenn einige der Datensätze nicht übereinstimmen.

Beispiel #2

In unserem zweiten Beispiel werden wir die Bücher zusammen mit ihren Übersetzern (d. h. dem Nachnamen des Übersetzers) anzeigen. Nur die Hälfte unserer Bücher ist übersetzt worden und hat daher einen entsprechenden Übersetzer. Was wäre also das Ergebnis der Verknüpfung von books und translators Tabellen mit INNER JOIN?

SELECT b.id, b.title, b.type, t.last_name AS translator
FROM books b
JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitletypetranslator
2Your TriptranslatedWeng
5OrangestranslatedDavies
6Your Happy LifetranslatedGreen
7Applied AItranslatedEdwards

Die Abfrage gibt nur die Bücher aus, die übersetzt worden sind. Ich habe die Spalte "Typ" hinzugefügt, um dies zu verdeutlichen. Der Rest der Bücher konnte nicht mit der translators Tabelle zugeordnet werden und werden daher nicht angezeigt. So funktioniert INNER JOIN.

Beachten Sie auch, dass wir im zweiten Beispiel JOIN und nicht das Schlüsselwort INNER JOIN verwendet haben. Dies hat keinen Einfluss auf das Ergebnis, da INNER JOIN der Standard-Join-Typ in SQL ist. Weitere SQL JOIN-Typen finden Sie in diesem ausführlichen Leitfaden.

Nun gut. Jetzt wissen wir, wie man Tabellen verknüpft, wenn nur die übereinstimmenden Datensätze angezeigt werden sollen. Was aber, wenn wir alle Bücher in der Ergebnismenge behalten wollen, ohne die Tabelle auf die übersetzten Bücher zu beschränken? Es ist an der Zeit, etwas über äußere Verknüpfungen zu lernen!

LINKER JOIN

Wir beginnen unseren Überblick über OUTER-Joins mit dem LEFT JOIN. Sie sollten diesen SQL-JOIN-Typ anwenden, wenn Sie alle Datensätze aus der linken Tabelle und nur die übereinstimmenden Datensätze aus der rechten Tabelle behalten wollen.

Beispiel #3

Nehmen wir an, wir möchten Informationen über den Autor und den Übersetzer eines jeden Buches anzeigen (d. h. ihre Nachnamen). Wir möchten auch die grundlegenden Informationen zu jedem Buch (d. h. id, title und type) behalten.

Um all diese Daten zu erhalten, müssen wir drei Tabellen miteinander verbinden: books für grundlegende Informationen zu den Büchern, authors für die Nachnamen der Autoren, und translators für die Nachnamen der Übersetzer.

Wie wir im vorherigen Beispiel gesehen haben, führt die Verwendung von INNER JOIN (oder einfach JOIN) zur Verknüpfung der translators Tabelle zu verbinden, gehen alle Datensätze für die ursprünglichen (nicht übersetzten) Bücher verloren. Das ist nicht das, was wir jetzt wollen. Um also alle Bücher in der Ergebnismenge zu behalten, verknüpfen wir die books, authors, und translators unter Verwendung von LEFT JOIN.

SELECT b.id, b.title, b.type, a.last_name AS author, 
 t.last_name AS translator
FROM books b
LEFT JOIN authors a
ON b.author_id = a.id
LEFT JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;

Wie Sie sehen, beginnen wir mit der books in der FROM -Klausel beginnen, so dass sie die linke Tabelle ist. Das liegt daran, dass wir alle Datensätze aus dieser Tabelle behalten wollen. Die Reihenfolge der anderen Tabellen spielt keine Rolle.

In unserer Abfrage wird zuerst die Tabelle LEFT JOIN authors basierend auf der Spalte author_id aus der Tabelle books Tabelle und der id Spalte aus der authors Tabelle. Dann verknüpfen wir die translators Tabelle auf der Grundlage der Spalte translator_id aus der Tabelle books Tabelle und der Spalte id aus der Tabelle translators Tabelle.

Hier ist die resultierende Tabelle:

idtitletypeauthortranslator
1Time to Grow Up!originalWriterNULL
2Your TriptranslatedDouWeng
3Lovely LoveoriginalBrainNULL
4Dream Your LifeoriginalWriterNULL
5OrangestranslatedSavelievaDavies
6Your Happy LifetranslatedDouGreen
7Applied AItranslatedSmartEdwards
8My Last BookoriginalWriterNULL

Großartig! Wir haben alle Bücher behalten!

Beachten Sie die NULL Werte in der translator Spalte. Diese NULL Werte entsprechen den Datensätzen, die nicht in der translators Tabelle. Bei diesen Datensätzen handelt es sich um Originalbücher, an denen keine Übersetzer beteiligt sind.

Hoffentlich haben Sie die Intuition hinter LEFT JOINs begriffen. Mehr über diese Art von SQL JOIN erfahren Sie in diesem Einführungshandbuch.

Okay, gehen wir ein weiteres LEFT JOIN Beispiel durch, um das Wissen über dieses Thema zu festigen.

Beispiel #4

Diesmal möchten wir die grundlegenden Buchinformationen (d. h. ID und Titel) zusammen mit den Nachnamen der entsprechenden Herausgeber anzeigen. Auch hier wollen wir alle Bücher in der Ergebnismenge behalten. Wie würde also die Abfrage lauten?

SELECT b.id, b.title, e.last_name AS editor
FROM books b
LEFT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL

Ziemlich einfach, oder? Wir behalten wieder alle Bücher in der Ergebnismenge, einschließlich des letzten, das keinen entsprechenden Herausgeber in unserer Datenbank hat (beachten Sie den Wert NULL in der letzten Zeile).

Wir können uns vorstellen, dass der Lektor nicht in der Tabelle unserer aktuellen Lektoren vorhanden ist, weil er den Verlag nach der Bearbeitung des Buches verlassen hat.

Aber was ist, wenn wir einige Redakteure im Team haben, die noch keine Bücher veröffentlicht haben? Überprüfen wir das mit dem nächsten Outer-Join-Typ.

RIGHT JOIN

RIGHT JOIN ist LEFT JOIN sehr ähnlich. Ich wette, Sie haben erraten, dass der einzige Unterschied darin besteht, dass RIGHT JOIN alle Datensätze aus der rechten Tabelle behält, auch wenn sie nicht mit der linken Tabelle abgeglichen werden können. Wenn ja, haben Sie recht!

Beispiel #5

Wiederholen wir unser vorheriges Beispiel, aber dieses Mal besteht unsere Aufgabe darin, alle Datensätze aus der editors Tabelle. Wir haben also dieselbe Abfrage wie in Beispiel Nr. 4, nur dass wir LEFT JOIN durch RIGHT JOIN ersetzen:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
RIGHT JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
NULLNULLJones
NULLNULLSmith

Mit nur einem geänderten Wort in der Abfrage ist das Ergebnis ganz anders. Wir können sehen, dass wir tatsächlich zwei Redakteure(Jones und Smith) haben, die keine entsprechenden Bücher in unserer Datenbank haben. Sieht nach Neueinstellungen aus!

Und das ist nicht die einzige Änderung. Wir haben auch nicht My Last Book in der Ergebnismenge. Dieser Datensatz der linken Tabelle (d. h., books) wurde nicht in der rechten Tabelle (d. h., editors) und wurde nicht in das Endergebnis aufgenommen.

RIGHT JOINs werden in der Praxis selten verwendet, da sie in der Regel durch LEFT JOINs ersetzt werden können, die viel häufiger vorkommen.

In unserem Fall könnten wir zum Beispiel unsere Abfrage aus Beispiel Nr. 4 nehmen und einfach Folgendes austauschen books und editors durch Einfügen von editors in die FROM Klausel einfügen, so dass es die linke Tabelle ist, und books in die LEFT JOIN -Klausel einfügen, so dass es die rechte Tabelle ist. Das Ergebnis wäre das gleiche wie in der obigen Tabelle.

VOLLER JOIN

Hier sind wir beim letzten Outer-Join-Typ angelangt, der FULL JOIN heißt. Wir verwenden FULL JOIN, wenn wir alle Datensätze aus allen Tabellen behalten wollen, auch die, die nicht übereinstimmen. Es handelt sich also um eine Kombination aus LEFT JOIN und RIGHT JOIN. Gehen wir direkt zu den Beispielen, um zu sehen, wie dies in der Praxis funktioniert.

Beispiel #6

Beginnen wir wieder mit der Verknüpfung der Tabellen books und editors Tabellen, aber dieses Mal behalten wir alle Datensätze aus beiden Tabellen. Wir verwenden einfach FULL JOIN als Schlüsselwort für die Verknüpfung und lassen den Rest der Abfrage ohne Änderungen:

SELECT b.id, b.title, e.last_name AS editor
FROM books b
FULL JOIN editors e
ON b.editor_id = e.id
ORDER BY b.id;
idtitleeditor
1Time to Grow Up!Brown
2Your TripJohnson
3Lovely LoveRoberts
4Dream Your LifeRoberts
5OrangesWright
6Your Happy LifeJohnson
7Applied AIEvans
8My Last BookNULL
NULLNULLJones
NULLNULLSmith

Sieht toll aus! Wie erwartet, haben wir alle Bücher behalten, auch die ohne passenden Editor. Außerdem haben wir alle Redakteure beibehalten, auch die, die noch keine entsprechenden Bücher haben.

Beachten Sie, dass die Reihenfolge der Tabellen keine Rolle spielt bei FULL JOIN. Das Ergebnis wäre das gleiche, wenn wir die Tabellen vertauschen würden, indem wir die editors Tabelle in die FROM Klausel und die books Tabelle in die FULL JOIN Klausel setzen.

Beispiel Nr. 7

In unserem letzten Beispiel wollen wir alle vier Tabellen miteinander verbinden, um Informationen über alle Bücher, Autoren, Herausgeber und Übersetzer in einer Tabelle zu erhalten. Daher verwenden wir in unserer SQL-Abfrage FULL JOIN:

SELECT b.id, b.title, a.last_name AS author, e.last_name AS editor,
    t.last_name AS translator
FROM books b
FULL JOIN authors a
ON b.author_id = a.id
FULL JOIN editors e
ON b.editor_id = e.id
FULL JOIN translators t
ON b.translator_id = t.id
ORDER BY b.id;
idtitleauthoreditortranslator
1Time to Grow Up!WriterBrownNULL
2Your TripDouJohnsonWeng
3Lovely LoveBrainRobertsNULL
4Dream Your LifeWriterRobertsNULL
5OrangesSavelievaWrightDavies
6Your Happy LifeDouJohnsonGreen
7Applied AISmartEvansEdwards
8My Last BookWriterNULLNULL
NULLNULLNULLJonesNULL
NULLNULLNULLSmithNULL

Wie gewünscht, zeigt die Tabelle alle Bücher, Autoren, Herausgeber und Übersetzer an. Die Datensätze, die nicht übereinstimmen, haben die Werte NULL. Das ist ein guter Überblick über die in unserer Datenbank gespeicherten Daten.

Zeit zum Üben SQL-JOINs!

Die Beherrschung von SQL-JOINs ist eine der wichtigsten Voraussetzungen für alle, die mit relationalen Datenbanken arbeiten. Um Ihnen bei der Navigation durch die verschiedenen Arten von SQL JOINs zu helfen, hat LearnSQL.com einen zweiseitigen SQL JOIN-Spickzettel entwickelt. Er enthält die Syntax der verschiedenen JOINs sowie Beispiele.

Um JOINs zu beherrschen, müssen Sie jedoch viel üben. Ich empfehle, mit dem interaktiven SQL-JOINs Kurs zu beginnen, der die wichtigsten JOIN-Typen anhand von Dutzenden von Beispielen und Übungen behandelt. Erfahren Sie mehr über diesen Kurs in diesem Übersichtsartikel.

BONUS: Hier sind die 10 wichtigsten SQL JOIN-Interview-Fragen und wie man sie beantwortet.

Viel Spaß beim Lernen!