Erinnern wir uns: Aggregatfunktionen sind die, die mit mehreren Datenzeilen gleichzeitig arbeiten und ein einzelnes Ergebnis zurückgeben. In PostgreSQL wirst du oft folgende Aggregatfunktionen benutzen:
SUM()— Summieren von Daten.AVG()— Durchschnitt berechnen.MIN()— Minimalwert finden.MAX()— Maximalwert finden.COUNT()— Zeilen zählen.
Auf den ersten Blick ist alles easy: Du gibst der Funktion eine Spalte oder einen Ausdruck und bekommst das Ergebnis. Aber was passiert, wenn in der Spalte ein NULL auftaucht?
Verhalten von NULL in Aggregaten: Kurzüberblick
Hier wird’s spannend:
SUM()undAVG()ignorierenNULL. Wenn mindestens ein EintragNULList, wird er bei der Berechnung einfach ausgelassen. Klingt fair, oder? Wie soll die Summe wachsen, wenn jemand „nicht zur Party gekommen“ ist? Oder wie willst du den Durchschnitt berechnen, wenn ein Wert fehlt?MIN()undMAX()überspringenNULLebenfalls. Sie suchen das Minimum oder Maximum nur aus den Daten, die nichtNULLsind. Wenn du also nach dem jüngsten Mitarbeiter suchst, der das Geburtsdatum nicht eingetragen hat, wirdNULLnicht „gewinnen“.COUNT(*)zählt alle Zeilen, auch die mitNULL. AberCOUNT(column)zählt nur die Zeilen, in denen in der angegebenen Spalte ein Wert steht, also wirdNULLignoriert.
Schauen wir uns das mal an Beispielen an.
Beispiele für Aggregatfunktionen mit NULL
Hier ist die Tabelle students_scores, die die Testergebnisse der Studierenden enthält:
| student_id | name | score |
|---|---|---|
| 1 | Alisa | 85 |
| 2 | Bob | NULL |
| 3 | Charlie | 92 |
| 4 | Dana | NULL |
| 5 | Elena | 74 |
Jetzt stellen wir ein paar Anfragen und schauen uns die Ergebnisse an:
- Summe aller Scores:
SUM()
SELECT SUM(score) AS total_score
FROM students_scores;
Ergebnis:
| total_score |
|---|
| 251 |
Wie du siehst, wurden die fehlenden NULL-Werte einfach nicht mitgerechnet. Für Alisa (85), Charlie (92) und Elena (74) ergibt die Summe 251. Bob und Dana sind raus.
- Durchschnittlicher Score:
AVG()
SELECT AVG(score) AS average_score
FROM students_scores;
Ergebnis:
| average_score |
|---|
| 83.67 |
Auch hier wurden NULL ignoriert und der Durchschnitt nur für die berechnet, die einen Score haben: (85 + 92 + 74) / 3 = 83.67.
- Minimaler und maximaler Score:
MIN()undMAX()
SELECT
MIN(score) AS min_score,
MAX(score) AS max_score
FROM students_scores;
Ergebnis:
| min_score | max_score |
|---|---|
| 74 | 92 |
Auch hier ganz easy: NULL wurde wieder ignoriert, das Minimum ist 74, das Maximum 92.
- Zeilen zählen:
COUNT(*)vsCOUNT(column)
SELECT
COUNT(*) AS total_rows,
COUNT(score) AS non_null_scores
FROM students_scores;
Ergebnis:
| total_rows | non_null_scores |
|---|---|
| 5 | 3 |
COUNT(*)hat alle Zeilen gezählt, auch die, woscoreNULList.COUNT(score)hat nur die Zeilen gezählt, wo in der Spaltescoreein Wert steht.
Praktische Cases
Hier ein paar praktische Beispiele.
Beispiel 1: Mitarbeiter mit und ohne Gehalt zählen
Angenommen, wir haben eine Tabelle employees mit Gehältern.
| id | name | salary |
|---|---|---|
| 1 | Alex Lin | 50000 |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 60000 |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 55000 |
Wir wollen wissen, wie viele Mitarbeiter ihr Gehalt angegeben haben und wie viele nicht.
SELECT
COUNT(*) AS total_employees,
COUNT(salary) AS employees_with_salary,
COUNT(*) - COUNT(salary) AS employees_without_salary
FROM employees;
Hier:
COUNT(*)gibt die Gesamtzahl der Mitarbeiter zurück.COUNT(salary)zählt, wie viele Mitarbeiter ein Gehalt angegeben haben.- Um die Anzahl der Mitarbeiter ohne Gehalt zu berechnen, ziehen wir einfach das eine vom anderen ab.
Ergebnis
| total_employees | employees_with_salary | employees_without_salary |
|---|---|---|
| 5 | 3 | 2 |
Beispiel 2: Durchschnittspreis von Produkten mit fehlenden Daten berechnen
Du bist Besitzer eines magischen Shops und in der Tabelle products gibt es eine Spalte price, aber bei manchen Produkten ist der Preis noch nicht eingetragen.
| id | name | price |
|---|---|---|
| 1 | Magic Wand | 150 |
| 2 | Enchanted Cloak | NULL |
| 3 | Potion Bottle | 75 |
| 4 | Spell Book | 200 |
| 5 | Crystal Ball | NULL |
Du willst den Durchschnittspreis nur für die Produkte wissen, bei denen er eingetragen ist.
SELECT AVG(price) AS average_price
FROM products;
Ergebnis:
| average_price |
|---|
| 141.6667 |
Wenn du für Produkte ohne Preis einen Standardwert (z.B. 0) setzen willst, kannst du die Funktion COALESCE() aus der nächsten Vorlesung benutzen.
Beispiel 3: Minimalen und maximalen Alter der Studierenden finden
In der Tabelle students steht das Alter der Studierenden, aber bei manchen ist das Alter unbekannt (NULL).
| id | name | age |
|---|---|---|
| 1 | Alex Lin | 20 |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 19 |
| 4 | Otto Art | 22 |
| 5 | Liam Park | NULL |
Wir wollen wissen, wer der jüngste und älteste Student ist.
SELECT
MIN(age) AS youngest_student,
MAX(age) AS eldest_student
FROM students;
Ergebnis:
| youngest_student | eldest_student |
|---|---|
| 19 | 22 |
Diese Anfrage gibt das Minimum und Maximum nur für die Studierenden zurück, bei denen das Alter eingetragen ist. NULL wird wieder ausgelassen.
Besonderheiten und Stolperfallen
Wenn du mit NULL in Aggregaten arbeitest, solltest du Folgendes beachten:
- Bei
SUM()undAVG()werdenNULLnicht berücksichtigt. Das kannst du nutzen, um „leere“ Werte aus den Berechnungen rauszuhalten. - Wenn du Zeilen mit
NULLin der Spalte mitzählen willst, nimmCOUNT(*). - Bei
MIN()oderMAX()beeinflusstNULLdas Ergebnis nicht. Aber wenn die ganze Spalte nur ausNULLbesteht, ist das Ergebnis auchNULL.
Tipps für den Umgang mit NULL
- Beachte die Aufgabe. Es ist wichtig zu verstehen, ob du
NULLin deiner Anfrage berücksichtigen musst. Manchmal, wie beiAVG(), ist das Ignorieren genau richtig. Manchmal, wie beim Zählen aller Zeilen, willst du auch die mitNULLdabei haben. - Nutze
COALESCE()wenn nötig. Wenn duNULLin Berechnungen durch einen Standardwert ersetzen willst, istCOALESCE()dein Freund (aber das ist Thema der nächsten Vorlesung). - Verwechsele
COUNT(*)undCOUNT(column)nicht. Das ist ein klassischer Anfängerfehler. Das erste zählt alle Zeilen, das zweite nur die mit nicht-null Werten.
Jetzt weißt du, wie das „schweigende“ NULL Aggregatfunktionen beeinflussen kann. Dieses Wissen hilft dir, böse Überraschungen zu vermeiden und NULL zu deinem Vorteil zu nutzen. In der nächsten Vorlesung schauen wir uns das mächtige COALESCE() an, um noch besser mit NULL klarzukommen.
GO TO FULL VERSION