Logo Wissenstransfer Gerhard at CichnaDotCom

>> Wissensdatenbank / Datenmodellierung und Datenbanksysteme

Datenbankanfragen an genau eine Tabelle

Abfragen mit Gruppenbildung (GROUP BY)

Das Schlüsselwort GROUP BY wird eingesetzt, um Daten zu gruppieren. Gruppierungen werden in der Regel zusammen mit Auswertungsfunktionen in SQL-Statements eingesetzt. Auf diese Weise können die einzelnen Datensätze im Datenbestand gruppiert und anschließend für jede Gruppe einzeln Auswertungen duchgeführt werden. Somit kann beispielsweise direkt aus der Datenbank erfragt werden, wie viele Kunden ein bestimmtes Produkt kauften oder wie hoch der durchschnittliche Umsatz pro Postleitzahl ist.

Folgendes Beispiel veranschaulicht den Einsatz von GROUP BY: Gesucht wird für jeden Kontinent die Anzahl der Länder, die zu jedem Kontinent in der Datenbank (Country) gespeichert sind.

SQL-Statement
SELECT Continent, COUNT(*) FROM Country GROUP BY Continent;

Ergebnis
Continent COUNT(*)
Africa 6
America 5
Asia 8
Australia/Oceania 6
Europe 7

Auf der Relation Country werden so viele verschiedene Gruppen gebildet, wie es verschiedene Werte von Continent gibt. So wird hier jeder Datensatz mit Asia als Wert für Continent in eine Gruppe sortiert, jeder Datensatz mit Africa in eine weitere Gruppe, usw. Für die Beispieltabelle ergeben sich durch die Gruppierung nach Kontinenten fünf verschiedene Gruppen. Anschließend wird mit der Aggregatsfunktion COUNT(*) die Anzahl der Datensätze in jeder Gruppe gezählt. Die Datensätze der Ergebnismenge ergeben sich aus dem Gruppierungskriterium (Continent) und dem Ergebnis der für jede Gruppe ausgeführten Aggregatsfunktion (COUNT(*)).

Aggregatsfunktionen

Mit Aggregatsfunktionen werden mehrere Werte zu einem Wert aggregiert, d.h. verdichtet oder zusammengefasst. Mit diesen Funktionen können in der Datenbank bereits sehr effizient Berechnungen auf den gespeicherten Datensätzen ausgeführt werden. Die folgende Tabelle erläutert die wichtigsten Aggregatsfunktionen in SQL. Diese Funktionen können auch ohne GROUP BY eingesetzt werden. Sie beziehen sich dann auf die gesamte Tabelle bzw. auf die durch WHERE beschränkte Ergebnismenge.

Benennung von Spalten im Abfrageergebnis mit AS

Mit dem Schlüsselwort AS können die Spaltennamen der Ergebnistabelle gezielt umbenannt werden. Das hilft insbesondere beim Einsatz von Aggregatsfunktionen. Beispiele dazu sind zusammen mit den Aggregatsfunktionen in der folgenden Tabelle dargestellt.

Wichtige Aggregatsfunktionen in SQL
Operator Beschreibung Beispiel
COUNT(*) Zählt die Anzahl der Datensätz einer Gruppe, im
Beispiel ein Einsatz zusammen mit GROUP BY und
ein Einsatz ohne GROUP BY.
SELECT Continent, Count(*) AS AnzahlDerLaenderProKontinent
FROM Country GROUP BY Continent;
SELECT COUNT(*) AS AnzahlDerLaenderDerWelt FROM Country;
SUM(spalte) Summiert die Werte einer Spalte innerhalb einer
Gruppe, im Beispiel die Fläche aller Länder eines
Kontinents.
SELECT Continent, SUM(Area) AS FlaecheDesKontinents
FROM Country GROUP BY Continent;
AVG(spalte) Berechnet den Durchschnittswert einer Spalte
innerhalb einer Gruppe.
SELECT Continent, AVG(Area)
AS DurchschnittlicheFlaecheProLand FROM Country
GROUP BY Continent;
MAX(spalte) Berechnet den Maximalwert einer Spalte innerhalb
einer Gruppe; kann für Zahlen, Zeichenketten
und Datumswerte eingesetzt werden..
SELECT Continent, MAX(Area)
AS GroesseDesGroesstenLandes FROM Country
GROUP BY Continent;
MIN(spalte) Berechnet den Minimalwert einer Spalte innerhalb
einer Gruppe; kann für Zahlen, Zeichenketten
und Datumswerte eingesetzt werden..
SELECT Continent, MIN(Area)
AS GroesseDesKleinstenLandes FROM Country
GROUP BY Continent;

Einschränkungen von Gruppen mit HAVING

Mit dem Schlüsselwort HAVING besteht die Möglichkeit die Ausgabe der gruppierten Ergebnisse einzuschränken. Während sich WHERE also auf die Auswahl der Datensätze vor dem Gruppieren bezieht, schränkt HAVING bereits zusammengestellte Gruppierungen ein. Sollen beispielsweise in einem Onlineshop alle Artikel ermittelt werden, die mehr als 500 Mal verkauft wurden, werden die Datensätze einer Umsatzdatenbank erst nach Artikelnummer gruppiert, dann die Anzahl pro Gruppe ermittelt und schließlich nur die Gruppen ausgegeben, deren Anzahl größer als 500 ist. Folgendes Beispiel veranschaulicht den Einsatz von HAVING anhand der Country-Relation:

Gesucht ist eine Liste der Kontinente, die mindestens 5 Länder haben, welche vollständig auf einem Kontinent liegen.

SQL-Statement
SELECT Continent FROM Country
WHERE Percentage = 100
GROUP BY Continent
HAVING COUNT(*) >= 5;

Ergebnis
Continent
Africa
America
Australia/Oceania
Europe

In der Relation Country werden zunächst alle Länder berücksichtigt, deren Attributwert von Percentage gleich 100 ist. Diese Datensätze werden nach den Attributwerten im Feld Continent gruppiert. Das HAVING bezieht sich nun auf die erfolgte Gruppierung: Es werden nur die Gruppierungen ausgegeben, die mehr als 5 Datensätze beinhalten. Die Ergebnistabelle enthält nur die Spalte Continent.