Datenbank
SQL
5 Unterabfragen

Eine weitere Art der Verknüpfung ist die Unterabfrage. Hierbei wird das Ergebnis einer Abfrage dazu genutzt, die Eingabe einer weiteren Abfrage zu bilden.

 


5.1 Einführung

Einfach ausgedrückt bedeutet eine Unterabfrage, ein Zwischenergebnis zu berechnen und daraus das Gesamtergebnis zu bestimmen. Das hat den Vorteil, das man den kompletten Befehl zerlegen kann. Somit kann das Zwischenergebnis kontrolliert werden und dann daraus das Gesamtergebnis berechnet werden. Dies ist vorteilhaft für die Fehlersuche und für einen schrittweise Entwicklung komplexer Abfragen.

 

Als Beispiel wollen wir die Kunden bestimmen, deren Alter über dem Durchschnittsalter aller Kunden liegt. Zuerst ermitteln wir also das Durchschnittsalter aller Kunden.

 

select

  AVG(Jahre)

from

  Kunde

 

Diese Ergebnis vergleicht man mit der Altersangabe jedes einzelnen Kunden und wählt die aus, die älter als das Durchschnittsalter sind.

 

select

  kd.Name,

  kd.Vorname

from

  Kunde kd

where

  Jahre > {berechnetes Durchschnittsalter}

 

Wenn man jetzt weiß, das man Unterabfragen in Klammern setzten muß, dann kann man den ganzen Befehl hinschreiben

 

select

  kd.Name,

  kd.Vorname

from

  Kunde kd

where

  Jahre >

  (

    select

      AVG(Jahre)

    from

      Kunde kd

  )

 

Unterabfragen haben keine Beschränkung bezüglich der Verwendung von Syntaxelementen. Achten Sie aber darauf, das die so verknüpften Daten zusammenpassen. Desweiteren muß man auf die Kardinalität achten.

 

Liefert die Unterabfrage mehr als einen Datensatz, so funktionieren die einfachen Verknüpfungsoperatoren verständlicherweise nicht mehr. Dann müssen andere Operatoren eingesetzt werden.

 

Beispielsweise kann eine Liste der Aufträge von Kunden aus Bad Dürkheim folgendermaßen bestimmt werden

 

select

  kd.Name,

  kd.Vorname,

  au.Nummer

from

  Kunde kd,

  Auftrag au

where

         kd.Nummer = au.Kunden_Nummer

  AND kd.Nummer IN

  (

    select

      kd.Nummer

    from

      Kunde kd

    where

      kd.Ort = ‘Bad Dürkheim‘

  )

 


5.2 Exists

Interessiert für die Haupt-/Oberabfrage nur, ob die Unterabfrage Zeilen liefert, jedoch nicht deren Inhalt, so nutzt man das EXISTS Schlüsselwort. Dies ist eine boole‘sche Auswertung der Ergebnismenge, die TRUE liefert, sobald eine Ergebnismenge vorhanden ist. Sind keine Zeilen in der Ergebnismenge enthalten (leere Menge), dann liefert dieser Ausdruck FALSE.

 

Als Beispiel wollen wir wissen, ob wir Kunden mit dem Nachnamen Schmitt in unserer Kundenkartei haben

 

select

  ‘Ja‘

from

  Dual

where

  exists

  (

    select

      *

    from

      Kunde kd

    where

      kd.Name = ‘Schmitt‘

  )

 

Beachte, das die Hauptabfrage so viele Zeilen liefert, wie die Tabelle der Hauptabfrage Zeilen hat. Dies kommt daher, das bei der Auswertung nur auf TRUE oder FALSE geprüft wird, Im TRUE Falle wird die Hauptabfrage ausgeführt, sonst nicht.

 

Eine Anwendung hierfür sind z.B. Updatescripte für Datenbankschemata, die dann ausgeführt werden, wenn bestimmte Daten noch nicht vorhanden sind.

 


5.3 Any / Some

Im Gegensatz zu Exists liefern die Any und die Some Klauseln für jede entsprechende Zeile der Unterabfrage zur Oberabfrage.

 

Als Beispiel soll die Auftragsliste der Kunden aus Bad Dürkheim ermittelt werden.

 

select

  kd.Name,

  kd.Vorname,

  au.Nummer

from

  Kunde kd,

  Auftrag au

where

  kd.Nummer = any

  (

    select

      kd.Nummer

    from

      Kunde kd

    where

      kd.Ort = ‘Bad Dürkheim‘

  )

 

Wie man sieht, liefert diese Abfrage dasselbe Ergebnis wie die Abfrage mit IN. Der Unterschied zwischen IN und ANY / SOME besteht darin, das IN nur auf Gleichheit prüfen kann, ANY / SOME kann dahingegen mit allen Operatoren verwendet werden.

 


5.4 Korrelierende Unterabfragen

Die bisher verwendeten Abfragen waren Unabhängig voneinander. Die korrelierenden haben eine Referenz zur Ober-/Hauptabfrage.

 



Last update:  13.07.2005