SELECT

Die SELECT-Anweisung ist für Programmierer wohl eine der umfangreichsten und wichtigsten SQL-Anweisungen, obwohl sie keine Daten verändert, sondern nur liest. Sie ist der einzige Befehl der DQL (Data Query Language) des SQL-Standards. Mit ihm werden die gewünschten Ergebnismengen deklarativ beschrieben. Eine SELECT-Anweisung formuiliert, also das "was", nicht aber das "wie" diese Daten ermittelt werden können, diese Aufgabe übernimmter eine Übersetzungskomponente, die bei Oracle als Optimizer bezeichnet wird.

Die SELECT-Anweisung besteht in der Grundform aus sechs Klauseln:

Syntax der SELECT Anweisung - eine Grundform

  <SELECT Grundform>  ::=
     <SELECT> [ ALL | DISTINCT ]  <Spaltenausdruck> [, <Spaltenausdruck>...]
     <FROM Tabellenname [Abkürzung] | <Unteranfrage> Abkürzung
          [,Tabellenname [Abkürzung] | <Unteranfrage> Abkürzung ]...
     [ WHERE <Suchbedingung> ] 
     [ GROUP BY Spaltenname [, Spaltenname]...] ] 
     [ HAVING <Suchbedingung> ] 
     [ ORDER-BY <Sortierung > [,<Sortierung>]... ] [;] 

Semantik einer SELECT-Anfrage

Ein Überblick über die sechs Klauseln und mit ihrer Abarbeitungsreihenfolge:

SELECT6.Projeziert Spalten und benennt sie ggf. um (Obligatorisch)
FROM1.Definiert die verwendeten Tabellen (Obligatorisch)
WHERE2.Selektiert aufgrund einer Suchbedingung bestimmte Datensätze der Tabellen (Optional)
GROUP BY3.Gruppiert Zeilen auf Basis gleicher Spaltenwerte (Optional)
HAVING4.Selektiert nur Gruppen, die der HAVING-Bedingung genügen (Optional)
ORDER BY5.Bestimmt die Reihenfolge der Datensätze (Optional)

Wichtig für ein Verständnis der Semantik einer Anfrage, der Ergebnis- und Zwischenergebnisdatenmengen ist die Kenntnis für die Abarbeitungsreihenfolge der Klauseln.

  1. Zuerst werden die beteiligten Daten in der FROM-Klausel ermittelt. Es wird von den der Tabellen der FROM-Klausel das kartesische Produkt gebildet resp. deren Join.
  2. Als nächstes wird die Bedingung der WHERE-Klausel ausgewertet und nur die Datensätze, für die die Bedingung zur "wahr/TRUE" ausgewertet wird, werden in die Ergebnismenge aufgenommen. Aufgrund der Tatsache, dass Spalten leer (NULL) sein können, muss bei der Bedingungauswertung mit einer dreiwertigen Logik gearbeitet werden.
  3. Wird mit Aggregatfunktionen wie z.B. SUM, COUNT, ... gearbeitet, so wird vielfach nicht die Aggregate einer Gesamtmenge gefragt, sondern vielmehr die Aggregate von Untermengen. Und eben diese Untermengen können mittels der GROUP BY-Klausel spezifiziert werden.
  4. Während in der WHERE-Bedingung Anforderungen an den einzelnen Datensatz formuliert werden, bietet die HAVING-Klausel die Möglichkeit, Anforderungen an die durch die GROUP BY-Klausel gebildeten Gruppen Anforderungen zu formulieren.
  5. Als vorletzte Aktion kann die Ergebnidatenmenge für verschiedene Spalten auf- oder absteigend sortiert werden mittels der ORDER-BY-Klausel. Diese Klausel ist nur auf der obersten Ebene der SELECT-Anfragen möglich, nicht für die Zwischenergebnismengen der Unteranfragen, die innerhalb eines SELECTs geschachtelt sind.
  6. Nachdem nun die relevanten Datensätze in der richtigen Sortierung vorliegen, wird als letztes die SELECT-Klausel ausgeführt und nur auf die notwendigen Spalten projeziert.

