Aggregierende Funktionen
https://oer-informatik.de/sql-groupfunctions
tl/dr; (ca. 5 min Lesezeit): Aggregierende Funktionen bieten die Möglichkeit, übergreifende Aussagen zu mehreren Datensätzen vorzunehmen. Gemeinsam mit dem
GROUP
-Clause wird so ermöglicht, für Datensatzgruppen beispielsweise Summen oder Durchschnitte zu bilden. Dieser Artikel reist die Grundlagen dazu an.
Aggregierende Funktionen fassen Werte aus mehreren Datensätzen (Zeilen) zusammen: es werden Summe, Extremwerte, Durchschnitte gebildet. Abgesehen von COUNT()
lassen sie sich sinnvoll nur auf Zahlentyp-Attribute anwenden. Sie sind i.d.R. nur gemeinsam mit einem GROUP BY
- Clause sinnvoll, wobei die Daumenregel gilt:
Alle im SELECT
-Clause genannten Attribute, die nicht aggregiert werden, müssen gruppiert werden.
Sprich: werden Attribute nicht zeilenweise über eine Aggregatsfunktion zusammengefasst, müssen Sie im GROUP BY
-Clause genannt werden, um ausgegeben werden zu können.
Die meisten DBMS kennen die folgenden Aggregatsfunktionen für Zahlenattribute
Name | Extremwerte | Summe | Durchschnitt |
---|---|---|---|
Funktionen | MIN() , MAX() |
SUM() |
AVG(Kosten) |
Beispiele | MIN(Preis) : Minimum |
SUM(Anzahl) |
AVG(Kosten) |
MAX(Preis) : Maximum |
|||
Es gibt auch einige Aggregatsfunktionen, die sich auf nicht-Zahlen-Attribute wie Zeichenketten anwenden lassen:
Name | Erster Wert der Ergebnisliste | Letzter Wert der Ergebnisliste | Anzahl |
---|---|---|---|
Funktionen | FIRST() |
LAST() |
COUNT(*) |
Beispiele | FIRST(name) |
´LAST(name) |
COUNT(*) : Zeilenanzahl COUNT(Name) : Zeilen, in denen Name nicht NULL ist COUNT(DISTINCT Name) : Anzahl unterschiedlicher Namen |

Jedes Ausgabefeld, das in einer Abfrage mit Aggregations-Funktion nicht aggregiert wird (durch eine Funktion) muss im GROUP-BY-Clause genannt werden.
Beispiel:
HAVING
-Clause und Bedingungen an Funktionsergebnisse
Da der WHERE
-Clause vor der Berechnung der Funktionen ausgewertet wird, wird ein neues Konstrukt benötigt, um Bedingungen an Funktionsergebnisse zu knüpfen: der HAVING
-Clause
Syntax der erweiterten Abfrage
SELECT Funktionsname(parameter) AS aliasname, spaltennameX
FROM tabelleX
[WHERE Bedingung = wahr]
[HAVING Bedingung = wahr]
Darüber hinaus gibt es in den meisten DBMS (MySQL, MSSQL) auch noch einen Clause zum Sortieren (ORDER
) und Begrenzen der Ergebnisse (LIMIT
). Bei Oracle und postgresql ist die Syntax etwas anders umgesetzt. Das folgende Railroad-Diagramm gilt daher nur für MSSQL und MySQL:

Die Reihenfolge der Clauses nach dem FROM ist wichtig. Als Eselsbrücke für MySQL/MariaDB kann der folgende Merksatz dienen:
Warum | geht | Herbert | oft | Laufen |
---|---|---|---|---|
WHERE […] | GROUP […] | HAVING […] | ORDER […] | LIMIT […] |
Begrenzung der Ergebnismengen und Sortierung
Leider legen die DBMS die Eingrenzung der Ergebnismenge unterschiedlich fest:
Funktion | MSSQL | MySQL | OracleDB | postgreSQL | SQLite |
---|---|---|---|---|---|
Begrenzung der Ergebnismengen | SELECT TOP(1000) |
LIMIT 1000 |
Quellen und offene Ressourcen (OER)
Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich (soweit möglich in weiterbearbeitbarer Form) in folgendem git-Repository:
https://gitlab.com/oer-informatik/db-sql/.
Sofern nicht explizit anderweitig angegeben sind sie zur Nutzung als Open Education Resource (OER) unter Namensnennung (H. Stein, oer-informatik.de) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0).