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. |