HAVING-Klausel
Nachdem mit der GROUP-BY-Klausel die Ergebnisdatensätze einer SELECT-Anweisung in Gruppen eingeteilt wurden, können an diese Gruppen Bedingungen formuliert werden. Auch hier ist bei der Auswertung die dreiwertige-Logik zubeachten. Es kommen die Gruppendatensätze in die Ergebnismenge, die die Suchbedingung zu TRUE auswerten. Die Gruppendatensätze, die die Suchbedingung zur FALSE/UNKOWN auswerten, fallen heraus.
Diese Bedingung an die Gruppen ist unbedingt von der Bedingung an einzelne Datensätze in der WHERE-Klausel zu unterscheiden. Die Abarbeitungsreihenfolge sieht so aus, dass erst die WHERE-Bedingung für jeden einzelnen Datensätze geprüft wird. Die Datensätze, die diese Bedingung zu TRUE auswerten, werden gemäß der GROUP-BY-Klausel gruppiert und für diese Gruppendatensätze wird dann die Bedingung der HAVING-Klausel ausgewertet. Und die Gruppendatensätze, die diese HAVING-Bedingung zu TRUE auswerten, gehören dann der Ergebnismenge der Anfrage an.
Syntax der HAVING-Klausel:
<HAVING-Klausel> ::= HAVING <Gruppen-Suchbedingung>
- Da hier ja die Bedingung für die Gruppe geprüft wird, ist die <Gruppen-Suchbedingung> eine <Suchbedingung>, in der auch Gruppenfunktionen zugelassen sind.
- Diese Klausel kann nur nach vorheriger GROUP-BY-Klausel programmiert werden.
- In der <Gruppen-Suchbedingung> kann kein Spalten-Alias verwendet werden.
Beispiele
Berechnen Sie die Summe über alle Gehälter von denjenigen Abteilungen, die mindestens 5 Angestellte haben, die im Kölner-Raum (PLZ beginnt mit 51) wohnen!
SELECT Abt_Nr, SUM(Gehalt)AS Summe FROM Angestellte WHERE Plz LIKE '51%' GROUP BY Abt_Nr HAVING COUNT(*)<5;
In welchen Abteilungen sind alle Berufe vertreten, die es in der Firma gibt?
Mit der Having-Klausel kann auch die Division aus der relationalen Algebra simuliert werden, wenn man nicht ein doppeltes NOT EXISTS nutzen möchte.
Lösungsidee:
Zählen der Anzahl verschiedener (daher das DISTINCT) Berufe, der Angestellten der Firma
Zählen der Anzahl verschiedener (daher das DISTINCT) Berufe in den Abteilungen
Bei den Abteilungen, wo beide Zahlen gleich sind, muss es also alle Berufe geben, die Angestellte überhaupt haben.
SELECT Abt_Nr FROM Angestellte GROUP BY Abt_Nr HAVING COUNT(DISTINCT Beruf) = (SELECT COUNT(DISTINCT Beruf) FROM Angestellte);
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