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.