Zurück zur Artikelliste Artikel
10 Leseminuten

Wie man 3 Tabellen (oder mehr) in SQL verbindet

Die Verwendung von JOIN in SQL bedeutet nicht, dass du nur zwei Tabellen verbinden kannst. Du kannst drei, vier oder sogar mehr Tabellen verbinden! Die Möglichkeiten sind grenzenlos.

Wenn du gerade JOINs in SQL gelernt hast, denkst du vielleicht, dass es auf zwei Tabellen beschränkt ist. Das ist nicht verwunderlich - dieses Konzept kann schwer zu verstehen sein. Und die Vorstellung, dass JOINs noch komplizierter werden können, mag anfangs wirklich beängstigend wirken. Die Wahrheit ist, dass du diese Idee leicht auf drei oder mehr Tabellen ausweiten kannst. Schau dir die folgende Abfrage an:

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Kurs.Name
FROM Schueler
JOIN Studentenkurs
  ON Schueler.id = Studentenkurs.Schueler_Id
JOIN Kurs
  ON Kurs.id = Studentenkurs.Kurs_Id;

Wir haben einfach die JOIN Klausel wiederholt und drei Tabellen verbunden. Im nächsten Abschnitt gehen wir näher auf die Abfrage und die Tabellen ein.

Bevor wir jedoch fortfahren, empfehle ich dir dringend, SQL JOINs vollständig zu verstehen. Das Konzept, das ich dir jetzt erklären werde, beruht stark auf Grundkenntnissen. Wenn du noch nicht so weit bist, schau dir den SQL-JOINs Kurs auf LearnSQL.de an.

Die Daten kennenlernen

Zuerst stellen wir ein paar Tabellen vor. Hier ist das Schema:

Im obigen Entity-Relationship-Diagramm (ERD) siehst du Tabellen, ihre Spalten, die Datentypen der Spalten und die Verweise zwischen den Tabellen. Zum Beispiel gibt es eine Referenz zwischen den Tabellen Schueler und Studentenkurs - jeder Schüler kann mit mehreren Zeilen in der Studentenkurs-Tabelle verknüpft sein. Weitere Informationen zum Lesen eines Schemas findest du im Artikel Crow's Foot Notation auf dem Vertabelo Blog.

Unsere Beispieldaten werden in vier Tabellen gespeichert, wobei wir uns zunächst auf die ersten drei Tabellen konzentrieren:

  • Schueler - Sie enthält Informationen über die Schüler:
    • id - Die ID des Schülers/der Schülerin.
    • Vorname - Den Vornamen des Schülers/der Schülerin.
    • Nachname - Der Nachname des Schülers/der Schülerin.
  • Studentenkurs - Enthält Informationen darüber, welche Schüler/innen welche Kurse besuchen:
    • Schueler_Id - Die ID des Schülers/der Schülerin.
    • Kursnummer - Die ID des Kurses.
  • Kurs - Enthält Informationen über die Kurse:
    • id - Die ID des Kurses.
    • Name - Der Name des Kurses.
    • Lehrer_Id - Die ID der Lehrkraft für diesen Kurs.

Wir werden die Lehrer Tabelle im weiteren Verlauf des Kurses in fortgeschritteneren Abfragen verwenden. Ich werde sie dann erklären. In der Zwischenzeit kannst du dir die Beispieldaten aus diesen drei Tabellen ansehen:

Schueler

idVornameNachname
1ShreyaBain
2RiannaFoster
3YosefNaylor

Studentenkurs

Schueler_IdKursnummer
12
13
21
22
23
31

Kurs

idNameLehrer_Id
1Datenbankdesign1
2Englische Literatur2
3Python-Programmierung1

Kreuzungstabellen

Es ist wichtig zu wissen, dass die Studentenkurs-Tabelle eine Kreuzungstabelle ist. Der einzige Zweck dieser Tabelle ist die Verbindung der Schueler- und Kurs-Tabellen.

Zum Beispiel ist "Shreya Bain" (die Schülerin mit id = 1) mit "Englische Literatur" (der Kurs mit id = 2) und "Python-Programmierung" (der Kurs mit id = 3) verbunden. Woher wissen wir das? Sieh dir die ersten beiden Zeilen in der Studentenkurs-Tabelle an. In der ersten Zeile steht, dass der Schüler mit der ID 1 (SpalteSchueler_Id ) mit einem Kurs mit der ID 2 (SpalteKursnummer ) verbunden ist. In der zweiten Zeile sehen wir, dass der Schüler mit der ID 1 mit dem Kurs mit der ID 3 verbunden ist. Wenn wir uns die Schueler-Tabelle ansehen, können wir feststellen, dass Shreya Bain die ID 1 hat. Schließlich können wir in der Kurs-Tabelle sehen, dass "Englische Literatur" und "Python-Programmierung" die IDs 2 bzw. 3 haben.

