SQL-Joins erklärt, mit je einem Beispiel

Ein Join kombiniert Zeilen aus zwei Tabellen, indem er eine Spalte abgleicht. Der Join-Typ entscheidet, was mit Zeilen passiert, die keinen Partner finden. Alle Beispiele verwenden die Bäckerei-Datenbank: 8 Kunden und 12 Bestellungen, davon zwei Bestellungen von Laufkundschaft ohne Kunden.

INNER JOIN: nur die Treffer

Behält eine Zeile nur, wenn auf beiden Seiten ein Treffer existiert. Kunden ohne Bestellungen und Bestellungen ohne Kunden fallen beide weg.

SELECT c.last_name, o.order_id
FROM customers AS c
INNER JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Ergebnis: 10 Zeilen: die Bestellungen, die einem Kunden gehören.

LEFT JOIN: alles links behalten

Behält jede Zeile der linken Tabelle. Wo die rechte Tabelle keinen Treffer hat, sind ihre Spalten NULL. Ein Filter auf IS NULL findet die Zeilen ohne Treffer.

SELECT c.last_name, COUNT(o.order_id) AS orders
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.last_name
ORDER BY c.customer_id;

Ergebnis: Alle 8 Kunden; Kim und Meyer zeigen 0 Bestellungen.

RIGHT JOIN: alles rechts behalten

Das Spiegelbild des LEFT JOIN. Die meisten vertauschen die Reihenfolge der Tabellen und verwenden stattdessen LEFT JOIN, das natürlicher wirkt.

SELECT o.order_id, c.last_name
FROM customers AS c
RIGHT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id;

Ergebnis: Alle 12 Bestellungen; die Bestellungen 4 und 11 haben einen NULL-Nachnamen (Laufkundschaft).

FULL JOIN: alles auf beiden Seiten behalten

Behält nicht zugeordnete Zeilen aus beiden Tabellen. Nützlich, um zwei Listen zu vergleichen und zu sehen, was auf jeder Seite fehlt.

SELECT c.last_name, o.order_id
FROM customers AS c
FULL JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY o.order_id, c.last_name;

Ergebnis: 14 Zeilen: 10 Treffer, 2 Bestellungen von Laufkundschaft und die Kunden Kim und Meyer ohne Bestellung.

CROSS JOIN: jede Kombination

Verbindet jede Zeile der ersten Tabelle mit jeder Zeile der zweiten. Die Zeilenanzahl ist das Produkt aus beiden. Verwende ihn bewusst, zum Beispiel um ein Raster aus Datumswerten und Kategorien zu bauen.

SELECT COUNT(*) AS combinations
FROM customers
CROSS JOIN products;

Ergebnis: 72, also 8 Kunden mal 9 Produkte.

Self-Join: eine Tabelle mit sich selbst

Gib derselben Tabelle zwei Aliase, um Zeilen derselben Tabelle zu vergleichen, etwa zwei Kunden in derselben Stadt.

SELECT a.first_name AS first_customer, b.first_name AS second_customer, a.city
FROM customers AS a
JOIN customers AS b ON a.city = b.city AND a.customer_id < b.customer_id
ORDER BY a.city;

Ergebnis: Die Paare Emma und Hugo (Berlin), Ben und Dev (London) sowie Chloe und Farid (Paris).

Häufige Fragen

Warum liefert mein Join mehr Zeilen, als ich erwartet habe?
Meist ist die Join-Spalte auf einer Seite nicht eindeutig, sodass jede Zeile mehreren Zeilen entspricht. Prüfe die Schlüssel und zähle die Zeilen vor und nach dem Join.
Macht es einen Unterschied, ob eine Bedingung in ON oder in WHERE steht?
Bei einem INNER JOIN nicht. Bei einem LEFT JOIN entfernt eine Bedingung auf die rechte Tabelle in WHERE die nicht zugeordneten Zeilen und macht den LEFT JOIN zu einem INNER JOIN. Setze sie in ON, um sie zu behalten.
Welcher Join entspricht SVERWEIS?
Ein LEFT JOIN: Jede Zeile der Haupttabelle bleibt erhalten, und die nachgeschlagene Spalte ist dort NULL, wo nichts passt, ähnlich wie #NV. Anders als SVERWEIS liefert er alle Treffer, nicht nur den ersten.

Übe es