0Pricing
Coding Interview Prep · Lektion

NULL-Werte in Aggregaten, JOINs und DISTINCT

Erfahren, wie sich NULL bei Gruppierung, Verknüpfung und Eindeutigkeit unterschiedlich verhält

NULL-Werte in Aggregaten, JOINs und DISTINCT ist eine kostenlose Coding Interview Prep-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 Coding Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Coding Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

NULL an drei überraschenden Stellen

NULL verhält sich nicht überall gleich. Die letzte Lektion behandelt die drei Kontexte, in denen sein Verhalten Bewerber am häufigsten überrascht: Aggregatfunktionen, Joins und DISTINCT / GROUP BY.

Der wiederkehrende Kniff besteht darin, dass Aggregatfunktionen und Filter NULL als „überspringe mich“ behandeln, während Gruppierung und DISTINCT NULL als „einen Wert, der anderen NULL-Werten entspricht“ behandeln. Genau diese Inkonsistenz prüfen Interviewer gerne.

Wenn Sie diese Punkte beherrschen, kennen Sie die wichtigsten NULL-Fragen in SQL-Vorstellungsgesprächen.

Aggregatfunktionen ignorieren NULL

Die wichtigste Regel lautet: Aggregatfunktionen überspringen NULL-Werte. SUM, AVG, MIN, MAX und COUNT(column) ignorieren NULL-Eingaben vollständig, statt sie als 0 zu behandeln.

Deshalb kann AVG eine andere Zahl zurückgeben als erwartet. Die Funktion teilt die Summe der Nicht-NULL-Werte durch die Anzahl der Nicht-NULL-Werte, nicht durch die Gesamtzahl der Zeilen.

-- bonus values: 100, 200, NULL
SELECT
  SUM(bonus) AS total,   -- 300 (NULL ignored)
  AVG(bonus) AS average, -- 150 = 300 / 2, not / 3
  COUNT(bonus) AS cnt    -- 2 (NULL not counted)
FROM employees;

COUNT(*) im Vergleich zu COUNT(column)

Die am häufigsten gestellte Frage zu NULL-Werten in Aggregatfunktionen. COUNT(*) zählt Zeilen, einschließlich solcher mit NULL-Werten. COUNT(column) zählt nur Zeilen, in denen diese Spalte nicht NULL ist.

Der Unterschied zwischen beiden entspricht also genau der Anzahl der NULL-Werte in dieser Spalte. COUNT(DISTINCT column) geht noch weiter und ignoriert NULL ebenfalls, während Duplikate entfernt werden.

SELECT
  COUNT(*)              AS rows_total,    -- all rows
  COUNT(bonus)          AS non_null_bonus, -- excludes NULLs
  COUNT(DISTINCT bonus) AS distinct_bonus, -- excludes NULLs + dups
  COUNT(*) - COUNT(bonus) AS null_bonus
FROM employees;

AVG im Vergleich zu SUM/COUNT(*): Ein klassischer Stolperstein

Interviewer fragen: „Ist AVG(x) dasselbe wie SUM(x) / COUNT(*)?“ Die Antwort lautet nein, wenn NULL-Werte vorhanden sind.

AVG(x) entspricht SUM(x) / COUNT(x) und teilt durch die Anzahl der Nicht-NULL-Werte. Wenn Sie stattdessen durch COUNT(*) teilen, behandeln Sie NULL-Werte so, als wären sie 0, und senken den Durchschnitt künstlich.

Wenn Sie NULL tatsächlich als 0 zählen möchten, müssen Sie dies mit COALESCE ausdrücklich angeben.

-- These differ when bonus has NULLs:
SELECT
  AVG(bonus)                       AS avg_ignoring_nulls,
  SUM(bonus) * 1.0 / COUNT(*)      AS avg_nulls_as_zero,
  AVG(COALESCE(bonus, 0))          AS explicit_nulls_as_zero
FROM employees;

Der Sonderfall eines Aggregats mit ausschließlich NULL-Werten