Die Beziehung zwischen den Schueler- und Kurs-Tabellen wird als Many-to-Many-Beziehung bezeichnet. Ein/e Schüler/in kann viele Kurse besuchen (d.h. es können viele Zeilen mit der gleichen Schueler_Id in der Tabelle Studentenkurs) stehen und ein Kurs kann von vielen Schülern besucht werden (d. h. viele Zeilen in der Tabelle Studentenkurs können die gleiche Kursnummer haben).

Wir haben bereits gesehen, wie die Kreuzungstabelle verwendet wird. Sieh dir den Code noch einmal an:

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Kurs.Name
FROM Schueler
JOIN Studentenkurs
  ON Schueler.id = Studentenkurs.Schueler_Id
JOIN Kurs
  ON Kurs.id = Studentenkurs.Kursnummer;

Wie du sehen kannst, verwenden wir die Schueler-Tabelle in der FROM Klausel. Dann verknüpfen wir sie mit der Studentenkurs-Tabelle und schließlich mit der Kurs-Tabelle. Auf diese Weise können wir den Vor- und Nachnamen jedes Schülers/jeder Schülerin zusammen mit den Kursen, die er/sie besucht, anzeigen. Ist der Code immer noch verwirrend? Keine Sorge - wir werden ihn im nächsten Abschnitt ausführlich erklären.

Das Ergebnis dieser Abfrage sieht wie folgt aus:

VornameNachnameName
ShreyaBainEnglische Literatur
ShreyaBainPython-Programmierung
RiannaFosterDatenbankdesign
RiannaFosterEnglische Literatur
RiannaFosterPython-Programmierung
YosefNaylorDatenbankdesign

Wenn du deine eigenen Abfragen schreiben willst, die mehrere Tabellen verbinden, musst du genau verstehen, was in dieser Abfrage passiert. Zerlegen wir unsere Abfrage in einzelne Schritte.

Drei Tabellen mit einer Verbindungstabelle verknüpfen

Schritt 1

Der erste Schritt besteht darin, das Schema zu betrachten und die Spalten auszuwählen, die wir anzeigen wollen. Da wir die Schüler/innen zusammen mit ihren Kursen anzeigen wollen, benötigen wir drei Spalten: Schueler.Vorname, Schueler.Nachname, und Kurs.Name.

Es ist wichtig, dass du Tabellennamen verwendest, wenn du deine Spalten auflistest. Auf diese Weise verlierst du dich nicht in den verschiedenen Spaltennamen und weißt sofort, welche Spalte zu welcher Tabelle gehört.

An dieser Stelle sollte unsere Abfrage so aussehen:

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Kurs.Name

Schritt 2

Im nächsten Schritt müssen wir festlegen, welche Tabellen für die Abfrage benötigt werden. Es gibt zwei offensichtliche Tabellen: Schueler und Kurs. Wir müssen jedoch einen Weg finden, diese Tabellen zu verknüpfen. Ein Blick auf das Datenbankschema zeigt uns, dass Studentenkurs eine Verbindungstabelle zwischen diesen beiden Tabellen ist. Wir brauchen also auch diese Tabelle.

Schritt 3

Im letzten Teil müssen wir alle Tabellen miteinander verbinden. Die erste Aufgabe besteht darin, die Tabelle auszuwählen, die in die FROM Klausel aufgenommen werden soll. Theoretisch kann das jede der Tabellen sein, die wir verwenden. Ich persönlich beginne am liebsten mit einer Tabelle, die keine Kreuzungstabelle ist. In diesem Fall entscheiden wir uns für die Schueler-Tabelle.

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Kurs.Name
FROM Schueler

Jetzt können wir die Tabelle Kurs noch nicht verbinden. Es gibt keine direkte Verbindung zwischen diesen beiden Tabellen. Deshalb müssen wir für uns die Studentenkurs-Tabelle verwenden. Wir können diese beiden Tabellen einfach mit der Anweisung JOIN … ON … miteinander verbinden. Unser Code nimmt Gestalt an:

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Kurs.Name
FROM Schueler
JOIN Studentenkurs
  ON Schueler.id = Studentenkurs.Schueler_Id

Bevor wir mit dem Hinzufügen der letzten Tabelle fortfahren, sollten wir darüber nachdenken, was wir bereits erreicht haben. Beachte, dass wir beim Schreiben einer JOIN Klausel nicht auf die Spalten in der SELECT-Klausel beschränkt sind - wir haben Zugriff auf alle Spalten! Unsere Abfrage sieht also wie folgt aus:

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Schueler.id,
  Studentenkurs.Schueler_Id,
  Studentenkurs.Kursnummer
