Alle BeiträgeDas PerSight-Team · Zuletzt aktualisiert: 23. Juli 2026 · 7 Min. Lesezeit

SQL JOIN: Zwei Tabellen richtig verbinden

Ein praktischer Leitfaden zum Verbinden von Tabellen wie Bestellungen und Kunden in SQL: der Unterschied zwischen INNER JOIN und LEFT JOIN, die Falle der vervielfachten Zeilen und Beispiele, die auf allen vier Datenbanken laufen.

Die meisten Daten liegen an mehr als einer Stelle. Bestellungen stehen in einer Tabelle, Name und Stadt des Kunden, der sie aufgegeben hat, in einer anderen. Fragen Sie "Wie viel haben Kunden aus Berlin letzten Monat ausgegeben?", liegt die Antwort im Schnittpunkt beider Tabellen. Der SQL-Befehl, der Tabellen zusammenführt, heißt JOIN und ist deutlich einfacher, als sein Ruf vermuten lässt.

Warum sind die Tabellen überhaupt getrennt?

Statt den Kundennamen bei jeder Bestellung erneut zu schreiben, speichern Sie den Kunden einmal in einer kunden-Tabelle und halten in der Bestellung nur eine kunden_id. Das nennt man Normalisierung; sie spart Platz und lässt Sie einen Namen an genau einer Stelle korrigieren. Der Preis dafür: Für einen Bericht müssen Sie die Tabellen wieder zusammenfügen.

Wie schreibt man einen INNER JOIN?

Zu diesem Join greifen Sie am häufigsten. Er liefert die Zeilen, die auf beiden Seiten übereinstimmen. Verbinden wir kunden und bestellungen über die kunden_id:

SELECT k.name, b.betrag, b.bestelldatum
FROM bestellungen b
INNER JOIN kunden k ON k.id = b.kunden_id;
Gleiche Syntax auf PostgreSQL, SQL Server, MySQL und Oracle

Die ON-Zeile ist die Verknüpfungsregel: welche Spalte zu welcher passt. Die Aliase b und k halten die Abfrage kurz. Ein INNER JOIN liefert nur Zeilen mit einem Gegenstück auf beiden Seiten; eine Bestellung, deren Kunde gelöscht wurde, taucht nie auf.

Was, wenn ich auch Kunden ohne Bestellung sehen will?

Das ist der Klassiker, den ein INNER JOIN nicht beantworten kann, weil es keine Übereinstimmung gibt. Ein LEFT JOIN behält jede Zeile der linken Tabelle (hier kunden) und füllt die rechten Spalten mit NULL, wenn nichts passt:

SELECT k.name
FROM kunden k
LEFT JOIN bestellungen b ON b.kunden_id = k.id
WHERE b.id IS NULL;

Der Filter WHERE b.id IS NULL behält nur die Kunden ohne Übereinstimmung auf der rechten Seite, also die, die nie bestellt haben. Das ist eines der nützlichsten Muster, die ein LEFT JOIN bietet.

Die Falle, vor der niemand warnt: vervielfachte Zeilen

Hat ein Kunde fünf Bestellungen, erzeugt der Join fünf Zeilen für diesen Kunden. Zählen Sie Zeilen, ohne das zu bemerken, oder behandeln den Kunden als eine Zeile und bilden einen Durchschnitt, blähen sich Ihre Zahlen auf. Faustregel: Nach einem Join wird fast immer gruppiert und aggregiert.

SELECT k.name,
       COUNT(b.id) AS anzahl_bestellungen,
       SUM(b.betrag) AS summe
FROM kunden k
INNER JOIN bestellungen b ON b.kunden_id = k.id
GROUP BY k.name
ORDER BY summe DESC;

Diesen Schritt mit GROUP BY und Aggregation behandeln wir in einem eigenen Leitfaden; er folgt auf einen Join fast jedes Mal.

Gibt es Unterschiede je nach Datenbank?

Gute Nachricht: INNER JOIN und LEFT JOIN werden auf PostgreSQL, SQL Server, MySQL und Oracle gleich geschrieben. Achten sollten Sie nur auf alten Oracle-Code, der Outer Joins mit dem (+)-Operator schreibt; bevorzugen Sie in neuen Abfragen das standardkonforme LEFT JOIN. FULL OUTER JOIN gibt es in MySQL überhaupt nicht; Sie bilden es durch das UNION zweier LEFT JOINs nach.

Häufig gestellte Fragen

Was ist der Unterschied zwischen INNER JOIN und LEFT JOIN?
INNER JOIN liefert nur Zeilen, die auf beiden Seiten übereinstimmen. LEFT JOIN behält jede Zeile der linken Tabelle; wo rechts nichts passt, kommen diese Spalten als NULL zurück. Immer wenn Sie sagen "zeig mir auch die ohne Treffer", brauchen Sie einen LEFT JOIN.
Kann ich mehr als zwei Tabellen verbinden?
Ja. Sie fügen pro Tabelle eine JOIN ... ON-Klausel hinzu; etwa Bestellpositionen an Bestellungen und Bestellungen an Kunden verketten. Mit steigender Tabellenzahl sorgen Indizes auf den Verknüpfungsspalten dafür, dass die Abfrage schnell bleibt.
Was ist der Unterschied zwischen ON und WHERE?
ON legt fest, wie zwei Tabellen zusammenpassen; WHERE filtert das verbundene Ergebnis. Bei einem INNER JOIN verhalten sich beide oft ähnlich, bei einem LEFT JOIN ändert es das Ergebnis komplett, ob die Bedingung in ON oder in WHERE steht.
Sollte ich einen JOIN oder eine Unterabfrage verwenden?
Kommt darauf an. Wenn Sie Spalten der anderen Tabelle anzeigen wollen, passt ein JOIN besser; filtern Sie nur nach "steht es in dieser Liste?", kann eine Unterabfrage lesbarer sein. Wir vergleichen beide in einem eigenen Leitfaden.

Statt diesen Join für jeden Bericht von Hand zu schreiben, tippen Sie ihn in PerSight auf Deutsch. Bitten Sie um "Gesamtbetrag pro Kunde, größter zuerst" und prüfen Sie das erzeugte SQL, bevor Sie es ausführen.

Quellen