Aggregatfunktionen sind spezielle SQL-Funktionen, die aus einer Menge von Werten einen einzigen Ergebniswert berechnen. Sie helfen dir, große Datenmengen auf einen Blick zusammenzufassen, auszuwerten und aussagekräftige Berichte zu erstellen. Typische Beispiele sind das Berechnen von Summen, Durchschnittswerten oder das Zählen von Einträgen.
Wozu dienen Aggregatfunktionen?
- Zusammenfassung großer Datensätze, ohne jede Zeile einzeln betrachten zu müssen.
- Erstellung von Statistiken und Berichten, z. B. Umsatzberichte oder Nutzeraktivitäten.
- Datenanalyse, um Muster, Trends oder Ausreißer schnell zu erkennen.
Praxisbeispiel: Stell dir vor, du betreibst einen Online-Shop. Jeden Tag werden zahlreiche Bestellungen getätigt. Mit Aggregatfunktionen kannst du zum Beispiel den Gesamtumsatz eines Monats berechnen, die durchschnittliche Bestellgröße ermitteln oder herausfinden, wie viele unterschiedliche Produkte verkauft wurden – alles ohne jede Bestellung einzeln zu prüfen.

Grundlagen von Aggregatfunktionen
Aggregatfunktionen in SQL verarbeiten mehrere Zeilen einer Tabelle und liefern daraus einen einzigen Ergebniswert. Sie fassen Daten zusammen, anstatt jede einzelne Zeile zu betrachten. So kannst du schnell aussagekräftige Informationen gewinnen.
Wie Aggregatfunktionen in SQL arbeiten:
- Sie nehmen eine oder mehrere Spalten als Eingabe.
- Verarbeiten die Werte dieser Spalten über alle relevanten Zeilen.
- Geben einen einzelnen Wert zurück, z. B. eine Summe, einen Durchschnitt oder eine Anzahl.
Wichtige Syntaxregeln:
- Kombination mit GROUP BY: Gruppiere Daten, um Aggregatfunktionen auf bestimmte Teilmengen anzuwenden. Beispiel:
SELECT kategorie, SUM(umsatz) FROM Verkäufe GROUP BY kategorie;
- Verwendung von DISTINCT: Mit DISTINCT kannst du Duplikate ausschließen. Beispiel:
SELECT COUNT(DISTINCT produkt) FROM Verkäufe;
- Behandlung von NULL-Werten:
COUNT(*)
zählt alle Zeilen, auch wenn Werte NULL sind.COUNT(spalte)
ignoriert NULL-Werte.
Die Kernfunktionen im Detail
In SQL gibt es mehrere wichtige Aggregatfunktionen, die dir helfen, Daten zusammenzufassen. Im Folgenden werden die häufigsten Funktionen anhand einer Beispiel-Tabelle Verkäufe
(Spalten: id, produkt, umsatz, datum, kategorie) erklärt. Dabei zeigen wir auch, wie jede Funktion in der Praxis genutzt wird.
SUM()
Einsatz: Berechnung von Gesamtsummen, z. B. Gesamtumsatz oder Gesamtmenge eines Produkts.
Beispiel:
SELECT SUM(umsatz) FROM Verkäufe;
Hier werden alle Werte in der Spalte umsatz
addiert. Angenommen, du hast fünf Verkäufe mit Umsätzen von 100, 200, 150, 300 und 270. Das Ergebnis von SUM(umsatz)
wäre 1020. SUM() ignoriert automatisch NULL-Werte, sodass fehlende Umsätze die Berechnung nicht verfälschen.
COUNT()
Einsatz: Zählen von Zeilen oder eindeutigen Werten. COUNT ist besonders nützlich, um zu wissen, wie viele Einträge es gibt oder wie viele unterschiedliche Produkte verkauft wurden.
COUNT(*)
zählt jede Zeile in der Tabelle, unabhängig davon, ob Spalten NULL enthalten. Beispiel: Anzahl aller Verkäufe.COUNT(spalte)
zählt nur Zeilen, in denen die angegebene Spalte nicht NULL ist. Beispiel:COUNT(umsatz)
zählt nur Verkäufe, bei denen ein Umsatz eingetragen ist.COUNT(DISTINCT spalte)
zählt nur eindeutige Werte in der Spalte. Beispiel:COUNT(DISTINCT produkt)
gibt die Anzahl verschiedener Produkte zurück, die verkauft wurden.
Beispiel:
SELECT COUNT(DISTINCT produkt) FROM Verkäufe;
Wenn du drei verschiedene Produkte verkauft hast, z. B. „T-Shirt“, „Hose“ und „Jacke“, liefert die Abfrage den Wert 3, selbst wenn ein Produkt mehrfach verkauft wurde.
AVG()
Einsatz: Berechnung des Durchschnittswerts, z. B. Durchschnittsumsatz pro Bestellung. AVG() addiert alle Werte und teilt durch die Anzahl der nicht-NULL-Werte.
Beispiel:
SELECT AVG(umsatz) FROM Verkäufe;
Angenommen, die Umsätze der Verkäufe sind 100, 200, 150, 300 und 270. Die Summe beträgt 1020, und es gibt 5 Werte. Der Durchschnitt wäre 1020 ÷ 5 = 204. Wenn eine Zeile NULL für umsatz
enthält, wird diese Zeile bei der Berechnung ignoriert, sodass das Ergebnis nicht verzerrt wird.
MIN() / MAX()
Einsatz: Ermittlung der kleinsten oder größten Werte, z. B. das früheste oder späteste Verkaufsdatum oder die niedrigste und höchste Bestellung.
Beispiel:
SELECT MIN(datum), MAX(datum) FROM Verkäufe;
MIN() gibt das früheste Datum zurück, z. B. 2025-01-03, MAX() das späteste Datum, z. B. 2025-07-21. Diese Funktionen sind sehr hilfreich, um Zeiträume oder Limits zu analysieren.
Bonusfunktionen
Einige SQL-Dialekte bieten Aggregatfunktionen für Textwerte, um mehrere Einträge zu einer Zeichenkette zusammenzuführen:
GROUP_CONCAT()
(MySQL) – Verkettet Textwerte innerhalb einer Gruppe, z. B. alle Produktnamen eines Monats.STRING_AGG()
(PostgreSQL, SQL Server) – Ähnlich wie GROUP_CONCAT, verbindet mehrere Textwerte zu einer einzigen Zeichenkette.
Beispiel MySQL:
SELECT kategorie, GROUP_CONCAT(produkt) FROM Verkäufe GROUP BY kategorie;
Das Ergebnis könnte sein: Kategorie „Bekleidung“ → „T-Shirt,Hose,Jacke“.
Vergleichstabelle
Die folgende Tabelle gibt dir einen schnellen Überblick über die wichtigsten Aggregatfunktionen in SQL, ihre Einsatzgebiete, wie sie mit NULL-Werten umgehen, ob DISTINCT verwendet werden kann und ein typisches Beispielergebnis:
Funktion | Einsatzgebiet | Behandlung von NULL | Mit DISTINCT? | Beispieloutput |
---|---|---|---|---|
SUM() | Summenbildung | NULL-Werte werden ignoriert | Ja | 1520.00 |
COUNT() | Zeilen- oder Wertezählung | Teilweise ignoriert* (COUNT(*) zählt alle Zeilen, COUNT(spalte) ignoriert NULL) | Ja | 42 |
AVG() | Durchschnittsberechnung | NULL-Werte werden ignoriert | Ja | 37.14 |
MIN() | Kleinster Wert | NULL-Werte werden ignoriert | Nein | 10.00 |
MAX() | Größter Wert | NULL-Werte werden ignoriert | Nein | 99.99 |
*Hinweis: COUNT(*) zählt wirklich jede Zeile, auch wenn Spalten NULL enthalten. COUNT(spalte) ignoriert dagegen Zeilen, in denen die Spalte NULL ist. COUNT(DISTINCT spalte) zählt nur eindeutige, nicht-NULL-Werte.
Praxis-Szenarien mit GROUP BY
Die GROUP BY
-Klausel wird verwendet, um Datensätze in Gruppen zusammenzufassen, bevor Aggregatfunktionen angewendet werden. So lassen sich z. B. monatliche Umsätze oder durchschnittliche Werte pro Kategorie berechnen.
Beispiel 1: Monatliche Umsätze berechnen
SELECT MONTH(datum) AS Monat, SUM(umsatz) AS Gesamtumsatz
FROM Verkäufe
GROUP BY Monat;
Erklärung:
MONTH(datum)
extrahiert den Monat aus der Spaltedatum
.SUM(umsatz)
addiert alle Umsätze innerhalb dieses Monats.GROUP BY Monat
sorgt dafür, dass die SUM()-Funktion für jeden Monat separat berechnet wird.
Das Ergebnis könnte eine Tabelle sein, die für jeden Monat den Gesamtumsatz zeigt, z. B. Januar: 5000, Februar: 7200, usw.
Beispiel 2: Durchschnittlicher Umsatz pro Produktkategorie
SELECT kategorie, AVG(umsatz) AS Durchschnitt
FROM Verkäufe
GROUP BY kategorie;
Erklärung:
- Hier wird die Tabelle nach der Spalte
kategorie
gruppiert. - Für jede Kategorie wird der Durchschnitt der Umsätze berechnet.
- NULL-Werte in
umsatz
werden bei der Berechnung vonAVG()
automatisch ignoriert.
Beispielergebnis:
Kategorie | Durchschnittlicher Umsatz |
---|---|
Bekleidung | 210.50 |
Elektronik | 560.75 |
Haushalt | 320.00 |
Häufige Fehler bei GROUP BY
- Vergessen der
GROUP BY
-Klausel, wenn Aggregatfunktionen zusammen mit anderen Spalten verwendet werden. - Falsche Spalten in SELECT, die nicht gruppiert oder aggregiert werden. SQL gibt dann einen Fehler.
- Unbedachtes Einbeziehen von NULL-Werten – bei COUNT(spalte) werden diese ignoriert, bei SUM() oder AVG() können sie das Ergebnis beeinflussen, wenn die Werte fehlen.
Fortgeschrittene Techniken
Neben den grundlegenden Aggregatfunktionen gibt es fortgeschrittene Methoden, um Daten noch gezielter auszuwerten. Dazu gehören Filterung aggregierter Ergebnisse, verschachtelte Aggregationen und die Kombination mehrerer Funktionen in einer Abfrage.
Filterung mit HAVING (vs. WHERE)
Die WHERE
-Klausel filtert Zeilen vor der Aggregation, HAVING
filtert Ergebnisse nach der Aggregation. Das ist besonders wichtig, wenn du nur Gruppen anzeigen willst, die bestimmte Bedingungen erfüllen.
SELECT kategorie, AVG(umsatz) AS Durchschnitt
FROM Verkäufe
GROUP BY kategorie
HAVING AVG(umsatz) > 100;
Erklärung:
GROUP BY kategorie
gruppiert die Verkäufe nach Kategorie.AVG(umsatz)
berechnet den Durchschnittsumsatz jeder Kategorie.HAVING AVG(umsatz) > 100
filtert nur die Kategorien, deren Durchschnittsumsatz größer als 100 ist.
Verschachtelte Aggregationen
Manchmal willst du nicht nur einfache Aggregationen, sondern z. B. die maximale Summe aus mehreren Gruppen herausfinden. Hierbei kommen Subqueries (Unterabfragen) zum Einsatz:
SELECT MAX(Summe) AS MaxUmsatz
FROM (
SELECT kategorie, SUM(umsatz) AS Summe
FROM Verkäufe
GROUP BY kategorie
) AS KategorieSumme;
Erklärung:
- Die innere Abfrage berechnet die Summe des Umsatzes pro Kategorie.
- Die äußere Abfrage ermittelt den höchsten Wert dieser Summen.
- So kannst du z. B. herausfinden, welche Kategorie den höchsten Gesamtumsatz erzielt hat.
Kombination mehrerer Funktionen
In einer Abfrage lassen sich mehrere Aggregatfunktionen gleichzeitig nutzen, um umfassendere Analysen zu erstellen:
SELECT kategorie,
COUNT(*) AS AnzahlVerkäufe,
SUM(umsatz) AS Gesamtumsatz,
AVG(umsatz) AS DurchschnittUmsatz,
MIN(umsatz) AS MinimalerUmsatz,
MAX(umsatz) AS MaximalerUmsatz
FROM Verkäufe
GROUP BY kategorie;
Erklärung:
- Die Tabelle wird nach
kategorie
gruppiert. - Für jede Kategorie werden Anzahl, Summe, Durchschnitt, Minimum und Maximum berechnet.
- Das Ergebnis liefert eine kompakte Übersicht pro Kategorie, ohne mehrere Abfragen ausführen zu müssen.
Performance-Tipps
Aggregatfunktionen und GROUP BY können bei großen Datensätzen schnell zu Performance-Problemen führen. Mit einigen Strategien kannst du deine Abfragen deutlich beschleunigen:
1. Indizierung von Gruppierungsspalten
Wenn du eine Spalte für GROUP BY
verwendest, kann ein Index auf dieser Spalte die Gruppierung erheblich beschleunigen, besonders bei großen Tabellen.
CREATE INDEX idx_kategorie ON Verkäufe(kategorie);
Dieser Index hilft der Datenbank, die Daten schneller zu gruppieren.
2. DISTINCT bei großen Datensätzen vermeiden
Die Verwendung von DISTINCT
kann bei großen Tabellen sehr rechenintensiv sein. Prüfe, ob du Alternativen nutzen kannst, z. B.:
- Aggregationen auf eindeutige Werte in einer vorherigen Unterabfrage.
- Materialisierte Views, wenn die Daten häufig abgefragt werden.
3. Nutzung von EXPLAIN-Plänen
Mit EXPLAIN
kannst du analysieren, wie die Datenbank deine Abfrage ausführt und Engpässe erkennen:
EXPLAIN SELECT kategorie, SUM(umsatz)
FROM Verkäufe
GROUP BY kategorie;
Erklärung:
- Du siehst, welche Indizes genutzt werden, wie viele Zeilen verarbeitet werden und welche Schritte am meisten Zeit kosten.
- So kannst du gezielt Optimierungen durchführen, z. B. zusätzliche Indizes anlegen oder unnötige Berechnungen vermeiden.
4. Allgemeine Tipps
- Aggregationen nur auf die notwendigen Spalten anwenden.
- Subqueries nur verwenden, wenn es wirklich nötig ist, da sie zusätzliche Rechenzeit kosten.
- Bei häufigen Abfragen über große Datenmengen über Materialized Views oder temporäre Tabellen nachdenken.
Zusammenfassung & Entscheidungshilfe
Aggregatfunktionen sind das Herzstück der Datenanalyse in SQL. Sie ermöglichen es, große Datenmengen zusammenzufassen und wertvolle Einblicke zu gewinnen. Hier ein kompakter Leitfaden, wann du welche Funktion einsetzen solltest:
- Gesamtsumme → SUM()
VerwendeSUM()
, wenn du die Gesamtmenge einer Zahlenspalte berechnen willst, z. B. den gesamten Umsatz eines Monats. - Anzahl / Deduplizierung → COUNT(DISTINCT …)
COUNT(*)
zählt alle Zeilen,COUNT(spalte)
zählt nur nicht-NULL-Werte undCOUNT(DISTINCT spalte)
liefert die Anzahl eindeutiger Werte. - Mittelwert → AVG()
AVG()
berechnet den Durchschnitt. Achte darauf, dass NULL-Werte ignoriert werden und die Berechnung nur auf vorhandene Werte erfolgt. - Extremwerte → MIN() / MAX()
Diese Funktionen liefern den kleinsten oder größten Wert in einer Spalte. Sie eignen sich für Zeitreihen, Limits oder Vergleichswerte.
Wann GROUP BY und HAVING notwendig sind
Wenn du Werte nach Gruppen aggregieren willst, brauchst du GROUP BY
. Möchtest du anschließend nur bestimmte Gruppen ausgeben (z. B. Kategorien mit hohem Umsatz), nutzt du HAVING
:
SELECT kategorie, SUM(umsatz) AS Gesamtumsatz
FROM Verkäufe
GROUP BY kategorie
HAVING SUM(umsatz) > 1000;
Erklärung:
- Die Abfrage gruppiert Verkäufe nach Kategorie.
- Es wird die Gesamtsumme pro Kategorie berechnet.
- Mit
HAVING
werden nur die Kategorien angezeigt, deren Gesamtumsatz größer als 1000 ist.
Mit diesem Wissen kannst du die richtigen Aggregatfunktionen gezielt einsetzen, Abfragen performant gestalten und die Ergebnisse zuverlässig interpretieren.
Date- und Zeitfunktionen in SQL: leicht erklärt
Wie oft hast du schon das Alter eines Users berechnet,...
Artikel lesenINNER JOIN in SQL: So verbindest du Tabellen effizient
90 % aller SQL-Datenabfragen benötigen JOINs – doch der INNER...
Artikel lesenEXPLAIN: Wie du SQL-Abfragen analysierst und optimierst
Datenbanken sind das Herzstück vieler Anwendungen und Systeme. Je größer...
Artikel lesenWas sind eigentlich Datenbanken und Tabellen?
Im Alltag sammeln sich überall Informationen an: Kundendaten im Onlineshop,...
Artikel lesen