0Pricing
SQL Academy · Lektion

NULL in Aggregationen und Joins

Wie sich NULL in COUNT, SUM und JOINs verhält

NULL in Aggregationen und Joins ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

NULL-Werte verändern die Berechnung

Aggregatfunktionen und Joins behandeln NULL auf besondere Weise. Wenn Sie die Regeln nicht kennen, können Ihre Summen und Zählungen unbemerkt falsch sein.

Diese Lektion zeigt, wie COUNT, SUM, AVG, GROUP BY und äußere Joins mit fehlenden Werten interagieren.

SELECT amount FROM payments;
-- amount
-- -------
--    100
--   NULL   <- missing
--    200

Aggregatfunktionen ignorieren NULL-Werte

Die meisten Aggregatfunktionen — SUM, AVG, MIN, MAX — überspringen NULL-Werte einfach. Sie aggregieren nur die Zeilen, die Daten enthalten.

Ein NULL-Wert in amount verhindert also nicht, dass SUM funktioniert; er wird lediglich aus der Summe ausgelassen.

-- Using amounts 100, NULL, 200
SELECT
  SUM(amount) AS total,  -- 300 (NULL skipped)
  MIN(amount) AS lo,     -- 100
  MAX(amount) AS hi      -- 200
FROM payments;

Auch AVG überspringt NULL-Werte

AVG teilt die Summe der Nicht-NULL-Werte durch die Anzahl der Nicht-NULL-Werte. NULL-Werte werden aus beidem ausgeschlossen.

Das ist wichtig: Der Durchschnitt von {100, NULL, 200} ist 150, nicht 100 — der NULL-Wert wird nicht als null gezählt.

-- (100 + 200) / 2 = 150, the NULL row is ignored
SELECT AVG(amount) AS avg_amount FROM payments;

-- If you WANT NULLs counted as 0, COALESCE first:
SELECT AVG(COALESCE(amount, 0)) AS avg_with_zeros FROM payments; -- 100

COUNT(*) vs COUNT(column)

Dieser Unterschied führt bei vielen Menschen zu Fehlern:

  • COUNT(*) zählt Zeilen, auch solche mit NULL-Werten.
  • COUNT(column) zählt nur Zeilen, in denen diese Spalte nicht NULL ist.
-- 3 rows total, but only 2 have a non-NULL amount
SELECT
  COUNT(*)       AS row_count,    -- 3
  COUNT(amount)  AS has_amount    -- 2
FROM payments;

COUNT(DISTINCT) und NULL

COUNT(DISTINCT col) zählt die Anzahl der unterschiedlichen Nicht-NULL-Werte. NULL-Werte werden vollständig ausgeschlossen — sie erhöhen die Anzahl der unterschiedlichen Werte nie.

Denken Sie daran, wenn Sie messen, „wie viele eindeutige X“ es gibt.

-- statuses: 'paid', NULL, 'paid', 'void'
SELECT COUNT(DISTINCT status) AS distinct_statuses
FROM payments;
-- 2  (paid, void) -- NULL not counted

Aggregatfunktionen bei leeren Ergebnismengen

Wenn eine Aggregatfunktion über keine Zeilen ausgeführt wird, hängt das Ergebnis von der Funktion ab:

  • COUNT(...) gibt 0 zurück.
  • SUM, AVG, MIN, MAX geben NULL zurück.

Verwenden Sie COALESCE, um eine NULL-Summe bei Bedarf in 0 umzuwandeln.

-- No rows match -> SUM is NULL, not 0
SELECT COALESCE(SUM(amount), 0) AS total
FROM payments
WHERE status = 'refunded';  -- no such rows

GROUP BY gruppiert NULL-Werte zusammen

Obwohl NULL = NULL an anderen Stellen unbekannt ist, ordnet GROUP BY alle NULL-Werte einer einzigen Gruppe zu.

Eine NULL-Kategorie wird in den Ergebnissen also zu einem eigenen Bereich, sodass Sie die Zeilen mit fehlenden Daten gemeinsam zusammenfassen können.

SELECT category, COUNT(*) AS n
FROM products
GROUP BY category;

-- category | n
-- ---------+---
-- books    | 5
-- toys     | 3
-- NULL     | 2   <- all NULL categories in one group

