Unterabfragen

Eine Unterabfrage ist ein Auswahlausdruck, der als verschachtelter Abfrageblock in Klammern in einer Abfrageanweisung eingeschlossen ist.

Sie können diese verschachtelten Abfrageblöcke in jeder der folgenden SQL-Anweisungen verwenden:
  • AUSWÄHLEN
  • EINFÜGEN
  • LÖSCHEN
  • AKTUALISIEREN
  • CREATE TABLE AS
  • INSERT INTO
  • SELECT INTO

Sie können Unterabfragen in beliebiger Tiefe verschachteln.

Die übergeordnete Abfrage, die die Unterabfrage enthält, wird oft als Superabfrage oder äußere Abfrage bezeichnet. Unterfragen in derselben übergeordneten Abfrage werden verwendet, um Gruppen von Ergebnissen abzuleiten, die in Verbindung mit der übergeordneten Abfrage ausgewertet werden können.

Unterabfragen können weiter in die folgenden Kategorien unterteilt werden:
Zeilenunterabfrage
Gibt eine Zeile (oder keine Zeilen) und mehrere Spalten zurück und kann in einer Auswahlliste oder in einem Bedingungsausdruck verwendet werden, z. B. als Argument eines Vergleichsoperators.
Tabellenunterabfrage
Gibt mehrere (0 - n) Zeilen und mehrere Spalten zurück und kann in einer FROM-Klausel oder als Argument eines EXISTS-, IN-, ANY- oder ALL-Tests auftreten.
Die Abfrage "Alle Filialen auflisten, in denen der Umsatz mehr als ein Prozent des Gesamtunternehmensumsatzes beträgt" kann in der SQL-Form einer Abfrage innerhalb einer Abfrage mit einer skalaren Unterabfrage geschrieben werden:
   SELECT StoreId FROM Stores
   WHERE TotalSale > 0.01*
   (SELECT SUM(TotalSales) FROM Stores);

Das System berechnet zuerst die Summe der Umsätze der inneren Unterabfrage und verwendet diese dann bei der Ausführung der übergeordneten Abfrage.

Singleton-Unterabfrage
Gibt genau einen Wert in Form einer Tabelle mit einer Zeile (bzw. null Zeilen) und einer Spalte zurück.

Bei all diesen Unterabfragen wertet das System diese einmal aus und berechnet und speichert deren Auswahlausdruck. Beim Ausführen der Superabfrage setzt das System die berechneten Werte anstelle der Unterabfrage ein.

Eine korrelierte Unterabfrage ist jedoch eine Abfrage innerhalb einer Abfrage, die die übergeordnete Abfrage referenziert (korreliert). Bei korrelierten Unterabfragen wertet das System die Unterabfrage einmal für jede in der äußeren Tabelle ausgewählten Zeile aus.