Zuletzt aktualisiert am 13. Dezember 2021.
Oder: So funktionieren Joins bei SQL-Abfragen und so kannst du sie nutzen.
Relationale Datenbanken sind weit verbreitet. Durch MySQL und SQL lassen sich leichte die Daten in dieser Datenbank eintragen, verwalten und abrufen.
Ein mächtiges Werkzeug bei der Abfrage von Daten auf relationalen Datenbanken sind sog. “Joins”. Dabei werden Datensätze aus verschiedenen Tabellen in einer Ergebnistabelle kombiniert, auf der dann weiter gearbeitet werden kann.
Hintergrundwissen: Was ist eine relationale Datenbank? Eine relationale Datenbank ist in Tabellenform aufgebaut. Jede Tabelle hat unterschiedliche Spalten. Jede Zeile in einer Tabelle repräsentiert einen Datensatz. Jede spalte entspricht dabei einem Wert (Attribut) des Datensatzes. Jeder Datensatz hat in der Regel ein unique-Attribut, welches eindeutig ist und als "Schlüssel" des Datensatzes fungiert. Über Schlüssel können auch über mehrere Tabellen der Datenbank hinweg Beziehungen ("Relationen") hergestellt werden. Bild 1: Schemenhafte Darstellung einer relationalen Datenbank. Die einzelnen Tabellen sind farblich abgegrenzt, jedoch mittels "kleiner Striche" ("Relationen") verbunden. Weitere Informationen findest du hier.
Was sind eigentlich Joins?
Joins sind Teile von SQL-Abfragen. Ein Join verbindet Felder aus zwei Datensätzen/Tabellen aus relationalen Datenbanken eine neue Ergebnistabelle.
Auf dieser Ergebnistabelle kann dann mit weiteren Queries gearbeitet werden.
Eine JOIN-Abfrage besteht immer aus den folgenden Elementen:
SELECT Angabe, FROM Angabe, JOIN Operator, ON Angabe
In einem Beispiel einer SQL-Abfrage:
SELECT Table1.Column2, Table2.Column1 FROM Table1 INNER JOIN Table2 ON Table1.MatchingColumn = Table2.MatchingColumn
Erläuterung der Elemente einer JOIN-Query:
Query-Element | Erläuterung | Beispiel aus einer SQL-Query |
---|---|---|
SELECT Angabe | Hier wird grundsätzlich angegeben, dass es sich um eine SELECT-Query handelt, also um das Auslesen von Daten | SELECT * |
FROM Angabe | Hier wird angegeben, aus welcher Tabelle die Werte gelesen werden sollen (Tabelle1) | FROM Table1 |
JOIN Operator | Hier wird angegeben, welchen Join man auf welche Tabelle vollziehen will (Tabelle2) | INNER JOIN Table2 |
ON Angabe | Hier werden die Spalten aus Tabelle 1 und Tabelle2 angegeben, die aufeinander gematcht werden sollen. Die Spalten dienen als Schlüssel, es werden nur die Datensätze aggregiert, bei denen die Spalte aus Tabelle 1 und die Spalte aus Tabelle 2 identisch sind! | ON Table1.MatchingColumn = Table2.MatchingColumn |
Ein Praxisbeispiel:
Stellen wir uns vor, wir haben einen Onlineshop. Sämtliche Kunden und Bestellungen dieses Shops sind in einer relationalen Datenbank gespeichert.
Es gibt eine Tabelle für die Kunden (“Customer”):
Kunden_ID | Name | Adresse | Telefon |
---|---|---|---|
1 | Holger Maier | Heidekampweg 12 | 012345678 |
2 | Peter Beese | Millerntorweg 4 | 123543757 |
3 | Manuel Müller | Bochumer Straße 3 | 123434563 |
Und eine Tabelle für die Bestellungen (“Orders”):
Bestell_ID | Kunden_ID | Datum |
---|---|---|
102 | 3 | 2021-10-10 |
103 | 27 | 2021-11-11 |
104 | 12 | 2021-12-12 |
Was ist das verbindende Element dieser beiden Tabellen? Richtig, die Kunden_ID. Die Kunden_ID ist damit der Schlüssel. Wir können nun mit einem INNER JOIN alle Datensätze ausgeben, die jeweils in der Spalte “Kunden_ID” den gleichen Wert haben.
Die Query sieht dann wie folgt aus:
SELECT Orders.Kunden_ID, Orders.Bestell_ID, Orders.Datum, Customer.Name, Customer.Adresse, Customer.Telefon
FROM Orders
INNER JOIN Customer ON Orders.Kunden_ID=Customers.Kunden_ID;
Die Ergebnistabelle sieht dann wie folgt aus:
Kunden_ID | Bestell_ID | Datum | Name | Adresse | Telefon |
---|---|---|---|---|---|
3 | 102 | 2021-10-10 | Manuel Müller | Bochumer Straße 3 | 123434563 |
Die Unterschiedlichen Join-Methoden
Oder: Was sind LEFT JOIN, RIGHT JOIN, INNER JOIN und FULL JOIN?
Mit Joins kann man in einer Abfrage unterschiedliche Tabellen miteinander Kombinieren und erhält als Ergebnis EINE Ergebnistabelle. Es gibt dabei verschiedene Möglichkeiten, Tabellen zu vereinen.
Begriffserklärung: Was ist ein Tupel? Ein Tupel ist eine Liste von Objekten. In diesem Fall eine Row aus der neuen Ergebnistabelle. Ein Tupel ist also ein Datensatz aus der Ergebnistabelle.
Join-Methode | Erläuterung |
---|---|
LEFT JOIN | Ein LEFT JOIN gibt in der Ergebnistabelle ALLE Records/Tupel aus der Ausgangstabelle (Tabelle 1) aus. Für Datensätze, bei denen die Bedingung des “ON”-Elements übereinstimmt, werden die entsprechenden Spalten/Felder gefüllt. Bei Datensätzen aus Tabelle1, bei denen es keine Übereinstimmung des Schlüssels in Tabelle2 gibt, werden in der Ergebnistabelle die Felder mit “NULL” gefüllt. |
RIGHT JOIN | Der RIGHT JOIN gibt in der Ergebnistabelle alle Werte aus Tabelle 2 aus, sowie alle Werte aus Tabelle 1, bei denen der Schlüssel übereinstimmt. Die Werte bei Datensätzen, bei denen der Schlüssel nicht übereinstimmt, werden auch hier mit “NULL” gefüllt. |
INNER JOIN | Bei einem INNER JOIN werden alle Tupel ausgegeben bzw. in der Ergebnistabelle abgebildet, bei denen die angegebenen Felder des “ON”-Elements übereinstimmen. Also alle Tupel, wo “Table1.MatchingColumn = Table2.MatchingColumn” gilt. |
FULL JOIN | Bei einem FULL JOIN werden alle Datensätze in der Ergebnistabelle aggregiert, egal, ob es eine Übereinstimmung im Schlüssel gibt, oder nicht. |
Übrigens: LEFT JOIN bzw. RIGHT JOIN werden Synonym zu LEFT OUTER JOIN und RIGHT OUTER JOIN verwendet.
Die folgende Grafik erklärt bildlich sehr schnell, wie sich die unterschiedlichen Joins auf die Ergebnistabelle auswirken: Die
Überblick aller Joins im Video
Hier findest du eine exzellente Gegenüberstellung der einzelnen JOINS im Video und eine gute Erklärung.
Was ist ein LEFT JOIN?
Und wofür verwendet man einen LEFT JOIN? Wie wendet man einen LEFT JOIN an?
Die Erklärung eines LEFT JOIN im Video:
Was ist ein RIGHT JOIN?
Und wofür verwendet man einen RIGHT JOIN? Wie wendet man einen RIGHT JOIN an?
Die Erklärung eines RIGHT JOIN im Video:
Was ist ein INNER JOIN?
Und wofür verwendet man einen INNER JOIN? Wie wendet man einen INNER JOIN an?
Die Erklärung eines INNER JOIN im Video:
Was ist ein FULL JOIN?
Und wofür verwendet man einen FULL JOIN? Wie wendet man einen FULL JOIN an?
Die Erklärung des FULL JOIN im Video:
Multiple Joins – Mehrere Joins in einer Query
Oder: Wie kann ich mehrere JOINs in einer Query nutzen?
Wenn man die Möglichkeiten von JOINs in Abfragen erkennt, und damit zu arbeiten lernt, gelangt man schnell an den Punkt, an dem man mehrere Joins über verschiedene Tabellen hinweg in einer Query ausführen möchte.
Und das ist problemlos möglich. Im Prinzip ist es möglich, einfach mehrere Joins wie oben beschrieben direkt hintereinander in einer Query hintereinander durchzuführen. In der Praxis sorgt das – vor allem bei komplexeren Queries – jedoch schnell zu unübersichtlichen und verwirrenden Abfragestrings.
Ich empfehle daher, auf jeden Fall folgende Funktionalität zu nutzen: (My)SQL bietet die Möglichkeit, gejointe Tabellen in einer Query mit einem Alias zu versehen. Dafür wird der Befehl “AS” genutzt.
Bleiben wir bei unserem Beispiel oben mit den Kunden und Bestellungen und ergänzen sie um die weitere Tabelle “Produkte”. Wir wollen nun ebenfalls abfragen, welches Produkt bestellte worden ist (wir gehen der Einfachheit halber davon aus, dass nur ein Produkt je Bestellung möglich ist).
Die Tabelle “Produkte” sieht der Vollständigkeit halber z.B: so aus:
Produkt_ID | Produktname | Preis |
---|---|---|
1 | Taschenrechner | 35€ |
2 | Buch | 10€ |
3 | Headset | 15€ |
4 | Notizblock | 5€ |
Wir ergänzen ausserdem die Tabelle “Orders” um eine Spalte mit einer “Produkt_ID”, die das Produkt enthält, welches der Kunde in der jeweiligen Bestellung gekauft hat:
Bestell_ID | Kunden_ID | Datum | Produkt_ID |
---|---|---|---|
102 | 3 | 2021-10-10 | 2 |
103 | 27 | 2021-11-11 | 1 |
104 | 12 | 2021-12-12 | 3 |
Die Query könnte dann wie folgt aussehen:
SELECT o.Kunden_ID, o.Bestell_ID, o.Datum, c.Name, c.Adresse, c.Telefon, p.Preis
FROM Orders AS o
INNER JOIN Customer AS c ON o.Kunden_ID=c.Kunden_ID INNER JOIN Produkte AS p ON o.Produkt_ID=p.Produkt_ID;
Schreibe eine Antwort