SQL-Unterabfragen

Bei einer Unterabfrage handelt es sich um eine SELECT-Anweisung, die innerhalb einer SELECT-, SELECT...INTO-, INSERT...INTO-, DELETE- oder UPDATE-Anweisung oder innerhalb einer anderen Unterabfrage geschachtelt ist.

Syntax

Zum Erstellen einer Unterabfrage können drei verschiedene Syntaxvarianten verwendet werden:

Vergleich [ANY | ALL | SOME] (SQL-Anweisung)

Ausdruck [NOT] IN (SQL-Anweisung)

[NOT] EXISTS (SQL-Anweisung)

Eine Unterabfrage besteht aus den folgenden Teilen:

Teil

Beschreibung

Vergleich

Ein Ausdruck und ein Vergleichsoperator, der den Ausdruck mit den Ergebnissen der Unterabfrage vergleicht.

Ausdruck

Ein Ausdruck, anhand dessen das Resultset der Unterabfrage durchsucht wird.

SQL-Anweisung

Eine SELECT-Anweisung, für die die gleichen Formatierungsregeln wie für alle anderen SELECT-Anweisungen gelten. Die Anweisung muss in Klammern eingeschlossen werden.


Hinweise

Anstelle eines Ausdrucks können Sie eine Unterabfrage in der Feldliste einer SELECT-Anweisung oder in einer WHERE- oder HAVING-Klausel verwenden. In einer Unterabfrage geben Sie mit einer SELECT-Anweisung bestimmte Werte zurück, um sie in der WHERE- oder HAVING-Klausel auszuwerten.

Rufen Sie mithilfe der ANY- oder SOME-Prädikate, die Synonyme darstellen, Datensätze in der Hauptabfrage ab, die den Vergleich mit einem in der Unterabfrage abgerufenen Datensatz erfüllen. Im folgenden Beispiel werden alle Artikel zurückgegeben, deren Einzelpreis höher ist als der Einzelpreis eines beliebigen Artikels, der mit einem Rabatt von mindestens 25 % verkauft wurde:

SELECT * FROM Artikel WHERE Einzelpreis > ANY (SELECT Einzelpreis FROM Bestelldetails WHERE Rabatt >= .25);

Rufen Sie mithilfe des ALL-Prädikats nur jene Datensätze in der Hauptabfrage ab, die den Vergleich mit allen in der Unterabfrage abgerufenen Datensätzen erfüllen. Wenn Sie im vorherigen Beispiel ALL statt ANY verwenden, würde die Abfrage nur jene Artikel zurückgeben, deren Einzelpreis höher als der Einzelpreis aller Produkte ist, die mit einem Rabatt von mindestens 25 % verkauft wurden. Dies ist wesentlich restriktiver.

Mit dem IN-Prädikat rufen Sie nur jene Datensätze in der Hauptabfrage ab, für die ein Datensatz in der Unterabfrage einen identischen Wert enthält. Im folgenden Beispiel werden alle Artikel mit einem Rabatt von mindestens 25 % zurückgegeben:

SELECT * FROM Artikel WHERE Artikel-Nr IN (SELECT Artikel-Nr FROM Bestelldetails WHERE Rabatt >= .25);

Mit dem NOT IN-Prädikat rufen Sie dagegen nur jene Datensätze in der Hauptabfrage ab, für die kein Datensatz in der Unterabfrage einen identischen Wert enthält.

Verwenden Sie das EXISTS-Prädikat (mit dem optionalen reservierten Wort NOT) in Wahr/Falsch-Vergleichen, um zu ermitteln, ob die Unterabfrage Datensätze zurückgibt.

Darüber hinaus können Sie in einer Unterabfrage mithilfe von TabellennamenAlias (SQL) auf Tabellen verweisen, die in einer FROM-Klausel außerhalb der Unterabfrage aufgeführt sind. Im folgenden Beispiel werden die Namen der Mitarbeiter zurückgegeben, deren Gehälter mindestens der Höhe des Standardgehalts aller Mitarbeiter mit derselben Position entsprechen. Die Employees-Tabelle (Personal) erhält den Alias "T1":

SELECT Nachname, Vorname, Position, Gehalt FROM Personal AS T1 WHERE Gehalt >= (SELECT Avg(Gehalt) FROM Personal WHERE T1.Position = Personal.Position) Sortierung nach Position;

In diesem Beispiel ist das Reserviertes Wort AS optional.

Einige Unterabfragen sind in Kreuztabellenabfrage zulässig, insbesondere als Prädikate (in der WHERE-Klausel). Unterabfragen als Ausgaben (in der SELECT-Liste) sind in Kreuztabellenabfragen nicht zulässig.



Teilen Facebook Facebook Twitter Twitter E-Mail E-Mail

War diese Information hilfreich?

Sehr gut. Noch anderes Feedback?

Was können wir verbessern?

Vielen Dank für Ihr Feedback!

×