SQL-Unterabfragen und CTEs
Kurz: Eine Unterabfrage ist eine Abfrage innerhalb einer anderen. Eine CTE („Common Table Expression”, WITH) gibt einer Zwischenabfrage einen Namen und macht lange Abfragen lesbar.
Genauer: Beide lösen Aufgaben, die sich nicht mit einer einzigen einfachen Abfrage erledigen lassen, etwa „Kunden mit überdurchschnittlichem Umsatz”.
Im Detail
- Skalar: Liefert genau einen Wert:
WHERE betrag > (SELECT AVG(betrag) FROM bestellung). - Liste:
WHERE kunde_id IN (SELECT id FROM kunde WHERE land = 'DE'). - EXISTS:
WHERE EXISTS (SELECT 1 FROM bestellung b WHERE b.kunde_id = k.id)prüft, ob es mindestens eine Zeile gibt, und stoppt beim ersten Treffer. Oft schneller und sicherer alsIN, vor allem gegenüber NULL-Fallen (siehe NULL in SQL). - Korreliert: Die Unterabfrage verweist auf die äußere Zeile und läuft logisch je Zeile.
- In FROM: Eine Unterabfrage als „abgeleitete Tabelle”, der man einen Alias gibt.
- CTE:
WITH umsatz AS (SELECT kunde_id, SUM(betrag) s FROM bestellung GROUP BY kunde_id) SELECT ... FROM umsatz .... Mehrere CTEs hintereinander gliedern komplexe Auswertungen. Rekursiv: Rekursive CTEs. - Wahl: Lesbarkeit zählt. Moderne Optimierer behandeln Unterabfragen oft wie Joins.
Siehe auch: SQL-Joins, Fensterfunktionen