SQL – JOINs und Tabellen verbinden

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

kunden_id (PK)

name

kunden_id = kunden_id
bestellungen

bestellung_id (PK)

kunden_id (FK)


2. Unsere Beispieldaten

Tabelle: kunden

kunden_id name stadt
1Anna MüllerBerlin
2Max SchmidtLeipzig
3Lisa WeberDresden
4Peter FischerHamburg

Tabelle: bestellungen

bestellung_id kunden_id bestelldatum gesamtbetrag
10112026-10-01120.00
10222026-10-05250.00
10312026-10-10180.00
10432026-10-1580.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üller101120.00
Max Schmidt102250.00
Anna Müller103180.00
Lisa Weber10480.00

Peter Fischer erscheint nicht, weil er keine Bestellung besitzt.

Merken: INNER JOIN zeigt nur Datensätze, die auf beiden Seiten zusammenpassen.

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üller101120.00
Anna Müller103180.00
Max Schmidt102250.00
Lisa Weber10480.00
Peter FischerNULLNULL

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üller101
Anna Müller103
Max Schmidt102
Lisa Weber104
Peter FischerNULL

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.

Achtung: Eine fehlende oder falsche Verknüpfungsbedingung kann zu unerwartet vielen Ergebniszeilen führen.

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üllerBerlin101120.00
Anna MüllerBerlin103180.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_idname
4Peter Fischer
Merken: LEFT JOIN zusammen mit IS NULL eignet sich besonders gut, um fehlende Zuordnungen zu finden.

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üller2
Max Schmidt1
Lisa Weber1
Peter Fischer0

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
10112
10121
10223

Weitere Beispieltabelle: produkte

produkt_id produktname
1Tastatur
2Maus

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üller101Tastatur2
Anna Müller101Maus1
Max Schmidt102Maus3

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 Schmidt102250.00
Anna Müller103180.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.