GROUP-BY-Klausel

Mit der GROUP-BY-Klausel werden die Ergebnissdatensätze einer SELECT-Anweisung nach Bearbeitung der WHERE-Klausel in Gruppen eingeteilt, in denen die Werte der GROUP-BY-Spalten gleich sind. Über die GROUP-BY-Spalten wird aufsteigend sortiert. Nachfolgend dieser Klausel kann optional eine HAVING-Klausel programmiert werden.

Syntax der GROUP BY-Klausel:

   <GROUP BY-Klausel>  ::=
        GROUP BY Spaltenname [, Spaltenname]... 
      | GROUP BY  [ ROLLUP | CUBE  ] (Spaltenname [, Spaltenname]... 
      | GROUP BY  GROUPING SETS (<GROUPING-Spaltenliste>)
  • Die erste Gruppierungsklausel bildet Gruppen gemäß der angegebenen Spalte bzw. Spalten.
  • Die beiden anderen Gruppierungsklausel sind insbesondere Hilfreich im Data Warehouse-Bereich.

Anmerkungen

  • Alle Spalten in der SELECT-Liste, die keine Gruppenfunktionen enthalten, müssen auch in der GROUP-BY-Klausel aufgelistet werden. Es ist dabei zu beachten, dass die Werte dieser Spalten natürlich eindeutige Werte je Gruppe annehmen können und müssen, denn sie werden ja nur einmal je Gruppe angezeigt.
  • Ferner ist darauf zu achten, dass sich die Semantik der Gruppenbildung (Bedeutung der Gruppe) nicht ändert, wenn Attribute von der SELECT-Liste in die GROUP-BY-Klausel übernommen werden. So ist es z.B. unerheblich, wenn die GROUP-BY-Klausel mit der Kunden-Nr auch noch um den Namen des Kunden erweitert wird, denn der Name ist ja einduetig je Kundennummer. Wird jedoch die Kunden-Nr um die Rechnungsnummern erweitert, so bekommt die Gruppenbildung eine gänzlich andere Semantik, da es ja je Kunden in der Regel mehrere Rechnungen gibt. Andersherum gilt die Restriktion nicht.
  • Es kann ruhig in der GROUP-BY-Klausel nach Spalten gruppiert werden, die aber nicht angezeigt werden sollen und damit nicht in der SELECT-Liste aufgeführt werden.
  • Allerdings können in der GROUP-BY-Klausel keine Spaltenaliase verwendet werden.

Beispiele

Berechnen Sie die Summe über alle Gehälter der Angestellten der gleichen Abteilung!

    SELECT Abt_Nr, Abt_Name, SUM?(Gehalt)
      FROM Angestellte Ang, Abteilungen Abt
     WHERE Ang.Abt_Nr = Abt.Ang_Nr 
     GROUP BY Abt_Nr;
   -- Hierbei muss beachtet werden, dass alle Spalten, die in der SELECT-Klausel ohne Gruppenfunktion
   -- vorkommen, hier im Beispiel die Abt_Nr und der Abt_Name, in der GROUP-BY-Klausel enthalten sind.

Welche Angestellten verdienen das meiste Gehalt?

   SELECT Name, Vorname, Abt_Nr, Gehalt AS Max_Gehalt
     FROM Angestellte 
    WHERE Gehalt = ( SELECT MAX(SUM(Gehalt)) 
                       FROM Angestellte );
   -- Die Lösung mit der Unteranfrage ist notwnedig, weil die SELECT-Liste der Unteranfrage nicht um die Namen der Angestellten erweitert werden kann. 
   -- Die Unteranfrage liefert genau einen Datensatz mit dem maximalen Gehalt.
   -- Es kann aber sein, dass das maximale Gehalt mehrere Mitarbeiter verdienen und dann können für dieses maximale Gehalt nicht mehrere Namen angezeigt werden. 
   -- Dafür ist dann der obere SELECT zuständig. 

siehe auch: HAVING-Klausel, Gruppenfunktionen, CUBE, ROLLUP, GROUPING, GROUPING-SETS

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, G