Fachkonzept - Aggregation
Gruppieren von Ergebnissen
Das Zusammenfassen von Datensätzen ist eine zentrale Funktionalität von SQL.
Das Datenbanksystem kann die Ergebnisse eines SQL-Befehls gruppieren und auf jede Gruppe dann eine Aggregationsfunktion anwenden.
Folgendes Beispiel führt die Anfrage aus dem Einstieg weiter:
SELECT benutzer.PNR, benutzer.Name, COUNT(*) AS Anzahl
FROM benutzer, mitglied
WHERE benutzer.PNR = mitglied.PNR
GROUP BY benutzer.PNR, benutzer.Name
Den Ablauf der Auswertung kann man sich so vorstellen:
Die Attribute, nach denen gruppiert werden soll, müssen nicht unbedingt angezeigt werden. Im Beispiel oben wäre also auch folgende Gruppierung ausreichend (da die PNR ja eindeutig ist):
SELECT benutzer.Name, COUNT(*) AS AnzahlMitgliedschaften
FROM benutzer, mitglied
WHERE benutzer.PNR = mitglied.PNR
GROUP BY benutzer.PNR
Aggregationsfunktionen
Neben dem reinen Zählen der Zeilen einer Gruppe können weitere Aggregationsfunktionen verwendet werden:
Funktion | Bedeutung |
---|---|
MIN(Attribut) | Minimaler Wert, der für dieses Attribut in der Gruppe angenommen wird. |
MAX(Attribut) | Maximaler Wert, der für dieses Attribut in der Gruppe angenommen wird. |
AVG(Attribut) | Durchschnitt (arithmetisches Mittel) aller Werte des Attributs in der Gruppe. |
SUM(Attribut) | Summe aller Werte des Attributs in der Gruppe. |
Als Beispiel kannst du einmal folgenden SQL-Befehl ausführen:
SELECT gruppe.Name, MIN(mitglied.Beitritt), MAX(mitglied.Beitritt), COUNT(*) AS Anzahl
FROM gruppe, mitglied
WHERE gruppe.GNR = mitglied.GNR
GROUP BY gruppe.Name
Hier wird für jede Gruppe bestimmt, wann der erste und der letzte Gruppenbeitritt stattfand.
Einschränken der Gruppen
Manchmal sollen nicht alle Gruppen ausgegeben werden. Als Beispiel sollen nur die Gruppen angezeigt werden, bei denen mehr als 100 Benutzer Mitglied sind:
SELECT gruppe.Name, COUNT(*) AS Anzahl
FROM gruppe, mitglied
WHERE gruppe.GNR = mitglied.GNR
GROUP BY gruppe.Name
HAVING COUNT(*)>100
Der HAVING
-Teil der SQL-Anfrage wählt ähnlich wie der WHERE-Teil die Datensätze
aus, die angezeigt werden sollen. Allerdings greift er erst nach dem Zusammenfassen der Gruppen und
stellt Bedingungen für die berechneten Attribute.
Weiteres Beispiel: Ausgabe der Benutzer mit den Anzahlen ihrer Bilder:
SELECT benutzer.Name, COUNT(*) AS Anzahl
FROM benutzer, bild
WHERE benutzer.PNR = bild.PNR
GROUP BY benutzer.PNR
HAVING Anzahl > 2
ORDER BY Anzahl DESC
Beachte, dass im HAVING
-Teil auch der Alias-Namen des berechneten Attributs verwendet werden kann.