EMZETT.
Login

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 als IN, 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