ANY- / ALL-Operator

Sie werden in Suchbedingungen zusammen mit einem Vergleichsoperator?, wie z.B. =, <, >,... verwendet. Wird ein solcher Vergleichsoperator mit einem der Schlüsselwörter ANY oder ALL kombiniert, dann ist als rechter Operand (Ausdruck) eine Unterabfrage? zugelassen, die eine Ergebnismenge zurückliefert. Wird auf ANY oder ALL verzichtet und nur ein Vergleichsoperator? verwendet, so darf der rechte Operand (Ausdruck) nur eine Unterabfrage? sein, die nur einen Datensatz zurückliefert. Linker und rechter Operand müssen Ausdrücke mit gleicher Struktur (vereinigungskonform) sein: gleiche Anzahl an Spalten, gleiche Datentypen, gleiche Reihenfolge der Spalten. Ist einer der Operanden (Ausdrücke) leer (NULL) bzw. eine leere Ergebnismenge, dann wird die Bedingung im Sinne der dreiwertigen Logik zu UNKNOWN ausgewertet.

Eine solche Bedingung ist erfüllt (TRUE),

  • bei dem ANY-Operator, wenn wenigstens ein Datensatz die Bedigngung erfüllt, die der Vergleichsoperator und der linke Ausdruck vorgeben.
  • bei dem ALL-Operator, wenn alle Datensätze die Bedigngung erfüllen, die der Vergleichsoperator und der linke Ausdruck vorgeben.

Nicht alle Kombinationen von ANY/ALL und den Vergleichsoperatoren sind immer sinnvoll, so zum Beispiel, wenn "= ALL" programmiert ist und die Unteranfrage eine Ergebnismenge liefert, die verschiedene Datensätze enthält/enthalten kann, dann ist dies eine unerfüllbare Bedingung, die immer zu FALSE ausgewertet wird. Hingegen können mit ">= ALL" bzw. "<= ALL" Anfragen nach dem Maximun bzw. Minimun formuliert werden.

Syntax der Oracle-/SQL-Operatoren ANY/ALL:

    <ANY-/ALL-Operator>  ::= 
           <Ausdruck> <Vergleichsoperator?> { ANY | ALL } (< Unterabfrage? >)

Vergleichsoperatoren unter SQL und PL/SQL sind:

=gleich
<>,!=,ungleich
<kleiner
>größer
<kleiner oder gleich
>=größer oder gleich

Beispiele:

   -- Welche Kunden aus Köln tätigen mehr Umsatz als irgendein Kunde aus Bonn?
   -- Kölner mit wenigstens so viel Umsatz wie der "geringste" Bonner.
   SELECT * 
     FROM Kunden
    WHERE Ort = 'Köln'
      AND Umsatz >= ANY (SELECT * 
                           FROM Kunden
                          WHERE Ort = 'Bonn');

   -- Welche Kunden aus Köln tätigen mehr Umsatz als alle Kunden aus Bonn?
   -- Kölner mit mehr Umsatz wie der "meiste" Bonner.
   SELECT * 
     FROM Kunden
    WHERE Ort = 'Köln'
      AND Umsatz >= ALL (SELECT * 
                           FROM Kunden
                          WHERE Ort = 'Bonn');

Quellen:

  • INCITS/ISO/IEC 9075-1-2008. Part 1 "SQL/Framework", ISO International Organization for Standardization / INCITS InterNational Committee for Information Technology Standards, 2008
  • INCITS/ISO/IEC 9075-1-2008. Part 2 "SQL/Foundation", ISO International Organization for Standardization / INCITS InterNational Committee for Information Technology Standards, 2008
  • Elmasri, Ramez/Navathe, Shamkant B.: "Grundlagen von Datenbanksystemen" , Pearson Studium, München, 2002, ISBN 3-8273-7021-3
  • Melton, Jim/Simon, Alan R.: "SQL: 1999 - Understanding Relational Language Components", Morgan Kaufmann, San Francisco, 2001, ISBN 1558604561
  • Oracle® Database SQL Language Reference 11g Release 2 (11.2), E17118-03, August 2010, http://download.oracle.com/docs/cd/E11882_01/server.112/e17118.pdf
  • Saake, Gunter/Sattler, Kai-Uwe/Heuer, Andreas: "Datenbanken - Konzepte und Sprachen", mitp-Verlag, Redline GmbH, Heidelberg, 2007, ISBN 3-8266-1664-2

Kategorie: SQL, A