In SQL besteht die Möglichkeit innerhalb von SELECT-Statements weitere
SELECT-Statements zu formulieren. Diese verschachtelten
SELECT-Anweisungen werden Unterabfragen oder auch Subselects genannt. Sie werden häufig für die
Formulierung von Filterbedingungen im Kontext von WHERE oder HAVING
eingesetzt.
Das folgende Beispiel veranschaulicht den Einsatz von Unterabfragen anhand der Tabelle
Country: Es soll eine duplikatfreie, sortierte Liste mit Namen und Flächen aller
Länder ausgegeben werden, die größer als die durchschnittliche Fläche aller Länder sind.

Die hier gezeigte Unterabfrage wird genutzt, um einen dynamischen Vergleichswert aus dem aktuellen Datenbestand zu ermitteln. Ein allgemeines
Schema für Unterabfragen in SELECT-Statements ist in der folgenden Abbildung dargestellt.

Unterabfragen werden dann eingesetzt, wenn das Vergleichskriterium dynamisch und nicht zur Zeit der Erstellung der SQL-Abfrage bekannt ist. So wurde im obigen Beispiel der Vergleichswert auf Basis des aktuellen Datenbestands einer Tabelle berechnet. Welche Vergleichsoperatoren möglich sind, wird durch den Ergebnistyp der Unterabfrage bestimmt. Dabei können Unterabfragen mit genau einem Rückgabewert von Unterabfragen mit mehrzeiligen Rückgaben unterschieden werden.
Obwohl die Ergebnismenge von SELECT-Statements stets wieder eine Tabelle ist, kann von ihnen gefordert
werden, dass sie nur genau einen Wert enthalten. Das bedeutet, dass die Ergebnismenge des SELECT-Statements
der Unterabfrage genau eine Spalte enthält in der sich genau ein Datensatz befindet. Nur wenn diese Bedingungen erfüllt sind,
können die bereits bekannten Vergleichsoperatoren eingesetzt werden. Diese Bedingungen werden, wie im obigen Beispiel gezeigt, durch
den Einsatz von Aggregatsfunktionen erfüllt. Für den Fall, dass keine Aggregatsfunktion eingesetzt wird, muss sichergestellt sein,
dass trotzdem die Bedingungen an die Ergebnismenge erfüllt werden. Anderenfalls wird bei der Ausführung des
SELECT-Statements eine Fehlermeldung ausgegeben.
Ein Anwendungsbeispiel für Unterabfragen mit mehrzeiligen Rückgaben ist in der folgenden Abbildung dargestellt. Abgefragt werden
dabei Namen und Hauptstädte der Länder in der Tabelle Country, die
auf einem Kontinent liegen zu dem mehr als sechs Länder in Country gespeichert sind.

Die Ergebnistabelle der Unterabfrage enthält zwei Datensätze:
| Ergebnis | |
|---|---|
| Continent | |
| Asia | |
| Europe | |
Der Vergleichsoperator IN prüft, ob ein bestimmter Wert (links von IN
angegeben) in einer Menge von Werten (rechts von IN angegeben) enthalten ist. Weitere typische
Vergleichsoperatoren für Mengen werden in der folgenden Tabelle erläutert.
| Typische Vergleichsoperatoren für Mengen | ||
|---|---|---|
| Operator | Beschreibung | Beispiel |
spalte vergleichsoperator |
Der Wert der benannten Spalte wird durch einen Vergleichsoperator (z.B. <, >, >=, <=) mit allen Werten der Wertemenge verglichen. ALL wird zu TRUE ausgewertet, falls derVergleich für ALLE Datensätze der Unterabfrage zu TRUE ausgewertet wird. |
SELECT DISTINCT Name, Population FROM CountryGibt die Länder zurück, deren Bevölkerungsdichte größer ist als die von allen Ländern in Europa. Hinweis: Nutzt die Division als eine mathematische Funktion von SQL. |
spalte vergleichsoperator |
Der Wert der benannten Spalte wird durch einen Vergleichsoperator (z.B. <, >, >=, <=) mit allen Werten der Wertemenge verglichen. ANY wird zu TRUE ausgewertet, falls derVergleich für MINDESTENS EINEN Datensatz der Unterabfrage zu TRUEausgewertet wird. |
SELECT Name, Area FROM CountryGibt die Länder zurück, deren Fläche größer gleich der Gesamtfläche eines Kontinents ist. |
EXISTS |
Prüft, ob in der Ergebnismenge ein Datensatz enthalten ist. Erfordert in der Regel eine Verknüpfung von Haupt- und Unterabfrage im WHERE-Teil der Unterabfrage. |
SELECT Name, Vorname FROM Kunde aGibt Namen und Vornamen zu Kunde aus, für die eine Lieferanschrift gespeichert wurde. |