Lektion 5: Geschachtelte SELECT-Anweisungen

Geschachtelte SELECT-Anweisungen
Eine geschachtelte select-Anweisung enthält in der where-Klausel eine weitere select-Anweisung als Unterabfrage.

Und wozu ist das gut?
Machen wir doch einfach mal ein Beispiel:

Gesucht sind die Namen der Länder, die eine größere Bevölkerung als die Vereinigten Staaten von Amerika haben.

Zu Fuß würdest du erst eine select-Anweisung für die Bevölkerung der USA machen und mit dem Ergebnis dann die Länder bestimmen, die eine größere Bevölkerung haben.

Mit einer einzigen geschachtelten select-Anweisung geht das aber direkt:

select Name
from cia
where Einwohner > (
    select Einwohner
    from cia
    where Name = 'Vereinigte Staaten von Amerika'
    )

Noch ein Beispiel:
Gib alle Länder aus, die in der gleichen Region wie Brasilien liegen.

Auch hier könntest Du mit einer Abfrage zuerst die Region von Brasilien bestimmen und dann mit einer zweiten Abfrage die gesuchten Länder. Mit einer geschachtelten select-Anweisung geht das auf einen Rutsch:

select Name
from cia
where Region = (
    select Region
    from cia
    where Name = 'Brasilien'
    )

Worauf muss ich achten?
Wenn die where-Klausel der Hauptabfrage wie in den beiden Beispielen mit einem Vergleichsoperator formuliert wird, so darf die Unterabfrage nur einen einzigen Wert liefern. Die folgende Abfrage ist zwar syntaktisch richtig, liefert aber einen Fehler bei der Ausführung:

select Name
from cia
where Region = (
    select Region
    from cia
    where Name like '%vereinigte%'
    )

Die Unterabfrage liefert die beiden Werte

  Mittlerer Osten (Land: Vereinigte Arabische Emirate)
  Nordamerika (Land: Vereinigte Staaten von Amerika)

so dass die where-Klausel der Hautpabfrage auf diesen nicht ausführbaren Vergleich führt:

where Region = (Mittlerer Osten, Nordamerika)

Aber das geht doch mit dem IN-Operator, oder?
Ja, stimmt. Ersetzt man den Vergleichsoperator = durch den IN-Operator so funktioniert die geschachtelte select-Anweisung:

select Name
from cia
where Region IN (
    select Region
    from cia
    where Name like '%vereinigte%'
    )

Die where-Klausel der Hauptabfrage kann also auch mit dem IN-Operator formuliert werden. Die Unterabfrage muss dann eine Liste mit vergleichbaren Werten liefern.

Und warum geht das nicht?
select Name
from cia
where Region IN (
    select Region, Name
    from cia
    where Name like '%vereinigte%'     )

Nun, die Unterabfrage liefert diese Paare von Werten:

  (Mittlerer Osten, Vereinigte Arabische Emirate)
  (Nordamerika, Vereinigte Staaten von Amerika)

Die where-Klausel der Hauptabfrage wäre dann:

where Region IN ((Mittlerer Osten, Vereinigte Arabische Emirate), (Nordamerika, Vereinigte Staaten von Amerika))

und dass kann man natürlich nicht auswerten.

Zusammenfassung
In der where-Klausel der Hauptabfrage einer geschachtelten select-Anweisung darfst Du einen Vergleichsoperator oder den IN-Operator verwenden.

In der select-Klausel der Unterabfrage darfst Du nur eine Spalte angeben.

Hast Du in der where-Klausel der Hauptabfrage einen Vergleichsoperator benutzt, so darf die Unterabfrage nur einen einzigen Wert als Ergebnis liefern.

Jetzt geht's los!
Hier geht es zu den Übungen der Lektion 5.