FROM Schueler
JOIN Studentenkurs
  ON Schueler.id = Studentenkurs.Schueler_Id;

Diese Abfrage zeigt fast alle Spalten, die wir beim Schreiben der nächsten JOIN Anweisung verwenden können. (Ich habe die Spalte Studentenkurs.id entfernt, da wir sie nicht brauchen.) Sieh dir die Daten an, mit denen wir arbeiten:

VornameNachnameidSchueler_IdKursnummer
ShreyaBain112
ShreyaBain113
RiannaFoster221
RiannaFoster222
RiannaFoster223
YosefNaylor331

So sehen unsere Daten in der Mitte des Schrittes aus. Es ist oft gut, an diesem Punkt über die Daten nachzudenken. Vielleicht möchtest du von Zeit zu Zeit eine solche Abfrage schreiben, um die Zeilen und Spalten zu analysieren.

Das obige Ergebnis sollte deutlich machen, was wir als Nächstes tun müssen. Wir haben die Schüler/innen mit den IDs der Kurse verbunden, die sie belegen. Das Einzige, was wir noch hinzufügen müssen, sind die Kursinformationen. Wir wissen, dass die Spalte Kursnummer sich in der Studentenkurs-Tabelle befindet. Wir müssen sie mit der Spalte id aus der Tabelle Kurs-Tabelle verbinden. Die resultierende Abfrage sieht wie folgt aus:

SELECT
  Schueler.Vorname,
  Schueler.Nachname,
  Kurs.Name
FROM Schueler
JOIN Studentenkurs
  ON Schueler.id = Studentenkurs.Schueler_Id
JOIN Kurs
  ON Kurs.id = Studentenkurs.Kursnummer;

Und wir haben es geschafft! Das ist die Abfrage, die wir schreiben wollten. Vergiss nur nicht das Semikolon am Ende deines Codes.

In diesem Beispiel haben wir analysiert, wie man eine Abfrage mit Equi JOIN schreibt - wir verwenden Gleichheit in unseren Verknüpfungsbedingungen. Dies ist die häufigste Art von JOIN. Du kannst aber auch Non-equi JOINs verwenden. Wenn du diesen Begriff nicht kennst, empfehle ich dir einen Blick in Ein illustrierter Leitfaden für den SQL Non Equi Join auf dem LearnSQL.de Blog.

SQL-Tabellen ohne Kreuzungstabelle verbinden

Wenn du mehr als zwei Tabellen verbindest, wirst du nicht immer eine Verbindungstabelle haben. Aber bevor wir eine Beispielabfrage für diese Technik analysieren, lass uns die letzte Tabelle in unserem Schema überprüfen.

  • Lehrer - Enthält Informationen über die Lehrkräfte:
    • id - Die ID der Lehrkraft.
    • Vorname - Den Vornamen der Lehrkraft.
    • Nachname - Den Nachnamen der Lehrkraft.

Und so sieht die Lehrer Tabelle aus:

idVornameNachname
1TaylahBooker
2Sarah-LouiseBlake

Anhand der Daten möchten wir nun jeden Lehrer mit seinen Schülern anzeigen. Jedes Lehrer-Schüler-Paar sollte nur einmal angezeigt werden (wenn z. B. ein Lehrer mehr als einen Kurs mit einem Schüler hat, sollte der Lehrer nur einmal mit dem Schüler im Ergebnis angezeigt werden).

Diese Abfrage ist der vorherigen ziemlich ähnlich. Deshalb folgen wir denselben Schritten wie zuvor.

Schritt 1

Zuerst wählen wir die Spalten aus: Lehrer.Vorname, Lehrer.Nachname, Schueler.Vorname, und Schueler.Nachname. Dann wählen wir die benötigten Tabellen aus. Dieses Mal werden es alle Tabellen aus unserem Schema sein: Schueler, Studentenkurs, Kurs und Lehrer.

Schritt 2

Jetzt müssen wir alle Tabellen verbinden. Wie ich schon sagte, können wir mit jeder Tabelle beginnen, aber ich bevorzuge es, mit einer der Seiten zu beginnen. Beim letzten Mal haben wir als erstes die Schueler-Tabelle in die FROM Klausel aufgenommen. Dieses Mal verwenden wir die Lehrer-Tabelle. Bevor wir JOIN schreiben, sieht unsere Abfrage wie folgt aus. (Beachte das Schlüsselwort DISTINCT. Da wir eindeutige Lehrer-Schüler-Paare anzeigen wollen, ist das Schlüsselwort sehr wichtig).

SELECT DISTINCT
  Lehrer.Vorname,
  Lehrer.Nachname.
  Schueler.Vorname,
  Schueler.Nachname
