SQL NULL ist der Zustand „kein Wert vorhanden“ – kein Wert, nicht 0 und keine leere Zeichenkette. Wer mit NULL falsch umgeht, bekommt leere Ergebnisse oder stillschweigend falsche Zahlen. Dieser Artikel erklärt die dreiwertige Logik, die richtigen Vergleiche und die typischen NULL-Fallen in SQL.
Dreiwertige Logik: TRUE, FALSE, UNKNOWN
SQL arbeitet mit dreiwertiger Logik: Neben TRUE und FALSE gibt es UNKNOWN. Jeder Vergleich mit NULL liefert UNKNOWN – auch NULL = NULL. Eine WHERE-Bedingung übernimmt nur Zeilen, die TRUE ergeben; UNKNOWN fällt wie FALSE heraus.
SELECT name FROM kunden WHERE ort = NULL; -- liefert immer 0 Zeilen
NULL richtig prüfen: IS NULL und IS NOT NULL
NULL lässt sich nicht mit = vergleichen. Die eigenen Operatoren heißen IS NULL und IS NOT NULL – sie sind die einzige korrekte Prüfung. Details dazu stehen im Artikel SQL WHERE.
NULL in Aggregatfunktionen
COUNT(spalte)zählt nur Nicht-NULL-Werte,COUNT(*)zählt alle Zeilen.SUM,AVG,MINundMAXignorieren NULL-Werte.SUMüber eine leere oder reine-NULL-Menge liefert NULL – COALESCE setzt dann einen Ersatzwert (etwa 0).
NULL in GROUP BY und ORDER BY
Beim GROUP BY bilden alle Zeilen mit NULL in der Gruppenspalte eine eigene Gruppe. Beim ORDER BY hängt die Position vom Datenbanksystem ab: PostgreSQL sortiert NULL bei ASC standardmäßig ans Ende (NULLS LAST), MySQL und MariaDB ans Ende bei DESC bzw. an den Anfang bei ASC. PostgreSQL, Oracle und SQL Server können mit NULLS FIRST/NULLS LAST explizit steuern.
Die NOT-IN-Falle
NOT IN mit einer Liste, die NULL enthält, liefert keine Zeile:
SELECT name FROM kunden WHERE id NOT IN (1, NULL); -- 0 Zeilen!
Denn id <> NULL ergibt UNKNOWN und wird verworfen. Robuster ist NOT EXISTS oder ein WHERE spalte IS NOT NULL in der Unterabfrage. Auch EXCEPT behandelt NULL wie einen eigenen Wert, keine Duplikate werden verschmolzen.
NULL-Propagation und UNIQUE
Arithmetik mit NULL verbreitet sich: NULL + 5 ist NULL. Wer fehlende Werte ersetzen will, nutzt COALESCE oder einen bedingten CASE-Ausdruck. Ein UNIQUE-Constraint erlaubt in MySQL, MariaDB und PostgreSQL beliebig viele NULL-Werte, weil NULL als „unbekannt“ nicht gleich einem anderen NULL ist; eine NOT NULL-Constraint verbietet NULL dagegen komplett.
Im Gegensatz dazu steht der sprachübergreifende Begriff Null: Er bezeichnet in Programmiersprachen allgemein den Wert „nichts“, SQL NULL ist dessen Datenbank-Variante mit eigener Logik.