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:
SELECT | 6. | Projeziert Spalten und benennt sie ggf. um (Obligatorisch) |
FROM | 1. | Definiert die verwendeten Tabellen (Obligatorisch) |
WHERE | 2. | Selektiert aufgrund einer Suchbedingung bestimmte Datensätze der Tabellen (Optional) |
GROUP BY | 3. | Gruppiert Zeilen auf Basis gleicher Spaltenwerte (Optional) |
HAVING | 4. | Selektiert nur Gruppen, die der HAVING-Bedingung genügen (Optional) |
ORDER BY | 5. | 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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