Was gibt ein Aggregat zurück, wenn jede Eingabe NULL ist oder keine Zeilen vorhanden sind? Hier ist eine genaue Unterscheidung, die Interviewer gerne hören:

  • SUM, AVG, MIN und MAX über ausschließlich NULL-Werte oder bei 0 Zeilen geben NULL zurück.
  • COUNT gibt immer 0 zurück, niemals NULL.

Wenn ein Bericht leere Summen anzeigt, ist ein SUM mit ausschließlich NULL-Werten eine wahrscheinliche Ursache. Verwenden Sie COALESCE, um stattdessen 0 anzuzeigen.

-- No matching rows or all bonuses NULL:
SELECT SUM(bonus) FROM employees WHERE 1 = 0;  -- NULL
SELECT COUNT(bonus) FROM employees WHERE 1 = 0; -- 0

-- Present a clean zero:
SELECT COALESCE(SUM(bonus), 0) FROM employees;

NULL in JOIN-Bedingungen

In der ON-Klausel eines Joins ergibt NULL = NULL weiterhin UNKNOWN. Daher werden NULL-Schlüssel in einem Equi-Join nie zugeordnet. Zwei Zeilen, deren Join-Schlüssel beide NULL sind, werden nicht miteinander verknüpft.

Das führt häufig zu Problemen beim Join über optionale Fremdschlüssel. Wenn NULL-zu-NULL-Zuordnungen beabsichtigt sind, benötigen Sie einen NULL-sicheren Operator (IS NOT DISTINCT FROM oder <=>) aus der vorherigen Lektion.

-- Rows with region IS NULL on both sides do NOT match
SELECT *
FROM a JOIN b ON a.region = b.region;

-- To match NULL-to-NULL (ANSI):
SELECT *
FROM a JOIN b ON a.region IS NOT DISTINCT FROM b.region;

Von Outer Joins erzeugte NULL-Werte

Outer Joins erzeugen NULL-Werte für nicht übereinstimmende Zeilen. Nach einem LEFT JOIN ist jede Spalte auf der rechten Seite für linke Zeilen ohne Treffer NULL.

Das ist die Grundlage des Anti-Join-Musters: Filtern Sie mit WHERE right_table.key IS NULL, um Zeilen ohne Treffer zu finden, etwa Kunden ohne Bestellungen.

Seien Sie jedoch vorsichtig: Das Filtern einer Spalte aus einem Outer Join in WHERE kann den Join versehentlich wieder in einen Inner Join umwandeln. Das ist das Thema der nächsten Szene.

-- Find customers who have never ordered (anti-join)
SELECT c.id, c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;

Die NULL-Falle bei WHERE auf einem Outer Join

Ein beliebter Stolperstein: Sie führen einen LEFT JOIN auf orders aus und fügen anschließend WHERE o.status = 'shipped' hinzu. Plötzlich verschwinden Kunden ohne Bestellungen, wodurch Ihr Outer Join effektiv zu einem Inner Join wird.

Warum? Bei nicht übereinstimmenden Zeilen ist o.status NULL, und NULL = 'shipped' ergibt UNKNOWN. WHERE verwirft diese Zeilen daher. Damit nicht übereinstimmende Zeilen erhalten bleiben, verschieben Sie die Bedingung stattdessen in die ON-Klausel.

-- Accidental inner join: drops customers with no orders
SELECT c.name, o.status
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'shipped';

-- Correct: keep unmatched customers
SELECT c.name, o.status
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.status = 'shipped';

DISTINCT behandelt alle NULL-Werte als gleich

Hier ist die Inkonsistenz, die alle überrascht. Aggregatfunktionen überspringen NULL, aber DISTINCT behält genau ein NULL bei und behandelt alle NULL-Werte als Duplikate voneinander.

Über die Werte 100, 100, NULL, NULL liefert SELECT DISTINCT bonus also drei Zeilen zurück: 100, NULL und das war’s. Die beiden NULL-Werte werden zu einem zusammengefasst, obwohl NULL = NULL an anderer Stelle UNKNOWN ergibt.

