NULL-Werte in SQL: Was sie wirklich bedeuten und wie du damit umgehst

Auf einer Party fragst du jemanden nach seinem Geburtsdatum – und er antwortet einfach nicht. Nicht mit einem Datum, nicht mit einem „Weiß ich nicht“, sondern mit absolut gar nichts. So ähnlich funktionieren NULL-Werte in SQL: Sie sind keine Werte, sondern eine Art „Antwortverweigerung“.

NULL-Werte sind in der Welt von Datenbanken eine Quelle großer Verwirrung. Viele Entwickler:innen stolpern über sie, weil NULL weder eine Zahl, noch ein Text oder ein leerer String ist. NULL bedeutet schlicht: „Hier gibt es keinen Wert“ – aber warum ist das so wichtig? Und vor allem: Wie kannst du im Alltag mit NULL-Werten umgehen, ohne dabei Daten zu verlieren oder Abfragen zu verfälschen?

In diesem Artikel erkläre ich dir, was NULL-Werte wirklich bedeuten, welche Stolperfallen sie mit sich bringen und wie du sie richtig behandelst. So wird das Thema NULL für dich keine Blackbox mehr sein, sondern ein Werkzeug, das du sicher beherrschst.

NULL-Wert in SQL

1. Was ist NULL wirklich?

NULL ist kein „Wert“ im klassischen Sinne – sondern eher ein Zustand. In SQL signalisiert NULL, dass ein Wert unbekannt, undefiniert oder schlicht nicht vorhanden ist. Das unterscheidet sich deutlich von anderen Datentypen:

  • Ein leerer String ('') ist ein definierter Wert – nämlich eine Zeichenkette ohne Inhalt.
  • Die Zahl 0 ist ein gültiger Wert, der genau so gespeichert und ausgewertet wird.
  • FALSE ist ein boolescher Wert und damit auch ein Wert.

NULL hingegen bedeutet: Es gibt keine Information über diesen Wert.

Drei häufige Ursachen für NULL:

  1. Fehlende Daten
    Beispielsweise bei einem optionalen Formularfeld, das der Benutzer nicht ausgefüllt hat.
  2. Nicht anwendbare Werte
    Zum Beispiel das Ablaufdatum bei einem Produkt, das nicht verderblich ist – hier gibt es einfach keinen Wert.
  3. Unbekannte Werte aus Joins
    Wenn du Tabellen verbindest und für einige Zeilen keine passenden Daten vorhanden sind, steht dort oft NULL.

2. Die Tücken von NULL in Operationen

NULL-Werte können deine SQL-Abfragen ganz schön durcheinanderbringen, vor allem wenn du sie mit herkömmlichen Vergleichsoperatoren benutzt.

Vergleiche mit NULL:

Ein häufiger Fehler ist die Verwendung von WHERE column = NULL. Das funktioniert nicht – denn NULL ist kein Wert, sondern ein Zustand. Ein Vergleich mit = oder != liefert immer FALSE oder UNKNOWN zurück, sodass die Zeile nicht ausgewählt wird.

Richtig ist:

SELECT * FROM users WHERE phone IS NULL;

oder für das Gegenteil:

SELECT * FROM users WHERE phone IS NOT NULL;

Logik-Bombe: NULL in Bedingungen

NULL beeinflusst auch logische Ausdrücke. Das liegt daran, dass SQL mit drei Wahrheitswerten arbeitet: TRUE, FALSE und UNKNOWN (wobei UNKNOWN durch NULL repräsentiert wird).

Ausdruck Ergebnis
NULL AND TRUE NULL (UNKNOWN)
NULL OR FALSE NULL (UNKNOWN)
NOT NULL NULL (UNKNOWN)

Das führt manchmal zu überraschenden Ergebnissen. Zum Beispiel:

SELECT * FROM table WHERE id NOT IN (1, 2, NULL);

Diese Abfrage gibt keine Zeile zurück, weil NOT IN mit NULL immer UNKNOWN wird und somit die Zeile ausscheidet.

3. Praktische Lösungen für den Alltag

NULL-Werte können deine SQL-Abfragen ganz schön durcheinanderbringen, vor allem wenn du sie mit herkömmlichen Vergleichsoperatoren benutzt.

Vergleiche mit NULL:

Ein häufiger Fehler ist die Verwendung von WHERE column = NULL. Das funktioniert nicht – denn NULL ist kein Wert, sondern ein Zustand. Ein Vergleich mit = oder != liefert immer FALSE oder UNKNOWN zurück, sodass die Zeile nicht ausgewählt wird.

Richtig ist:

