CodeGym /Kurse /SQL SELF /Einfluss von NULL auf Aggregatfunktionen: SUM(), COUNT(),...

Einfluss von NULL auf Aggregatfunktionen: SUM(), COUNT(), AVG(), MIN(), MAX()

SQL SELF
Level 9 , Lektion 2
Verfügbar

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() und AVG() ignorieren NULL. Wenn mindestens ein Eintrag NULL ist, 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() und MAX() überspringen NULL ebenfalls. Sie suchen das Minimum oder Maximum nur aus den Daten, die nicht NULL sind. Wenn du also nach dem jüngsten Mitarbeiter suchst, der das Geburtsdatum nicht eingetragen hat, wird NULL nicht „gewinnen“.
  • COUNT(*) zählt alle Zeilen, auch die mit NULL. Aber COUNT(column) zählt nur die Zeilen, in denen in der angegebenen Spalte ein Wert steht, also wird NULL ignoriert.

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:

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

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

  1. Minimaler und maximaler Score: MIN() und MAX()
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.

  1. Zeilen zählen: COUNT(*) vs COUNT(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, wo score NULL ist.
  • COUNT(score) hat nur die Zeilen gezählt, wo in der Spalte score ein 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() und AVG() werden NULL nicht berücksichtigt. Das kannst du nutzen, um „leere“ Werte aus den Berechnungen rauszuhalten.
  • Wenn du Zeilen mit NULL in der Spalte mitzählen willst, nimm COUNT(*).
  • Bei MIN() oder MAX() beeinflusst NULL das Ergebnis nicht. Aber wenn die ganze Spalte nur aus NULL besteht, ist das Ergebnis auch NULL.

Tipps für den Umgang mit NULL

  1. Beachte die Aufgabe. Es ist wichtig zu verstehen, ob du NULL in deiner Anfrage berücksichtigen musst. Manchmal, wie bei AVG(), ist das Ignorieren genau richtig. Manchmal, wie beim Zählen aller Zeilen, willst du auch die mit NULL dabei haben.
  2. Nutze COALESCE() wenn nötig. Wenn du NULL in Berechnungen durch einen Standardwert ersetzen willst, ist COALESCE() dein Freund (aber das ist Thema der nächsten Vorlesung).
  3. Verwechsele COUNT(*) und COUNT(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.

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION