1. Was ist ein JOIN?
Mit JOIN können Informationen aus mehreren Tabellen in einer SQL-Abfrage kombiniert werden. Die Verbindung erfolgt normalerweise über einen Primärschlüssel und einen Fremdschlüssel.
Beispielsweise können Kundennamen aus der Tabelle kunden und Bestellinformationen aus der Tabelle bestellungen gemeinsam angezeigt werden.
kunden_id (PK)
name
bestellung_id (PK)
kunden_id (FK)
2. Unsere Beispieldaten
Tabelle: kunden
| kunden_id | name | stadt |
|---|---|---|
| 1 | Anna Müller | Berlin |
| 2 | Max Schmidt | Leipzig |
| 3 | Lisa Weber | Dresden |
| 4 | Peter Fischer | Hamburg |
Tabelle: bestellungen
| bestellung_id | kunden_id | bestelldatum | gesamtbetrag |
|---|---|---|---|
| 101 | 1 | 2026-10-01 | 120.00 |
| 102 | 2 | 2026-10-05 | 250.00 |
| 103 | 1 | 2026-10-10 | 180.00 |
| 104 | 3 | 2026-10-15 | 80.00 |
Peter Fischer hat keine Bestellung. Diese Information ist für den Unterschied zwischen INNER JOIN und LEFT JOIN wichtig.
3. INNER JOIN – Passende Datensätze
INNER JOIN zeigt nur Datensätze an, für die in beiden Tabellen eine passende Verknüpfung vorhanden ist.
SQL-Code
SELECT
kunden.name,
bestellungen.bestellung_id,
bestellungen.gesamtbetrag
FROM kunden
INNER JOIN bestellungen
ON kunden.kunden_id = bestellungen.kunden_id;
Ergebnis
| name | bestellung_id | gesamtbetrag |
|---|---|---|
| Anna Müller | 101 | 120.00 |
| Max Schmidt | 102 | 250.00 |
| Anna Müller | 103 | 180.00 |
| Lisa Weber | 104 | 80.00 |
Peter Fischer erscheint nicht, weil er keine Bestellung besitzt.
4. LEFT JOIN – Alle linken Datensätze
LEFT JOIN zeigt alle Datensätze der linken Tabelle an. Passende Daten der rechten Tabelle werden ergänzt.
Wenn kein passender Datensatz existiert, stehen in den Spalten der rechten Tabelle NULL-Werte.
SQL-Code
SELECT
kunden.name,
bestellungen.bestellung_id,
bestellungen.gesamtbetrag
FROM kunden
LEFT JOIN bestellungen
ON kunden.kunden_id = bestellungen.kunden_id;
Ergebnis
| name | bestellung_id | gesamtbetrag |
|---|---|---|
| Anna Müller | 101 | 120.00 |
| Anna Müller | 103 | 180.00 |
| Max Schmidt | 102 | 250.00 |
| Lisa Weber | 104 | 80.00 |
| Peter Fischer | NULL | NULL |
Auch Peter Fischer wird angezeigt, obwohl keine Bestellung vorhanden ist.
5. RIGHT JOIN – Alle rechten Datensätze
RIGHT JOIN zeigt alle Datensätze der rechten Tabelle an und ergänzt passende Werte aus der linken Tabelle.
SQL-Code
SELECT
kunden.name,
bestellungen.bestellung_id
FROM bestellungen
RIGHT JOIN kunden
ON bestellungen.kunden_id = kunden.kunden_id;
Ergebnis
| name | bestellung_id |
|---|---|
| Anna Müller | 101 |
| Anna Müller | 103 |
| Max Schmidt | 102 |
| Lisa Weber | 104 |
| Peter Fischer | NULL |
Hier ist kunden die rechte Tabelle. Deshalb werden alle Kunden angezeigt.
6. INNER JOIN, LEFT JOIN und RIGHT JOIN
| JOIN-Typ | Welche Datensätze erscheinen? |
|---|---|
| INNER JOIN | Nur passende Datensätze beider Tabellen |
| LEFT JOIN | Alle linken und passende rechte Datensätze |
| RIGHT JOIN | Alle rechten und passende linke Datensätze |
7. ON – Verknüpfungsbedingung
Mit ON wird angegeben, über welche Spalten die Tabellen verbunden werden.
SQL-Code
ON kunden.kunden_id = bestellungen.kunden_id
Die kunden_id aus der Tabelle kunden wird mit der kunden_id aus der Tabelle bestellungen verglichen.
8. Tabellen-Aliase mit AS
Tabellen können mit kurzen Aliasnamen versehen werden. Dadurch werden SQL-Abfragen übersichtlicher.
SQL-Code
SELECT
k.name,
b.bestellung_id,
b.gesamtbetrag
FROM kunden AS k
INNER JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id;
k steht für kunden. b steht für bestellungen.
9. JOIN mit WHERE kombinieren
Mit WHERE können auch verknüpfte Datensätze gefiltert werden.
Beispiel: Bestellungen aus Berlin
SELECT
k.name,
k.stadt,
b.bestellung_id,
b.gesamtbetrag
FROM kunden AS k
INNER JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
WHERE k.stadt = 'Berlin';
Ergebnis
| name | stadt | bestellung_id | gesamtbetrag |
|---|---|---|---|
| Anna Müller | Berlin | 101 | 120.00 |
| Anna Müller | Berlin | 103 | 180.00 |
10. Kunden ohne Bestellungen finden
LEFT JOIN kann verwendet werden, um Datensätze ohne passende Zuordnung in der zweiten Tabelle zu finden.
SQL-Code
SELECT
k.kunden_id,
k.name
FROM kunden AS k
LEFT JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
WHERE b.bestellung_id IS NULL;
Ergebnis
| kunden_id | name |
|---|---|
| 4 | Peter Fischer |
11. JOIN mit COUNT() und GROUP BY
JOIN kann mit Aggregatfunktionen kombiniert werden, um beispielsweise die Anzahl der Bestellungen pro Kunde zu berechnen.
SQL-Code
SELECT
k.name,
COUNT(b.bestellung_id) AS anzahl_bestellungen
FROM kunden AS k
LEFT JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
GROUP BY k.kunden_id, k.name
ORDER BY anzahl_bestellungen DESC;
Ergebnis
| name | anzahl_bestellungen |
|---|---|
| Anna Müller | 2 |
| Max Schmidt | 1 |
| Lisa Weber | 1 |
| Peter Fischer | 0 |
COUNT(b.bestellung_id) zählt nur vorhandene Bestellungen. Deshalb erhält Peter Fischer den Wert 0.
12. Mehrere Tabellen mit JOIN verbinden
Es können auch mehr als zwei Tabellen in einer SQL-Abfrage verbunden werden.
Weitere Beispieltabelle: bestellpositionen
| bestellung_id | produkt_id | menge |
|---|---|---|
| 101 | 1 | 2 |
| 101 | 2 | 1 |
| 102 | 2 | 3 |
Weitere Beispieltabelle: produkte
| produkt_id | produktname |
|---|---|
| 1 | Tastatur |
| 2 | Maus |
SQL-Code
SELECT
k.name,
b.bestellung_id,
p.produktname,
bp.menge
FROM kunden AS k
INNER JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
INNER JOIN bestellpositionen AS bp
ON b.bestellung_id = bp.bestellung_id
INNER JOIN produkte AS p
ON bp.produkt_id = p.produkt_id;
Ergebnis
| name | bestellung_id | produktname | menge |
|---|---|---|---|
| Anna Müller | 101 | Tastatur | 2 |
| Anna Müller | 101 | Maus | 1 |
| Max Schmidt | 102 | Maus | 3 |
Hier werden vier Tabellen miteinander verbunden: kunden, bestellungen, bestellpositionen und produkte.
13. JOIN mit ORDER BY und LIMIT
Verknüpfte Daten können sortiert und auf eine bestimmte Anzahl von Ergebnissen begrenzt werden.
Beispiel: Die zwei teuersten Bestellungen
SELECT
k.name,
b.bestellung_id,
b.gesamtbetrag
FROM kunden AS k
INNER JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
ORDER BY b.gesamtbetrag DESC
LIMIT 2;
Ergebnis
| name | bestellung_id | gesamtbetrag |
|---|---|---|
| Max Schmidt | 102 | 250.00 |
| Anna Müller | 103 | 180.00 |
14. Häufige Fehler bei JOINs
| Fehler | Erklärung |
|---|---|
| Falsche ON-Bedingung | Tabellen werden über falsche Spalten verbunden. |
| Mehrdeutige Spaltennamen | Beispielsweise kunden_id ohne Tabellenalias. |
| INNER statt LEFT JOIN | Datensätze ohne Zuordnung fehlen. |
| WHERE auf rechter Tabelle | Bei LEFT JOIN können NULL-Zeilen ausgeschlossen werden. |
| Falsche COUNT-Spalte | COUNT(*) kann bei LEFT JOIN auch Zeilen ohne Bestellung zählen. |
15. Praktische Übungen
Lösen Sie die Aufgaben mit den Tabellen kunden und bestellungen.
Aufgabe 1
Zeigen Sie alle Kundennamen mit ihren Bestellnummern an. Nur Kunden mit Bestellungen sollen erscheinen.
Lösung anzeigen
SELECT k.name, b.bestellung_id
FROM kunden AS k
INNER JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id;
Aufgabe 2
Zeigen Sie alle Kunden an, auch wenn sie keine Bestellung haben.
Lösung anzeigen
SELECT k.name, b.bestellung_id
FROM kunden AS k
LEFT JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id;
Aufgabe 3
Finden Sie alle Kunden, die noch keine Bestellung aufgegeben haben.
Lösung anzeigen
SELECT k.name
FROM kunden AS k
LEFT JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
WHERE b.bestellung_id IS NULL;
Aufgabe 4
Berechnen Sie den Gesamtumsatz pro Kunde. Kunden ohne Bestellungen sollen mit dem Wert 0 erscheinen.
Lösung anzeigen
SELECT
k.name,
COALESCE(SUM(b.gesamtbetrag), 0) AS umsatz
FROM kunden AS k
LEFT JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
GROUP BY k.kunden_id, k.name;
Aufgabe 5
Zeigen Sie Kundennamen, Bestellnummern und Bestellbeträge an. Sortieren Sie die Ergebnisse nach dem höchsten Betrag.
Lösung anzeigen
SELECT
k.name,
b.bestellung_id,
b.gesamtbetrag
FROM kunden AS k
INNER JOIN bestellungen AS b
ON k.kunden_id = b.kunden_id
ORDER BY b.gesamtbetrag DESC;
16. Zusammenfassung
Mit JOIN können Daten aus mehreren Tabellen miteinander verbunden werden. INNER JOIN zeigt nur passende Datensätze. LEFT JOIN zeigt alle Datensätze der linken Tabelle. RIGHT JOIN zeigt alle Datensätze der rechten Tabelle.
Mit ON wird die Verknüpfungsbedingung festgelegt. JOIN kann mit WHERE, GROUP BY, COUNT, SUM, ORDER BY und LIMIT kombiniert werden.