Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Datenmodellierung und Datenbanksysteme

Datenbankanfragen an genau eine Tabelle

Unterabfragen mit verschachtelten SELECT-Statements

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.
Abbildung: Beispiel für Unterabfrage

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.
Abbildung: Schema von Unterabfragen in SELECT

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.

Unterabfragen mit genau einem Rückgabewert

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.

Unterabfragen mit mehrzeiligen Rückgaben

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.
Abbildung: Beispiel für Unterabfrage mit mehrzeiligen Rückgaben

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
ALL wertemenge
Der Wert der benannten Spalte wird durch einen Vergleichsoperator
(z.B. <, >, >=, <=) mit allen Werten der Wertemenge verglichen.
ALL wird zu TRUE ausgewertet, falls der
Vergleich für ALLE Datensätze der Unterabfrage zu TRUE ausgewertet wird.
SELECT DISTINCT Name, Population FROM Country
WHERE (Population/Area) > ALL
(SELECT Population/Area FROM Country WHERE Continent = 'Europe')
ORDER BY Name;

Gibt 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
ANY wertemenge
Der Wert der benannten Spalte wird durch einen Vergleichsoperator
(z.B. <, >, >=, <=) mit allen Werten der Wertemenge verglichen.
ANY wird zu TRUE ausgewertet, falls der
Vergleich für MINDESTENS EINEN Datensatz der Unterabfrage zu TRUE
ausgewertet wird.
SELECT Name, Area FROM Country
WHERE Area >= ANY
(SELECT SUM(Area) FROM Country GROUP BY Continent);

Gibt 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 a
WHERE EXISTS
(SELECT LieferanschriftFuerKunde FROM Adresse b
WHERE b.LieferanschriftFuerKunde = a.KundeID);

Gibt Namen und Vornamen zu Kunde aus, für die eine
Lieferanschrift gespeichert wurde.