FROM Lehrer

Schritt 3

Das Verbinden der Tabellen unterscheidet sich nicht wesentlich vom vorherigen Beispiel. Wir müssen nur die JOIN Klausel ein weiteres Mal verwenden. Bevor wir das tun, sehen wir uns die Daten nach der Verknüpfung der Lehrer- und Kurs- Tabellen an:

SELECT
  Lehrer.Vorname,
  Lehrer.Nachname,
  Lehrer.id,
  Kurs.Lehrer_Id,
  Kurs.Name,
  Kurs.id
FROM Lehrer
JOIN Kurs
  ON Lehrer.id = Kurs.Lehrer_Id;
VornameNachnameidLehrer_IdNameid
TaylahBooker11Datenbankdesign1
TaylahBooker11Python-Programmierung3
Sarah-LouiseBlake22Englische Literatur2

Du kannst sie dir als eine einzige Tabelle vorstellen. Tatsächlich ist es eine etwas erweiterte Version der Kurs-Tabelle.

Das Verbinden von zwei weiteren Tabellen ist fast dasselbe wie der Prozess, den wir zuvor verwendet haben. Du musst einfach die gleichen zwei JOINs wie zuvor hinzufügen. Du musst nur darauf achten, dass die JOINs in der richtigen Reihenfolge geschrieben werden. Beim Join kannst du keine Spalten aus noch nicht eingeführten Tabellen verwenden.

SELECT DISTINCT
  Lehrer.Vorname,
  Lehrer.Nachname.
  Schueler.Vorname,
  Schueler.Nachname
FROM Lehrer
JOIN Kurs
  ON Lehrer.id = Kurs.Lehrer_Id
JOIN Studentenkurs
  ON Schueler.id = Studentenkurs.Schueler_Id
JOIN Schueler
  ON Studentenkurs.Kursnummer = Kurs.id;
JOIN Studentenkurs
  ON Kurs.id = Studentenkurs.Schueler_Id
JOIN Schueler
  ON Studentenkurs.Kursnummer = Schueler.id;

In dem durchgestrichenen Teil habe ich etwas Code aus der ersten Abfrage kopiert, in der wir drei Tabellen verbunden haben. In diesem Fall war der Code falsch. Obwohl die Bedingungen korrekt waren, haben wir noch nicht eingeführte Tabellen verwendet. Zum Beispiel haben wir beim Join die Studentenkurs-Tabelle mit der Schueler-Tabelle verbunden, die erst später eingeführt wird.

Unterhalb des durchgestrichenen Codes siehst du die korrekte JOIN Reihenfolge. Wir verbinden die Studentenkurs- und die Kurs-Tabellen zuerst. Dann verwenden wir die Studentenkurs-Tabelle, um sie mit der Schueler-Tabelle zu verbinden. Auf diese Weise stellen wir jede Tabelle vor, bevor wir sie in einer JOIN … ON Bedingung verwenden. Denke immer an diese wichtige Regel!

Das Ergebnis der obigen Abfrage sieht dann so aus:

VornameNachnameVornameNachname
TaylahBookerShreyaBain
TaylahBookerRiannaFoster
TaylahBookerYosefNaylor
Sarah-LouiseBlakeShreyaBain
Sarah-LouiseBlakeRiannaFoster

In diesem Fall haben wir INNER JOIN verwendet. Das bedeutet, wenn die Lehrkraft keine Schüler/innen hat, erscheint sie nicht in den Ergebnissen. Natürlich kannst du INNER JOIN auch durch einen anderen JOIN Typ ersetzen, z.B. LEFT OUTER JOIN. Wenn du mehr über LEFT JOIN erfahren möchtest, sieh dir Wie man mehrere Tabellen in SQL LEFT JOINt auf LearnSQL.de an.

Grundlagen sind der Schlüssel zu 3-Way JOINs

Wie du siehst, ist das Verbinden von drei Tabellen in SQL gar nicht so schwer, wie es klingt. Du kannst sogar so viele Tabellen verbinden, wie du willst - die Idee dahinter ist die gleiche wie beim Verbinden von nur zwei Tabellen.

Es ist sehr hilfreich, wenn du dir die Daten in der Mitte des Schrittes ansiehst und dir vorstellst, dass die Tabellen, die du bereits verbunden hast, eine einzige Tabelle sind.

Um bei komplexen JOINs erfolgreich zu sein, ist es wichtig, die grundlegenden JOINs zu verstehen. Wenn du sie gut kennst, kannst du extrem komplexe JOIN-Anweisungen schreiben. Und denk daran: Übung macht den Meister. Wenn du weitere Erklärungen oder Übungen zu JOINs in SQL benötigst, schau dir den SQL-JOINs Kurs auf LearnSQL.de an.