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).

