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 kontinent.Name, COUNT(*) AS Anzahl
FROM kontinent, land
WHERE land.KNR = kontinent.KNR
GROUP BY kontinent.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 richtig:
GROUP BY kontinent.KNR
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 land.Name, AVG(ort.Einwohner), MIN(ort.Einwohner), MAX(ort.Einwohner)
FROM land, ort
WHERE land.LNR = ort.LNR
AND land.Name = 'Deutschland'
Einschränken der Gruppen
Manchmal sollen nicht alle Gruppen ausgegeben werden. Als Beispiel sollen nur die Kontinente angezeigt werden, für die mehr als 30 Länder erfasst sind:
SELECT kontinent.Name, COUNT(*) AS Anzahl
FROM kontinent, land
WHERE land.KNR = kontinent.KNR
GROUP BY kontinent.Name
HAVING COUNT(*)>30
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 Attributen.
Weiteres Beispiel: Ausgabe der Kenndaten aller Länder, in denen Megastädte (> 10 Mio. Einwohner) liegen:
SELECT land.Name, AVG(ort.Einwohner) AS Durchschnitt, MAX(ort.Einwohner) AS Maximum
FROM land, ort
WHERE land.LNR = ort.LNR
GROUP BY land.Name
HAVING Maximum>10000000
ORDER BY Maximum DESC
Beachte, dass im HAVING
-Teil auch der Alias-Namen des berechneten Attributs verwendet werden kann.