Diese obige Darstellung der SELECT-Anweisung mit ihren sechs Klauseln soll für ein erstes Verständnis sorgen, Sie gibt einen ersten Überblick über die Struktur und ermöglicht es trotzdem, durchaus komplexere Anfragen mit Unteranfragen? zu formulieren. Unterabfragen? können in der FROM-Klausel, sowie der WHERE- und HAVING-Bedingung geschachtelt werden, wobei die Schachtelungstiefe unbegrenzt ist.

Um jedoch einen sehr weitreichenden und im wahrsten Sinne des Wortes, hinsichtlich der Unterabfragenschachtelung? tiefgreifenden Einblick in die SELECT-Anfragesyntax zu erlangen ist die folgende Diagrammdarstellung erforderlich:

Syntax der SELECT Anweisung - eine recht vollständige Variante

     <SELECT-Anfrage>   ::=   <Anfrageausdruck>; 

Mehrere SELECT-Anweisungen, ohne ORDER BY-Klausel, können mit den Mengenoperationenen UNION, INTERSECT oder EXCEPT/MINUS nochmal zu einem Anfragemengenausdruck zusammengefügt werden, sofern sie vereinigungskonform sind. Mit der WITH-Klausel können temporäre Hilfssichten definiert werden, auf die dann in der Anfrage selber zugegriffen werden kann. Diese temporären Hilfssichten ermöglichen auch rekursive Anfragen.

Beispiele

Diese SELECT-Anweisungen selektiert Nachnamen und Gehalt aller Angestellten, die mehr als irgendein Angestellter derjenigen Abteilung, die vom Leiter 4 geführt wird, verdienen.

   SELECT a.Nachname, a.Gehalt
     FROM Angestellte a
    WHERE a.Gehalt > ANY (SELECT b.Gehalt
                            FROM Abteilungen b
                           WHERE a.Abt_Nr = b.Abt_Nr ·
                             AND b.Leiter = 4); '

Welche Kunden haben im Jahr 2013 gekauft?

   SELECT k.KNr, k.Name
     FROM Kunden k, Auftragspositionen a 
    WHERE k.Knr = a.KNr
      AND bestellt_am BETWEEN TO_DATE('01.01.2013 00:00:00', 'DD.MM.RRRR HH24:MI:SS') 
                          AND TO_DATE('31.12.2013 23:59:59', 'DD.MM.RRRR HH24:MI:SS'); 

   SELECT k.KNr, k.Name
     FROM Kunden
    WHERE k.Knr IN (SELECT a.KNr
                      FROM Auftragspositionen
                     WHERE bestellt_am BETWEEN TO_DATE('01.01.2013 00:00:00', 'DD.MM.RRRR HH24:MI:SS') 
                                           AND TO_DATE('31.12.2013 23:59:59', 'DD.MM.RRRR HH24:MI:SS')); 

Welche Kunden haben im Jahr 2013 nicht gekauft?

   SELECT k.KNr, k.Name
     FROM Kunden
    WHERE k.Knr NOT IN (SELECT a.KNr
                          FROM Auftragspositionen
                         WHERE bestellt_am BETWEEN TO_DATE('01.01.2013 00:00:00', 'DD.MM.RRRR HH24:MI:SS') 
                                               AND TO_DATE('31.12.2013 23:59:59', 'DD.MM.RRRR HH24:MI:SS')); 


   SELECT k.KNr, k.Name
     FROM Kunden k, ( SELECT KNr
                        FROM Kunden 
                      MINUS
                      SELECT KNr
                        FROM Auftragspositionen 
                       WHERE bestellt_am BETWEEN TO_DATE('01.01.2013 00:00:00', 'DD.MM.RRRR HH24:MI:SS') 
                                             AND TO_DATE('31.12.2013 23:59:59', 'DD.MM.RRRR HH24:MI:SS') 
                    ) ohneKauf
    WHERE k.KNr = ohneKauf.KNr; 

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

siehe auch : <Anfrageausdruck>, Unterabfrage?

Kategorie: SQL, S