Eine SQL-Subquery (deutsch: Unterabfrage) ist eine SELECT-Abfrage, die innerhalb einer anderen Abfrage steht. Das äußere Statement nutzt das Ergebnis der inneren Abfrage als Filter, als Wert oder als Datenquelle. Subqueries machen SQL mächtig, weil sie mehrstufige Fragen in einem einzigen Statement beantworten.
Arten von Subqueries
- Skalare Subquery: liefert genau einen Wert (eine Zeile, eine Spalte) – verwendbar direkt im
SELECToder bei Vergleichen. - Listensubquery: liefert eine Spalte mit vielen Zeilen – typisch für
IN,ANYundALL. - Tabellensubquery: liefert mehrere Spalten und Zeilen – verwendbar im
FROMals abgeleitete Tabelle.
Beispiel: IN mit Subquery
SELECT name FROM kunden
WHERE id IN (SELECT kunden_id FROM bestellungen
WHERE betrag > 100);
Hier sammelt die innere Abfrage zuerst alle Kunden-IDs mit Bestellungen über 100, die äußere fragt dann die Namen ab.
Korrelierte Subqueries
Eine korrelierte Subquery verweist auf Spalten der äußeren Abfrage und wird dadurch für jede Zeile neu ausgewertet. Dazu passt EXISTS, das nur prüft, ob mindestens eine Zeile existiert:
SELECT name FROM kunden k
WHERE EXISTS (SELECT 1 FROM bestellungen b
WHERE b.kunden_id = k.id);
Korrelierte Varianten sind oft langsamer als ein JOIN oder eine UNION – wer Wert auf Performance legt, sollte beide Varianten testen.
Subquery oder JOIN?
Vieles lässt sich mit beiden Techniken lösen. JOINs kombinieren Tabellen meist effizienter, Subqueries sind dort stark, wo ein Zwischenergebnis erst berechnet und dann verglichen wird – etwa ein Maximum pro Gruppe. Wer Abfrageergebnisse zeilenweise mitlaufend berechnen will, nutzt dafür Window Functions.
Wer für jede Zeile der äußeren Abfrage eine Unterabfrage braucht, die deren Spalten direkt referenzieren darf, nutzt dafür LATERAL.
Grundlagen zu SELECT und den übrigen SQL-Befehlen finden sich in den SQL-Grundlagen, Begriffe rund um Abfragen im Query-Glossar.