Anfragemengenausdruck

Ein Anfragemengenausdruck vereinigt mehrere vereinigungskonforme SELECT-Anweisungen zu einer neuen SELECT-Anweisung auf höherer Ebene. Syntaktisch gehören die Anfragemengenausdrücke zu den SQL-Unterabfragen?. Ihre Semantik entspricht der der drei Mengenoperatoren der relationalen Algebra.

Syntax Anfragemengenausdruck:

  <Anfragemengenausdruck> ::=
                { <Unterabfrage?>  UNION [ALL]  <Unterabfrage?>
                | <Unterabfrage?>  INTERSECT    <Unterabfrage?>
                | <Unterabfrage?>  { EXCEPT | MINUS }  <Unterabfrage?>}
  • Die Syntax und Semantik dieser Ausdrücke sind im SQL-Standard und bei Oracle analog implementiert - mit dem kleinen Unterschied, dass es das Schlüsselwort MINUS im SQL-Standard nicht gibt und es bei Oracle eben MINUS heißt.
  • UNION bildet die Vereinigungsmenge der Datensätze, INTERSECT den Durchschnitt und EXCEPT bzw. MINUS (gleiche Bedeutung) liefert alle Datensätze, die in der ersten (linken) Menge vorhanden sind, aber nicht in der zweiten (rechten). Die Operatoren sind syntaktisch und funktional analog zu den Mengenoperatoren der relationalen Algebra (Union, Differenz, Durchschnitt) zu sehen.
  • Zu beachten ist, dass sich die Ausführung des Durchschnittsoperators auf die gesamte Attributstruktur beider Eingangsmengen bezieht und nicht nur über irgendwelche Primärschlüsselspalten oder namensgleiche Spalten ausgeführt wird. Dies bedingt die bereits oben erwähnte Vereinigungskonformität.
  • Doppelte Datensätze werden bei allen drei Operatoren unterdrückt (Duplikatelimination). Im Unterschied dazu behält UNION ALL alle Datensätze, also auch die mehrfach vorkommenden, womit der UNION ALL deutlich performanter ausgeführt werden kann als der UNION. (vgl. auch SQL-Tuning?)
  • Die Mengenoperatoren UNION, INTERSECT und MINUS haben unter SQL keine Prioritätsreihenfolge, sondern werden in der Reihenfolge abgearbeitet, in der sie in der SELECT-Abfrage stehen oder es werden Klammern gesetzt.
  • Zu beachten bleibt, dass UNION und INTERSECT kommutativ sind, das heißt, es ist unerheblich, welche der Mengen rechts und welche links steht. Anders ist es bei EXCEPT/MINUS, dieser Operator ist nicht kommutativ. Es macht semantisch einen relevanten Unterschied, welche Menge von welcher abgezogen wird - s.u. bei den Beispielen. Die Semantik des EXCEPT/MINUS-Operator erschließt sich am Einfachsten, wenn der Operator durch das Wort "ohne" ersetzt wird und dann gelesen wird "Name der linken Menge ohne Name der rechten Menge".
  • Ein ORDER-BY muss bei einem Anfragemengenausdruck immer zum Schluss stehen.

Beispiele

Welche Angestellten sind auch Kunden?

  SELECT Nachname, Vorname FROM Angestellte          
     INTERSECT
  SELECT Nachname, Vorname FROM Kunden
  ORDER BY Nachname;

Welche Personen sind Angestellte oder Kunden?

  SELECT Nachname, Vorname FROM Angestellte          
     UNION
  SELECT Nachname, Vorname FROM Kunden;

Welche Artikel wurden nicht verkauft?

  SELECT Teile_Nr FROM Artikel       
     MINUS                                  
  SELECT Teile_Nr FROM Rechnungspositionen;

Welche verkauften Artikel gibt es gar nicht? Sind entsprechende Fremdschlüssel definiert, kann dieses Problem gar nicht auftreten und die Ergebnismenge ist leer.

  SELECT Teile_Nr FROM Rechnungspositionen    
     MINUS                                    
  SELECT Teile_Nr FROM Artikel;             

siehe auch: Mengenoperationen eines Ausführungsplans

Quellen:

  • Quellen/Standards in http://www.wiscorp.com/SQLStandards.html und http://www.jcc.com/sql.htm
  • 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
  • Adams, Ralf: "SQL - Eine Einführung mit vertiefenden Exkursen", Hanser, München, 2012, ISBN 978-3-446-43200-0
  • Elmasri, Ramez/Navathe, Shamkant B.: "Grundlagen von Datenbanksystemen" , Pearson Studium, München, 2002, ISBN 3-8273-7021-3
  • Faeskorn-Woyke, Heide/Bertelsmeier, Birgit/Riemer, Petra/Bauer, Elena: "Datenbanksysteme - Theorie und Praxis mit SQL2003, Oracle und MySQL", Pearson Education, München, 2007, ISBN 978-3-8273-7266-6
  • Kemper, Alfons/Eickler, André: "Datenbanksysteme", Oldenbourg, München, 2009, 978-3-486-59018-0
  • 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
  • Sieben, Jürgen: "Oracle® SQL - Das umfassende Handbuch", Galileo Press, 2012, ISBN 978-3-8362-1875-7
  • Vossen, Gottfried: "Datenmodelle, Datenbanksprachen und Datenbankmanagementsysteme", Oldenbourg, München, 2008, ISBN 978-3-486-27574-2

Kategorie: SQL, A