Geschachtelte Anfrage (Subquery)
Eine geschachtelte Anfrage (Unteranfrage / Subquery) is ein vollständiger SELECT-FROM-WHERE-Block, der innerhalb der WHERE- oder HAVING-Klausel einer übergeordneten, äußeren Anfrage eingebettet ist. Sie dient der dynamischen Datenfilterung und wird über spezifische relationale Operatoren ausgewertet:
- Skalare Unteranfrage: Liefert exakt einen Wert (Einzeiler/Einspalter) zurück und wird mit klassischen Vergleichsoperatoren (=,
<,>) gekoppelt. - Mengenbasierte Unteranfrage: Liefert eine Liste von Werten zurück. Die Verknüpfung erfolgt über Quantoren-Prädikate:
IN: Prüft, ob das Attribut der äußeren Anfrage in der inneren Ergebnismenge enthalten ist.EXISTS: Evaluiert zu wahr, wenn die Unteranfrage mindestens ein Tupel zurückgibt (Prüfung auf Nicht-Leere).ANY/SOME: Das Prädikat ist erfüllt, wenn der Vergleich für mindestens ein Element der Unteranfrage wahr ist.ALL: Das Prädikat ist erfüllt, wenn der Vergleich für alle Elemente der Unteranfrage wahr ist.
Man unterscheidet zwei fundamentale Auswertungsmechanismen:
- Unkorrelierte Unteranfrage: Die innere Anfrage ist vollkommen autark und enthält keine Variablenbindung zur äußeren Abfrage. Sie wird genau einmal isoliert ausgeführt und ihr statisches Ergebnis an die äußere Klausel übergeben.
- Korrelierte Unteranfrage: Eine geschachtelte Anfrage ist korreliert, wenn eine Bedingung innerhalb ihrer inneren
WHERE-Klausel ein Attribut einer Relation referenziert, die in der äußeren Anfrage deklariert ist (äußere Bindung). Konzeptionell ist die Abfrage zustandsbehaftet: Die Unteranfrage verhält sich wie eine Schleife und muss einmal für jedes Tupel (oder jede Tupelkombination) der äußeren Anfrage neu evaluiert werden.