Eine Unterabfrage (englisch subquery) ist ein SELECT-Befehl, der innerhalb eines anderen SQL-Befehls steht. Sie wird zuerst ausgewertet und liefert ein Zwischenergebnis, das die äußere Abfrage weiterverarbeitet. Subqueries machen komplexe Auswertungen lesbar und vermeiden manuelle Zwischenschritte.
Liefert eine Unterabfrage genau einen Wert, kann sie an jeder Stelle stehen, an der ein Wert erwartet wird:
SELECT name, note
FROM schüler
WHERE note < (SELECT AVG(note) FROM schüler);
Liefert alle Schüler, die besser als der Durchschnitt sind. Die innere Abfrage wird einmal ausgewertet und liefert eine einzelne Zahl.
Eine Unterabfrage in IN liefert eine Liste von Werten, gegen die verglichen wird:
SELECT name
FROM schüler
WHERE klasse_id IN (SELECT kid
FROM klasse
WHERE lehrer = 'Müller');
Liefert alle Schüler, deren Klassenlehrer Müller heißt. NOT IN negiert die Bedingung.
EXISTS prüft, ob die Unterabfrage mindestens ein Ergebnis liefert. Es gibt keine Werte zurück, sondern TRUE oder FALSE:
SELECT k.bezeichnung
FROM klasse k
WHERE EXISTS (SELECT 1
FROM schüler s
WHERE s.klasse_id = k.kid AND s.note = 1.0);
Liefert alle Klassen, in denen es mindestens einen Schüler mit der Note 1,0 gibt.
Wenn die Unterabfrage Spalten der äußeren Abfrage benutzt, ist sie korreliert. Sie wird für jede Zeile der äußeren Abfrage einmal neu ausgewertet:
SELECT s.name, s.klasse_id
FROM schüler s
WHERE s.note < (SELECT AVG(note)
FROM schüler s2
WHERE s2.klasse_id = s.klasse_id);
Liefert alle Schüler, die besser als der Klassendurchschnitt ihrer eigenen Klasse sind.
Korrelierte Unterabfragen sind teuer, weil sie für jede Zeile neu ausgewertet werden. Häufig lassen sie sich mit Joins effizienter umsetzen. Subqueries sind aber sehr lesbar und gut für Prüfungen geeignet, weil sie die fachliche Logik klar trennen.
NOT IN mit NULL-Werten in der Subquery liefert überraschend ein leeres Ergebnis (drei-wertige Logik). Skalare Subqueries, die mehr als einen Wert zurückgeben, lösen Laufzeitfehler aus. Außerdem werden bei korrelierten Subqueries die Aliase oft falsch gesetzt.
Zusammenfassung: Skalare Subqueries liefern einen Wert, IN/EXISTS prüfen Mengen, korrelierte Subqueries beziehen sich auf die äußere Zeile.
Abitur-Tipp: Bei korrelierten Subqueries immer Aliase (s, s2) vergeben – sonst wird unklar, welche Tabelle gemeint ist.