SELECT * FROM users WHERE phone IS NULL;

oder für das Gegenteil:

SELECT * FROM users WHERE phone IS NOT NULL;

Logik-Bombe: NULL in Bedingungen

NULL beeinflusst auch logische Ausdrücke. Das liegt daran, dass SQL mit drei Wahrheitswerten arbeitet: TRUE, FALSE und UNKNOWN (wobei UNKNOWN durch NULL repräsentiert wird).

Ausdruck Ergebnis
NULL AND TRUE NULL (UNKNOWN)
NULL OR FALSE NULL (UNKNOWN)
NOT NULL NULL (UNKNOWN)

Das führt manchmal zu überraschenden Ergebnissen. Zum Beispiel:

SELECT * FROM table WHERE id NOT IN (1, 2, NULL);

Diese Abfrage gibt keine Zeile zurück, weil NOT IN mit NULL immer UNKNOWN wird und somit die Zeile ausscheidet.

4. Fortgeschrittene Szenarien

NULL-Werte bringen nicht nur in einfachen Abfragen Herausforderungen, sondern auch bei komplexeren SQL-Konstrukten.

NULL in Joins:

Standardmäßig schließen JOINs Zeilen aus, wenn auf einer Seite NULL steht, weil der Vergleich fehlschlägt.
Beispiel: Ein INNER JOIN verbindet nur Zeilen, bei denen der Join-Key übereinstimmt – NULLs passen nicht dazu.

Lösung:
Bei Bedarf kannst du auch explizit NULLs vergleichen, etwa so:

FROM tableA a
LEFT JOIN tableB b
  ON a.key = b.key OR (a.key IS NULL AND b.key IS NULL)

Damit werden auch Zeilen verbunden, deren Join-Keys beide NULL sind.

UNIQUE Constraints und NULL:

In vielen Datenbanksystemen dürfen UNIQUE-Spalten mehrere NULL-Werte enthalten, da NULL als „unbekannt“ gilt und deshalb nicht als identisch betrachtet wird. Das kann überraschend sein, wenn man erwartet, dass UNIQUE eine exakte Einzigartigkeit erzwingt.

Performance-Killer:

  • Abfragen wie WHERE spalte <> 1 schließen NULL-Werte aus, weil NULL mit keinem Wert vergleichbar ist.
  • Indizes werden für NULL-Werte oft nicht genutzt oder nicht vollständig. Einige Systeme bieten sogenannte partielle Indizes an, die z. B. nur Zeilen ohne NULL in einer Spalte indexieren:
CREATE INDEX idx_non_null ON table(spalte) WHERE spalte IS NOT NULL;

Das verbessert die Performance von Abfragen, die NULL-Werte ignorieren.

5. Best Practices

Wenn du regelmäßig mit NULL-Werten arbeitest, helfen dir einige Regeln und Empfehlungen, Fehler zu vermeiden und den Code sauber zu halten.

DOs:

  • Default-Werte bei CREATE TABLE definieren:
    Vermeide unnötige NULLs, indem du Standardwerte vergibst, z. B.:
    CREATE TABLE users (
        active BOOLEAN DEFAULT TRUE
    );
  • Immer IS NULL / IS NOT NULL für Vergleiche nutzen:
    Statt = NULL oder != NULL immer die korrekten Operatoren verwenden.
  • Dokumentation von NULL-Bedeutungen im Datenmodell:
    Beschreibe, was NULL in welcher Spalte bedeutet — ist es „unbekannt“, „nicht anwendbar“ oder „nicht angegeben“?

DON’Ts:

  • NULL für „leer“ missbrauchen:
    Nutze lieber boolesche Flags oder andere Werte für „leer“ statt NULL, um Missverständnisse zu vermeiden.
  • NULL in Primärschlüsseln:
    Primärschlüssel sollten nie NULL sein, außer in speziellen Fällen.

6. Fazit: Philosophischer Ausklang

NULL ist wie Schrödingers Wert: Er existiert und existiert nicht gleichzeitig. In der SQL-Welt ist NULL ein faszinierendes Konzept, das zeigt, wie vielschichtig Daten und deren Bedeutung sein können.

Wer NULL richtig versteht, beherrscht nicht nur die Technik, sondern auch die dahinterliegende Logik und Philosophie von Datenbanken. Dieses Verständnis macht dich zum echten SQL-Meister – denn du kannst Daten korrekt interpretieren, Fehler vermeiden und deine Abfragen präzise formulieren.

Also, scheue dich nicht vor NULL – sondern nutze es als Werkzeug, um deine Datenwelt besser zu verstehen!