Haben Sie sich jemals gefragt, wie Multiple Joins funktionieren? Möchten Sie wissen, wie man mehrere Tabellen in einer Abfrage verbindet? Lesen Sie diesen Artikel, um es herauszufinden!
Wenn Sie gerade erst mit SQL beginnen, haben Sie vielleicht Schwierigkeiten, das Konzept von SQL JOIN
zu verstehen, besonders wenn Sie mehr als zwei Tabellen in einer Abfrage verbinden müssen. Aber keine Sorge! In diesem Artikel werden wir untersuchen, wie JOIN
funktioniert und alle seine Geheimnisse lösen!
Der beste Weg, SQL zu lernen, ist die Praxis. Wenn Sie das Verbinden von Tabellen in SQL beherrschen wollen, besuchen Sie unseren interaktiven SQL-JOINs Kurs. Er bietet über 90 praktische Übungen, mit denen Sie viele verschiedene Arten von JOINs schreiben können.
Beginnen wir mit einem Beispiel
Stellen Sie sich vor, Sie haben die folgenden drei Tabellen: player
, team
, und coach
.
Erstellen wir eine Abfrage, die die Namen aller Spieler, den Namen ihrer Mannschaft und den Namen ihres Trainers auflistet. Sie können alle diese Informationen mit der folgenden Abfrage abrufen:
SELECT player.name, team.name, coach.nameFROM playerJOIN teamON player.team_id = team.idJOIN coachON team.coach_id = coach.id;
Wir haben hier zwei verschiedene JOIN
Operationen. Die Tabellen player
und team
werden zuerst verbunden, dann wird auch die Tabelle coach
verbunden.
Um eine Verknüpfungsbedingung zu erstellen, müssen beide verknüpften Tabellen eine Spalte haben, die die gleichen Informationen enthält. Die Spalte team_id
in der Tabelle player
Tabelle enthält die team_id
; dies ist derselbe Wert wie die id-Spalte in der team
Tabelle. Die erste Join-Bedingung lautet also ON player.team_id = team.id
Ebenso ist die Verknüpfung zwischen der team
und der coach
Tabelle ist ON team.coach_id = coach.id
.
Wenn Sie Schwierigkeiten haben, sich die genaue Syntax für SQL-JOINs zu merken, sollten Sie sich unser SQL JOIN Cheat Sheet merken!
Wie die Verknüpfung mehrerer Tabellen funktioniert
Nehmen wir an, dass wir die folgenden Daten in unseren Tabellen haben:
coach | |
---|---|
id | name |
1 | Mark Swanson |
2 | Alice Wright |
team | ||
---|---|---|
id | name | coach_id |
1 | Ambitious Raptors | 2 |
2 | Fire Pandas | 1 |
3 | Steel Cats | 2 |
player | ||
---|---|---|
id | name | team_id |
1 | John Rodger | 1 |
2 | Paul Smith | 1 |
3 | David McDonald | 2 |
4 | Sarah Grey | 3 |
5 | Sophie Brown | 3 |
Führen wir nun die Abfrage aus, die die Namen aller Spieler, den Namen ihres Teams und den Namen ihres Trainers auflistet:
SELECT player.name, team.name, coach.nameFROM playerJOIN teamON player.team_id = team.idJOIN coachON team.coach_id = coach.id;
Wir erhalten die folgende Tabelle als Ergebnis:
player.name | team.name | coach.name |
---|---|---|
John Rodger | Ambitious Raptors | Alice Wright |
Paul Smith | Ambitious Raptors | Alice Wright |
David McDonald | Fire Pandas | Mark Swanson |
Sarah Grey | Steel Cats | Alice Wright |
Sophie Brown | Steel Cats | Alice Wright |
Okay, aber was passiert eigentlich "unter der Haube", wenn zwei Tabellen verbunden werden? Schauen wir uns unser Beispiel einmal genauer an.
Erstens, die JOIN
der Tabellen player
und team
Tabellen eine "virtuelle Tabelle". Diese sieht in etwa wie folgt aus:
player.id | player.name | player.team_id | team.id | team.name | team.coach_id |
---|---|---|---|---|---|
1 | John Rodger | 1 | 1 | Ambitious Raptors | 2 |
2 | Paul Smith | 1 | 1 | Ambitious Raptors | 2 |
3 | David McDonald | 2 | 2 | Fire Pandas | 1 |
4 | Sarah Grey | 3 | 3 | Steel Cats | 2 |
5 | Sophie Brown | 3 | 3 | Steel Cats | 2 |
Wie Sie sehen können, enthält diese "virtuelle Tabelle" alle Spalten aus den Tabellen player
und team
Tabellen.
Hey, wir haben in dieser Beispielabfrage 3 Tabellen verbunden! Was ist mit der coach
Tabelle? Das ist ganz einfach! Wir haben bereits eine "virtuelle Tabelle", die aus den Tabellen player
und team
zusammengesetzt ist, und es sieht so aus, als ob wir wieder eine Verknüpfung von zwei Tabellen haben - nur dieses Mal verbinden wir die coach
Tabelle mit der "virtuellen Tabelle". Die endgültige verknüpfte Tabelle wird also so aussehen:
player.id | player.name | player.team_id | team.id | team.name | team.coach_id | coach.id | coach.name |
---|---|---|---|---|---|---|---|
1 | John Rodger | 1 | 1 | Ambitious Raptors | 2 | 2 | Alice Wright |
2 | Paul Smith | 1 | 1 | Ambitious Raptors | 2 | 2 | Alice Wright |
3 | David McDonald | 2 | 2 | Fire Pandas | 1 | 1 | Mark Swanson |
4 | Sarah Grey | 3 | 3 | Steel Cats | 2 | 2 | Alice Wright |
5 | Sophie Brown | 3 | 3 | Steel Cats | 2 | 2 | Alice Wright |
Die Spalten, die zur "virtuellen Tabelle" gehören (die Verknüpfung der Tabellen player
und team
) sind orange dargestellt; die Spalten der coach
Tabelle sind blau dargestellt.
Wichtig: Wenn wir eine andere Tabelle verknüpfen, sollte die Verknüpfungsbedingung eine Spalte enthalten, die mit einer Spalte aus einer der zuvor verknüpften Tabellen übereinstimmt. In unserem Beispiel wird die coach
Tabelle mit der virtuellen Tabelle verbunden, indem die ID des Trainers verwendet wird, die in der coach
Tabelle und in der team
Tabelle vorhanden ist. Sie war also in der "virtuellen Tabelle" vorhanden. Sie können sich vorstellen, dass die verknüpften Tabellen durch Verknüpfungsbedingungen miteinander "verbunden" sind:
Natürlich müssen wir nicht alle Spalten der verbundenen Tabelle anzeigen. In JOIN-Abfragen geben wir normalerweise an, welche Spalten wir sehen möchten. Beachten Sie, dass wir dies in der obigen Beispielabfrage getan haben: Nur der Name des Spielers, der Name der Mannschaft und der Name des Trainers wurden angezeigt.
Kreuzungstabellen
Eine Verknüpfungstabelle ist eine Tabelle, die zwei oder mehr Tabellen miteinander verbindet. Bei vielen Verknüpfungen mehrerer Tabellen wird eine Verbindungstabelle verwendet. Klingt vage? Sehen wir es uns in Aktion an.
Stellen Sie sich vor, Sie haben die Tabellen author
und book
. Ein Autor könnte viele Bücher geschrieben haben, und ein Buch kann viele Autoren haben. Um eine solche Beziehung zu modellieren (wir nennen sie eine Many-to-many-Beziehung), brauchen wir eine dritte Tabelle: author_book
. Der einzige Zweck dieser Tabelle ist die Verbindung der Tabellen author
und book
Tabellen miteinander zu verbinden. Die Tabelle author_book
Tabelle ist ein Beispiel für eine Verbindungstabelle.
Nehmen wir an, dass wir die folgenden Daten in unseren Tabellen haben:
author | |
---|---|
id | name |
1 | Sarah Green |
2 | Martin Davis |
3 | Steve Johnson |
book | |
---|---|
id | name |
1 | The Translucent Door |
2 | Whisper of Dawn |
3 | To Catch a Dream |
author_book | |
---|---|
author_id | book_id |
1 | 1 |
2 | 1 |
1 | 2 |
3 | 2 |
2 | 3 |
Wenn Sie die Tabellen author
und book
verbinden wollen, müssen Sie auch die Verzweigungstabelle author_book
. Um zum Beispiel alle Autoren und ihre Bücher aufzulisten, können Sie eine Abfrage wie diese schreiben:
SELECT author.name, book.nameFROM authorJOIN author_bookON author.id = author_book.author_idJOIN bookON book.id = author_book.book_idORDER BY author.name;
Zuerst wird die author_book
Tabelle wird mit der author
verbunden, um eine "virtuelle Tabelle" zu bilden. Dann wird die book
Tabelle mit der "virtuellen Tabelle" verbunden.
Wenn Sie Tabellen verbinden, die durch eine Verbindungstabelle verknüpft sind, müssen Sie sicherstellen, dass Sie die Nicht-Verbindungstabellen mit der Verbindungstabelle verbinden. In unserem Beispiel, author
wird verbunden mit author_book
. Dann wird book
ebenfalls verknüpft. Wenn Sie eine Kreuzungstabelle in Ihrer Datenbank haben, werden die Joins, die diese Tabellen betreffen, normalerweise drei oder mehr Tabellen umfassen.
Das Ergebnis der Abfrage sieht wie folgt aus. Die Spalten der Kreuzungstabelle sind im Ergebnis nicht zu sehen, aber die Verknüpfung ist wichtig, damit die Abfrage korrekt funktioniert:
author.name | book.name |
---|---|
Sarah Green | The Translucent Door |
Martin Davis | The Translucent Door |
Sarah Green | Whisper of Dawn |
Steve Johnson | Whisper of Dawn |
Martin Davis | To Catch a Dream |
Eine Kreuzungstabelle mit zusätzlichen Spalten
Im obigen Beispiel waren die einzigen Spalten in der Kreuzungstabelle die Spalten, die auf andere Tabellen verweisen. Dies muss jedoch nicht der Fall sein! Die Kreuzungstabelle kann auch andere Felder enthalten. In diesen Feldern werden zusätzliche Informationen über die Beziehung gespeichert.
Schauen wir uns ein Beispiel an. Diesmal haben wir die folgenden 3 Tabellen: doctor
, patient
und appointment
. Können Sie erraten, welche Tabelle hier die Kreuzungstabelle ist?
Sie haben Recht! Die Kreuzungstabelle ist die appointment
Tabelle. Sie verbindet Ärzte mit ihren Patienten, um Termine zu vereinbaren. Allerdings benötigt die appointment
Tabelle braucht aber auch zusätzliche Spalten, z. B. Datum und Uhrzeit des Termins.
Nehmen wir an, dass wir die folgenden Daten in unseren Tabellen haben:
doctor | |
---|---|
id | name |
1 | Ann Johnson |
2 | Marlene Smith |
3 | John West |
patient | |
---|---|
id | name |
1 | Mary Brown |
2 | Sally Rodgers |
3 | Mark Jackson |
appointment | ||||
---|---|---|---|---|
id | doctor_id | patient_id | date | time |
1 | 1 | 1 | 16/04/2023 | 8:00 |
2 | 1 | 3 | 16/04/2023 | 9:00 |
3 | 2 | 2 | 17/04/2023 | 8:00 |
4 | 2 | 1 | 17/04/2023 | 9:00 |
5 | 3 | 3 | 17/04/2023 | 16:00 |
Nun wollen wir eine Abfrage erstellen, die den Ärzten bei der Verwaltung ihres Terminkalenders hilft: Für jeden Arzt möchten wir alle Daten und Uhrzeiten seiner Termine sowie den Namen des jeweiligen Patienten sehen. Mit der folgenden Abfrage können Sie all diese Informationen abrufen:
SELECT doctor.name, appointment.date, appointment.time, patient.nameFROM doctorJOIN appointmentON doctor.id = appointment.doctor_idJOIN patientON appointment.patient_id = patient.id;
Zuerst wird die appointment
Tabelle wird mit der doctor
Tabelle verbunden, um eine "virtuelle Tabelle" zu bilden. Dann wird die patient
Tabelle mit der "virtuellen Tabelle" verbunden, indem auf die Kreuzungstabelle verwiesen wird appointment
.
Das Ergebnis der Abfrage würde wie folgt aussehen:
doctor.name | appointment.date | appointment.time | patient.name |
---|---|---|---|
Ann Johnson | 16/04/2023 | 8:00 | Mary Brown |
Ann Johnson | 16/04/2023 | 9:00 | Mark Jackson |
Marlene Smith | 17/04/2023 | 8:00 | Sally Rodgers |
Marlene Smith | 17/04/2023 | 9:00 | Mary Brown |
John West | 17/04/2023 | 16:00 | Mark Jackson |
Eine 3-Wege-Kreuzungstabelle
Kreuzungstabellen können auch drei oder mehr Tabellen miteinander verbinden. Stellen Sie sich zum Beispiel vor, dass ein Arzt an verschiedenen Klinikstandorten arbeitet. Wenn Sie einen Termin vereinbaren, wird Ihnen ein Arzt zugewiesen, aber Sie müssen auch die Klinik auswählen, in der der Termin stattfinden wird. Also würde unsere appointment
Tabelle würde nun drei Tabellen verknüpfen: doctor
, patient
und clinic
.
In diesem Szenario werden viele Abfragen die Verknüpfung aller vier Tabellen erfordern. In manchen Situationen können Kreuzungstabellen sogar noch mehr Tabellen verbinden.
Lasst uns ein paar Tabellen verbinden!
Gut gemacht! Sie haben gerade gelernt, wie man mehrere JOINs in einer SQL-Abfrage verwendet.
Lassen Sie uns zusammenfassen, was wir gerade gelernt haben:
- Ein Drei-Tabellen-JOIN ist ein JOIN von zwei Tabellen mit einem weiteren Join. Der JOIN von zwei Tabellen bildet eine "virtuelle Tabelle", mit der die andere Tabelle verbunden wird.
- Die Join-Bedingung ist normalerweise eine Gleichheit zwischen einigen Spalten in einer Tabelle, die Werte mit Spalten in der anderen Tabelle teilen.
- Wenn Sie mehr als zwei Tabellen verknüpfen, müssen Sie in den meisten Fällen sicherstellen, dass die Verknüpfungsbedingung mit den bereits verknüpften Tabellen "verlinkt" ist.
- Eine Verzweigungstabelle ist eine Tabelle, die zwei oder mehr andere Tabellen miteinander verbindet, indem sie auf die IDs der betreffenden Tabellen verweist. Wenn eine Kreuzungstabelle beteiligt ist, müssen Sie wahrscheinlich einen Multi-Table-Join verwenden.
Wenn Sie mehr über SQL-JOINs erfahren möchten, werfen Sie einen Blick auf diese Artikel in unserem Blog:
- Lernen Sie einige Tipps, wie Sie SQL-JOINs üben können.
- Entdecken Sie Beispiele für SQL-JOINs mit detaillierten Erklärungen.
- Verstehen Sie, wie inner SQL JOIN funktioniert.
Und um noch mehr zu üben, schauen Sie sich unseren SQL-JOINs interaktiven Kurs!