-- bonus: 100, 100, NULL, NULL, 200
SELECT DISTINCT bonus FROM employees;
-- Returns: 100, 200, NULL  (the two NULLs become one row)

GROUP BY fasst NULL-Werte in einer Gruppe zusammen

GROUP BY folgt derselben Regel wie DISTINCT: Alle NULL-Schlüssel werden in einer einzigen Gruppe gesammelt. Das steht im Gegensatz zur Vergleichslogik, bei der NULL-Werte niemals gleich sind.

Wenn Sie nach einer Nullable-Spalte gruppieren, erhalten Sie also eine Zeile, die alle Datensätze mit NULL-Schlüssel repräsentiert. Für Auswertungen ist das normalerweise genau das gewünschte Verhalten. Erwähnen Sie diesen Gegensatz zwischen Gruppierung und Vergleich, um Ihre fachliche Tiefe zu zeigen.

-- All employees with NULL department form ONE group
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;
-- A single row where department is NULL totals all of them

Wichtige Punkte für Vorstellungsgespräche

Die zusammenfassende Aussage, mit der Sie Interviewer beeindrucken:

  • Aggregatfunktionen ignorieren NULL; AVG dividiert durch COUNT(column), nicht durch COUNT(*).
  • COUNT(*) zählt Zeilen; COUNT(col) und COUNT(DISTINCT col) überspringen NULL.
  • SUM/AVG/MIN/MAX über keine Zeilen liefern NULL; COUNT liefert 0.
  • Bei Joins passen NULL-Schlüssel niemals zusammen; durch das Filtern einer Spalte aus einem Outer Join in WHERE wird dieser unbemerkt zu einem Inner Join.
  • DISTINCT und GROUP BY behandeln alle NULL-Werte als gleich – das Gegenteil der Vergleichslogik.

Die Kurzform: „NULL wird beim Aggregieren und Vergleichen ignoriert, beim Entfernen von Duplikaten aber zu einer Gruppe zusammengefasst.“

Kurzer Test

Testen Sie den Gegensatz zwischen Gruppierung und Aggregation.

Zusammenfassung

Sie haben die Behandlung von NULL für Vorstellungsgespräche abgeschlossen:

  • Aggregatfunktionen überspringen NULL; AVG dividiert durch die Anzahl der Nicht-NULL-Werte, und eine SUM über ausschließlich NULL ergibt NULL, während COUNT 0 liefert.
  • COUNT(*) schließt NULL-Zeilen ein; COUNT(col) tut dies nicht, und die Differenz entspricht der Anzahl der NULL-Werte.
  • Join-Schlüssel mit dem Wert NULL passen niemals zusammen; das Filtern von Spalten aus einem Outer Join in WHERE kann diesen zu einem Inner Join machen.
  • DISTINCT und GROUP BY fassen alle NULL-Werte zu einer Gruppe zusammen – das Gegenteil der Vergleichslogik.

Merken Sie sich die Faustregel: NULL wird beim Aggregieren und Vergleichen ignoriert, beim Entfernen von Duplikaten aber zu einer Gruppe zusammengefasst. Diese eine Erkenntnis beantwortet die meisten Fragen zu NULL in Vorstellungsgesprächen.

Häufig gestellte Fragen

Ist die Lektion „NULL-Werte in Aggregaten, JOINs und DISTINCT“ kostenlos?

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

Was lerne ich in „NULL-Werte in Aggregaten, JOINs und DISTINCT“?

Erfahren, wie sich NULL bei Gruppierung, Verknüpfung und Eindeutigkeit unterschiedlich verhält Du übst Coding Interview Prep 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 Coding Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. Coding Interview Prep 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-Werte in Aggregaten, JOINs und DISTINCT“?

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 Coding Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede Coding Interview Prep-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. Dreiwertige Logik und UNKNOWN
  2. IS NULL, IS NOT NULL und NULL-sichere Gleichheit
  3. COALESCE, NULLIF und ISNULL
  4. NULL-Werte in Aggregaten, JOINs und DISTINCT
← Zurück zu Coding Interview Prep