NULL-Werte aus äußeren Joins

Äußere Joins sind eine wichtige Quelle für NULL-Werte. Ein LEFT JOIN behält jede Zeile der linken Tabelle. Gibt es rechts keinen Treffer, werden die Spalten der rechten Seite zu NULL.

Diese NULL-Werte bedeuten „keine übereinstimmende Zeile“ und nicht „ein gespeicherter NULL-Wert“.

SELECT c.name, o.id AS order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

-- name  | order_id
-- ------+---------
-- Alice | 10
-- Bob   | NULL     <- Bob has no orders

Treffer nach einem LEFT JOIN zählen

Um nach einem LEFT JOIN nur echte Treffer zu zählen, zählen Sie eine nicht NULL enthaltende Spalte aus der rechten Tabelle, nicht COUNT(*).

COUNT(o.id) ignoriert die NULL-Zeilen, die durch nicht übereinstimmende Zeilen der linken Tabelle entstehen, und liefert so die tatsächliche Anzahl der Bestellungen.

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

-- Bob shows 0, not 1×NULL

Nichtübereinstimmungen herausfiltern

Eine subtile Falle: Wenn Sie nach einem LEFT JOIN in WHERE eine Bedingung für die rechte Tabelle festlegen, wird daraus ein Inner Join, weil NULL = value unbekannt ist und herausgefiltert wird.

Wenn Sie nicht übereinstimmende Zeilen beibehalten möchten, setzen Sie die Bedingung in die ON-Klausel oder prüfen Sie ausdrücklich auf NULL.

-- Accidentally drops Bob (his o.status is NULL)
SELECT c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'open';

-- Keep unmatched rows: move the test into ON
SELECT c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id AND o.status = 'open';

Faustregeln

Behalten Sie diese Regeln bei jeder Abfrage mit Aggregatfunktionen und Joins im Hinterkopf:

  • Aggregatfunktionen ignorieren NULL-Werte (außer COUNT(*)).
  • COUNT(col) < COUNT(*), wenn col NULL-Werte enthält.
  • SUM/AVG über eine leere Ergebnismenge ergibt NULL — verwenden Sie COALESCE.
  • Ein LEFT JOIN erzeugt für nicht übereinstimmende Zeilen NULL-Werte; zählen Sie einen Schlüssel der rechten Seite.
  • Filter für die rechte Tabelle gehören in ON, nicht in WHERE.
SELECT c.name,
  COALESCE(SUM(o.amount), 0) AS spent,
  COUNT(o.id)                AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Schnelltest

Eine Spalte amount enthält in drei Zeilen die Werte 100, NULL und 200. Was geben COUNT(*) und COUNT(amount) zurück?

Zusammenfassung

Sie haben gelernt, wie sich NULL-Werte bei Aggregationen und Joins verhalten: Aggregatfunktionen überspringen NULL-Werte, COUNT(*) zählt Zeilen, während COUNT(col) Nicht-NULL-Werte zählt, Summen über leere Ergebnismengen sind NULL und GROUP BY fasst NULL-Werte in einer Gruppe zusammen.

Außerdem haben Sie gesehen, dass äußere Joins für nicht übereinstimmende Zeilen NULL-Werte erzeugen und warum Filter für die rechte Tabelle in ON gehören. Damit ist der Kurs Arbeiten mit NULL-Werten abgeschlossen — Sie können jetzt sicher mit fehlenden Daten umgehen.

-- A NULL-safe summary query
SELECT c.name,
  COUNT(o.id)                AS orders,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name
ORDER BY total_spent DESC;

Häufig gestellte Fragen

Ist die Lektion „NULL in Aggregationen und Joins“ kostenlos?

Ja — der vollständige Text von „NULL in Aggregationen und Joins“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „NULL in Aggregationen und Joins“?

Wie sich NULL in COUNT, SUM und JOINs verhält Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um SQL Academy zu starten?

Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „NULL in Aggregationen und Joins“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?

Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Was NULL wirklich bedeutet
  2. IS NULL und IS NOT NULL
  3. COALESCE und NULLIF
  4. NULL in Aggregationen und Joins
← Zurück zu SQL Academy