- 1 Section
- 10 Lessons
- unbegrenzt
- SQL Grundlagen10
- 1.1SQL-Grundstruktur: DDL, DML, DQL, DCL
- 1.2CREATE TABLE, Datentypen, Constraints
- 1.3INSERT, UPDATE, DELETE
- 1.4SELECT: WHERE, ORDER BY, LIMIT
- 1.5Aggregatfunktionen: COUNT, SUM, AVG
- 1.6GROUP BY und HAVING
- 1.7INNER JOIN und LEFT JOIN
- 1.8Datenbanktypen im Überblick
- 1.9MySQL / MariaDB in der Praxis
- 1.10SQL-Grundlagenaufgaben
Aggregatfunktionen: COUNT, SUM, AVG
Bisher haben wir mit SELECT einzelne Zeilen gelesen. Aber oft will man Erkenntnisse aus der Gesamtheit ziehen: Wie viele Kunden haben wir? Was ist der Durchschnittspreis? Welcher Auftrag war der höchste? Genau das machen Aggregatfunktionen – sie reduzieren viele Zeilen auf einen einzelnen Wert.
Aggregatfunktionen sind das wichtigste Werkzeug für Reports, Dashboards und Statistiken. Die fünf Standard-Funktionen heißen COUNT, SUM, AVG, MIN, MAX. Sie sind in jedem DBMS gleich. Wer sie beherrscht und mit GROUP BY kombiniert, kann praktisch jede Auswertungsfrage in SQL beantworten.
1) Was Aggregatfunktionen tun
Stell dir vor, du hast eine Bestellliste mit 100 Zeilen. Die normale Abfrage SELECT betrag FROM bestellung gibt dir 100 Werte zurück. Eine Aggregatfunktion wie SELECT SUM(betrag) FROM bestellung gibt dir einen einzigen Wert zurück: die Summe aller 100. Das ist der Kernunterschied:
- Normales SELECT: viele Eingangszeilen → genauso viele Ausgabezeilen
- Aggregat-SELECT: viele Eingangszeilen → eine einzige Ausgabezeile (oder eine pro Gruppe, mit GROUP BY)
Die fünf wichtigsten Funktionen in der Übersicht:
COUNT()
Zählt Zeilen. Das einzige Aggregat, das auf jeder Spalte funktioniert (auch Text, Datum).
SELECT COUNT(*) FROM kunde; SELECT COUNT(email) FROM kunde;
SUM()
Summiert numerische Werte. Auf Texten oder Datumsangaben gibt es einen Fehler.
SELECT SUM(umsatz) FROM bestellung;
AVG()
Bildet den Durchschnitt (arithmetisches Mittel) numerischer Werte. NULL-Werte werden ignoriert.
SELECT AVG(preis) FROM produkt;
MIN() / MAX()
Kleinster bzw. größter Wert. Funktioniert auch auf Texten (alphabetisch) und Daten (chronologisch).
SELECT MIN(preis), MAX(preis) FROM produkt;
SELECT COUNT(*), SUM(preis), AVG(preis), MIN(preis), MAX(preis) FROM produkt; liefert dir auf einen Schlag eine komplette Statistik.2) Live-Calculator: Aggregate in Aktion
Hier ist eine Bestelltabelle mit 8 Zeilen. Wähle eine Aggregatfunktion und eine Spalte – das Ergebnis berechnet sich live. Beobachte auch, wie das Statement aufgebaut wird:
3) COUNT im Detail – drei Varianten
COUNT hat eine Besonderheit: Es gibt mehrere Schreibweisen, und sie zählen nicht alle dasselbe. Das ist eine klassische Stolperfalle:
COUNT(*)
Zählt alle Zeilen, inklusive solcher mit NULL-Werten. Schnellste Variante.
COUNT(rabatt)
Zählt nur Zeilen, in denen rabatt nicht NULL ist (2 Zeilen haben NULL → ignoriert).
COUNT(DISTINCT kunde)
Zählt verschiedene Werte: Müller, Meier, Schulz, Weber = 4 (auch wenn 8 Bestellungen vorliegen).
COUNT(DISTINCT kunden_id). „Wie viele Bestellungen insgesamt?" → COUNT(*). Verwechseln führt zu falschen Zahlen in Reports – Klassiker.4) Die NULL-Behandlung pro Funktion
NULL ist auch bei Aggregaten eine Falle. Hier die Regel pro Funktion – wer das beachtet, vermeidet die häufigsten Berechnungsfehler:
| Funktion | Bei NULL-Wert | Bei NULL-only Tabelle |
|---|---|---|
COUNT(*) | Zählt die Zeile mit | Anzahl der Zeilen |
COUNT(spalte) | Zählt die Zeile nicht | Liefert 0 |
SUM, AVG, MIN, MAX | Wert wird ignoriert | Liefert NULL (!) |
Besonders heimtückisch: SUM auf einer leeren Tabelle gibt NULL zurück – nicht 0! Wer in einer Anwendung SELECT SUM(betrag) FROM bestellung WHERE ... aufruft und kein Ergebnis erwartet, bekommt manchmal NULL und manchmal eine Zahl. Schutzmechanismus: COALESCE(SUM(betrag), 0) – damit landet immer eine Zahl, wenn nichts da ist. Mehr zu NULL in SELECT: Grundabfragen.
5) Mehrere Aggregate in einer Query
Es ist völlig normal, mehrere Aggregate gleichzeitig zu berechnen. So bekommst du auf einen Schlag eine komplette Statistik:
-- Umsatz-Statistik pro Jahr (ohne GROUP BY: alle Zeilen zusammen) SELECT COUNT(*) AS anzahl_bestellungen, SUM(betrag) AS gesamtumsatz, AVG(betrag) AS durchschnitt, MIN(betrag) AS kleinste, MAX(betrag) AS groesste, COUNT(DISTINCT kunde) AS anzahl_kunden FROM bestellung WHERE datum >= '2026-01-01';
Eine einzige Query liefert sechs Kennzahlen. AS-Aliase machen die Ergebnisspalten lesbar – sonst stünde da SUM(betrag) als Spaltenname im Bericht. Solche Aggregat-Statements sind das Rückgrat fast jedes Dashboards und Berichts.
6) Aggregate mit WHERE – aber nicht in HAVING
Aggregate funktionieren wunderbar mit WHERE. Aber: WHERE filtert vor der Aggregation, nicht danach. Das ist eine wichtige Unterscheidung:
-- ✓ OK: WHERE filtert die Eingangszeilen SELECT SUM(betrag) FROM bestellung WHERE kunde = 'Müller GmbH'; -- → Summe nur über Müllers Bestellungen -- ✗ FEHLER: WHERE kennt das Aggregat-Ergebnis nicht SELECT kunde, SUM(betrag) FROM bestellung WHERE SUM(betrag) > 5000; -- → Fehler! Dafür gibt es HAVING
Will man auf das Ergebnis eines Aggregats filtern („nur Kunden mit Umsatz > 5000"), braucht man HAVING. Das funktioniert aber nur in Kombination mit GROUP BY – Thema der nächsten Lektion.
7) Aggregate auf Texten und Daten
SUM und AVG funktionieren nur auf Zahlen – das leuchtet ein. Aber COUNT, MIN und MAX gehen auch auf andere Datentypen:
- MIN(name): alphabetisch erster Name – z. B.
'Aalen GmbH' - MAX(datum): jüngstes Datum – nützlich, um „letzte Aktivität" zu finden
- MIN(datum): ältestes Datum – „erste Registrierung"
- COUNT(email): zählt, wie viele Datensätze eine E-Mail haben
Beispielsweise findet SELECT MAX(letzte_anmeldung) FROM benutzer; heraus, wann sich zuletzt überhaupt jemand eingeloggt hat. Sehr nützlich für Monitoring.
8) Spezielle Aggregate – das gibt's auch noch
Über die fünf Klassiker hinaus haben moderne DBMS weitere Aggregate. Einige Beispiele, die in der Praxis öfter auftauchen:
| Funktion | Zweck | Verfügbarkeit |
|---|---|---|
STDDEV / VAR | Standardabweichung, Varianz | Standard-SQL |
GROUP_CONCAT (MySQL)STRING_AGG (PostgreSQL/SQL Server) | Werte zu einem String verketten („Müller, Meier, Schulz") | Dialekt-spezifisch |
MEDIAN | Median (mittlerer Wert) | Oracle, ab PostgreSQL 9.4 |
PERCENTILE_CONT | Quantile / Perzentile | Standard ab SQL:2003 |
Für die IHK-Prüfung reichen die Big Five: COUNT, SUM, AVG, MIN, MAX. In der Praxis lohnt es sich, GROUP_CONCAT / STRING_AGG zu kennen – sie sparen oft Anwendungscode. Mehr Window-Functions kommen in SQL Fortgeschritten.
9) Praktische Anwendungsfälle
Aggregate sind so universell einsetzbar, dass sie überall vorkommen. Hier ein paar typische Szenarien aus dem IHK-Aufgabenfundus und dem Berufsalltag:
- Dashboard: Heute eingegangene Bestellungen →
COUNT(*) WHERE datum = CURRENT_DATE - Umsatzbericht: Quartalsumsatz →
SUM(betrag) WHERE datum BETWEEN '2026-01-01' AND '2026-03-31' - Lagerwarnung: Wie viele Artikel sind unter dem Mindestbestand? →
COUNT(*) FROM produkt WHERE lagerbestand < 10 - Preisanalyse: Niedrigster Preis im Sortiment →
MIN(preis) FROM produkt WHERE aktiv = TRUE - Statistikseite: „Wir betreuen 1.247 Kunden" →
SELECT COUNT(DISTINCT kunden_id) FROM ... - Datenqualität: Wie viele E-Mail-Adressen fehlen? →
COUNT(*) - COUNT(email)
Wann immer du in einem Report eine Zahl siehst – „2.345 Bestellungen", „durchschnittlich 89 € pro Warenkorb", „letzte Aktivität gestern" – steckt im Hintergrund ein Aggregat-Statement. In großen Data Warehouses sind solche Abfragen oft der Hauptanwendungsfall.
Zusammenfassung
Aggregatfunktionen reduzieren viele Zeilen auf einen einzelnen Wert. Die fünf Standard-Funktionen: COUNT (Anzahl), SUM (Summe), AVG (Durchschnitt), MIN (Kleinster), MAX (Größter). SUM und AVG funktionieren nur auf Zahlen, MIN/MAX/COUNT auch auf Text und Datum. COUNT-Varianten: COUNT(*) zählt alle Zeilen inkl. NULLs, COUNT(spalte) nur Zeilen mit Wert, COUNT(DISTINCT spalte) verschiedene Werte. NULL-Behandlung: SUM/AVG/MIN/MAX ignorieren NULLs; bei einer rein-NULL-Tabelle geben sie NULL zurück (nicht 0!) – Schutz mit COALESCE(SUM(x), 0). Aliase mit AS machen Ergebnisspalten lesbar. WHERE filtert vor der Aggregation; um auf das Aggregat-Ergebnis zu filtern, braucht man HAVING (zusammen mit GROUP BY). Mehrere Aggregate in einer Query liefern komplette Statistiken auf einen Schlag. Praktisch in jedem Dashboard, Report und KPI-Statement.
Verwandte Lektionen: GROUP BY und HAVING · SELECT Grundabfragen · JOINs · und mehrWeitere relevante LektionenSQL-GrundstrukturCREATE TABLEINSERT, UPDATE, DELETEWindow FunctionsDatenbank-ReportsDenormalisierung (Data Warehouse)Datenbankindizes
