JOIN ermöglicht es, mehrere Tabellen in einer SELECT-Abfrage anhand einer bestimmten Bedingung zusammenzuführen, normalerweise über das Schlüsselwort ON. Eine Unterabfrage (oder geschachtelte Abfrage) ist eine Anfrage, die innerhalb einer anderen Anfrage platziert wird. JOIN funktioniert besser zum Zusammenführen großer Tabellen mit guten Indizes, es ist transparenter für den Optimierer und wird normalerweise schneller ausgeführt. Unterabfragen sind nützlich, wenn aggregierte Berechnungen erforderlich sind oder wenn Bedingungen vorliegen, die durch JOIN nicht möglich sind (zum Beispiel korrelierte Abfragen).
Beispiel JOIN:
SELECT employees.name, departments.name FROM employees JOIN departments ON employees.dept_id = departments.id;
Beispiel Unterabfrage:
SELECT name FROM employees WHERE dept_id IN ( SELECT id FROM departments WHERE location = 'Moscow' );
„Gilt es als Regel, dass die Verwendung von Unterabfragen immer langsamer ist als die Verwendung von JOIN?“
Antwort: Nein, nicht immer! Korrekt geschriebene Unterabfragen werden vom Optimierer oft in interne JOINs umgewandelt. Darüber hinaus kann eine Unterabfrage manchmal effizienter sein — beispielsweise, wenn die äußere Abfrage mit einer kleinen Datenmenge arbeitet und die Unterabfrage bereits aggregierte Ergebnisse zurückgibt.
Beispiel:
SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
Diese Unterabfrage wird einmal ausgeführt.
Geschichte
In einem großen Projekt wurden für den Bericht geschachtelte Unterabfragen anstelle von JOIN verwendet. Mit zunehmendem Datenvolumen benötigte die Abfrage mehrere Minuten statt Sekunden. Nach dem Austausch von Unterabfragen gegen JOIN stieg die Leistung um das 10-fache.
Geschichte
In einem Projekt hat ein Analyst eine Abfrage mit GROUP BY in eine Unterabfrage umgeschrieben, ohne zu bemerken, dass dadurch Duplikate auf JOIN-Ebene entstanden. Dies führte zu inkorrekten Daten in den Berichten — die Summen waren aufgrund des kartesischen Produkts verfälscht.
Geschichte
Die Verwendung einer korrelierten Unterabfrage in der äußeren Schleife (für jede Zeile) führte zu einer vollständigen Leistungsverschlechterung beim Wachstum der Tabelle. Wir haben beschlossen, über JOIN mit Aggregation zu arbeiten — die Verarbeitungszeit der Abfragen wurde von Stunden auf Minuten reduziert.