GROUP BY - Erklärung und Beispiele

Wie der Name schon sagt, kann man mit dem SQL Befehl GROUP BY ausgewählten Daten gruppieren. Nach der Auswahl, Selektion und Sortierung nun also die Gruppierung. Interessant sind Gruppierungen vor allem in Kombination mit Aggregatfunktionen, wie z.B. COUNT, MIN/MAX usw., dazu aber an anderer Stelle mehr. Für den GROUP BY Befehl lautet die Syntax folgendermaßen:


SELECT spaltenname,  [...]
 FROM tabellenname
 [WHERE Bedingung]
 GROUP BY spalte
 [HAVING Bedingung]
 [ORDER BY Spalte, [...] [ASC | DESC]];

Wie man sieht, ist die HAVING-Klausel bei GROUP BY optional. HAVING dient in Kombination mit GROUP BY, wie die WHERE-Klausel, nur mit dem Unterschied, dass die Eingrenzung sich lediglich auf die gruppierten Daten beschränkt. Wer sich also unschlüssig ist, welche Spalte bei HAVING anzugeben ist, der muss lediglich in die GROUP BY-Klausel schauen, denn genau diese Spalte und keine andere, muss auch bei HAVING stehen. Alles andere führt zu einer Fehlermeldung. Ein genaues Beispiel zu dieser Problematik findet man im nachfolgenden Video Tutorial.


Video Tutorial

Im nachfolgenden Video Tutorial wird der Befehl GROUP BY anhand verschiedener Beispiele vorgestellt. Erklärt wird unter anderem das Zusammenspiel mit den Aggregatfunktionen COUNT() und SUM(). Darüber hinaus erfährt man, wie man die gruppierten Daten mit dem SQL-Befehl HAVING weiter einschränken kann.


GROUP BY Beispiel

Angenommen wir haben nun folgende Tabelle:

Tabelle zu GROUP BY

Wir sind nun riesige Horror-Bücher Fans und fragen uns, wie viel Seiten wir lesen dürfen, wenn wir alle Horrorbücher aus dieser Tabelle vor uns hätten:


SELECT Rubrik, SUM(Seitenanzahl)
 FROM Buecher
 WHERE Rubrik='Horror'
 GROUP BY Rubrik;

Als Ergebnis erhält man: 1560, die Summe von allen Seiten der Rubrik Horror (459+800+301).

Wie man sieht, wurde in diesem Beispiel für die Eingrenzung der Gruppierung auf Horrorbücher eine WHERE-Klausel verwendet. Da in diesem Fall aber schon nach der Rubrik gruppiert wurde, hätte man statt der WHERE-Klausel auch eine HAVING-Klausel verwenden können. Anders hingegen sieht es aus, wenn wir nicht wissen wollen, wie viel Seiten wir insgesamt lesen müssen, wenn wir nur Horrorbücher lesen wollen, sondern wenn wir nur Horrorbücher von Stephen King lesen wollen. In diesem Fall gruppieren wir auch nach der „Rubrik“, schränken die Daten aber auf den „Autor“ Stephen King ein. Da die Gruppierung „Rubrik“ lautet, können wir nicht mit HAVING den Autor eingrenzen. Hier bleibt uns nur die Möglichkeit schon vor der Gruppierung mit WHERE die Daten auf den Autor Stephen King einzugrenzen:


SELECT Rubrik, SUM(Seitenanzahl)
 FROM Buecher
 WHERE Autor LIKE 'Stephen King'
 GROUP BY Rubrik;