Ein Blog über Code, Hardware und Co

Wordpress und Webentwicklung, Programmieren und Entwickeln, Technik und Hardware

SQL und MySQL: Joins erklärt

sql join type structure query language model learning types vector illustration

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-ElementErläuterungBeispiel aus einer SQL-Query
SELECT AngabeHier wird grundsätzlich angegeben, dass es sich um eine SELECT-Query handelt, also um das Auslesen von DatenSELECT *
FROM AngabeHier wird angegeben, aus welcher Tabelle die Werte gelesen werden sollen (Tabelle1)FROM Table1
JOIN OperatorHier wird angegeben, welchen Join man auf welche Tabelle vollziehen will (Tabelle2)INNER JOIN Table2
ON AngabeHier 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
Tabelle 1: Erläuterung der Bestandteile einer JOIN-Query.

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_IDNameAdresseTelefon
1Holger MaierHeidekampweg 12012345678
2Peter BeeseMillerntorweg 4123543757
3Manuel MüllerBochumer Straße 3123434563
Customer-Tabelle.


Und eine Tabelle für die Bestellungen (“Orders”):

Bestell_IDKunden_IDDatum
10232021-10-10
103272021-11-11
104122021-12-12
Orders-Tabelle

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_IDBestell_IDDatumNameAdresseTelefon
31022021-10-10Manuel MüllerBochumer Straße 3123434563
Kombinierte Ergebnis-Tabelle.

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-MethodeErläuterung
LEFT JOINEin 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 JOINDer 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 JOINBei 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 JOINBei einem FULL JOIN werden alle Datensätze in der Ergebnistabelle aggregiert, egal, ob es eine Übereinstimmung im Schlüssel gibt, oder nicht.
Tabelle 1: Gegenüberstellung der JOIN-Methoden von SQL.

Ü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

sql join type structure query language model learning types vector illustration

Ü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_IDProduktnamePreis
1Taschenrechner35€
2Buch10€
3Headset15€
4Notizblock5€

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_IDKunden_IDDatumProdukt_ID
10232021-10-102
103272021-11-111
104122021-12-123
Orders-Tabelle

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