❓NULL und die dreiwertige Logik

NULL ist kein Wert, sondern die Markierung „unbekannt“ oder „nicht vorhanden“. Jeder Vergleich mit NULL ergibt deshalb weder TRUE noch FALSE, sondern UNKNOWN – SQL rechnet mit drei Wahrheitswerten.

🔢Wahrheitstabellen

Berechnet mit derselben Logik, die der Ausführungs-Debugger verwendet – und in den Tests gegen SQLite geprüft.

AND

a \ bTRUEFALSEUNKNOWN
TRUETRUEFALSEUNKNOWN
FALSEFALSEFALSEFALSE
UNKNOWNUNKNOWNFALSEUNKNOWN

OR

a \ bTRUEFALSEUNKNOWN
TRUETRUETRUETRUE
FALSETRUEFALSEUNKNOWN
UNKNOWNTRUEUNKNOWNUNKNOWN

NOT

NOTTRUE=FALSE
NOTFALSE=TRUE
NOTUNKNOWN=UNKNOWN

Merkhilfe: UNKNOWN verhält sich wie „vielleicht“. FALSE AND vielleicht = FALSE, TRUE OR vielleicht = TRUE, sonst bleibt es vielleicht.

🎛️Welche Zeilen kommen durch?

namestadtemailstadt <> 'Berlin'im Ergebnis?
Anna BergHamburganna@example.orgTRUE✅
Ben SchulzBerlinben@example.orgFALSE—
Clara VogelMünchenclara@example.orgTRUE✅
David KranzBerlinNULLFALSE—
Emil NovakKölnemil@example.orgTRUE✅
Frieda LangNULLfrieda@example.orgUNKNOWN—

SELECT * FROM kunden WHERE stadt <> 'Berlin' liefert 3 von 6 Zeilen.

⚠️ Die Regel
WHERE, HAVING und ON behalten nur Zeilen, deren Bedingung TRUE ist. FALSE und UNKNOWN werden gleich behandelt: Die Zeile fliegt raus. CHECK-Constraints dagegen lassen UNKNOWN durch – nur FALSE verletzt die Bedingung.
💡 Frieda hat keine Stadt
Sie wohnt weder „in Berlin“ noch „nicht in Berlin“ – jedenfalls nicht nachweislich. Wer sie dabeihaben will, muss OR stadt IS NULL ergänzen.

🧾NULL-Ausdrücke im Überblick

AusdruckErgebnisWarum?
NULL = NULLUNKNOWNNULL heißt „unbekannt“ – zwei Unbekannte sind nicht nachweislich gleich.
NULL <> 5UNKNOWNAuch Ungleichheit mit einem Unbekannten ist unbekannt.
NULL IS NULLTRUEIS NULL ist der einzige sichere Test auf NULL (liefert nie UNKNOWN).
3 IN (1, 2, NULL)UNKNOWN3 = NULL ist UNKNOWN, also ist die ganze Liste nicht sicher FALSE.
3 NOT IN (1, 2, NULL)UNKNOWNDie berühmte Falle: NOT IN mit einem NULL in der Liste ist nie TRUE.
1 IN (1, NULL)TRUEEin Treffer reicht – dann ist das NULL egal.
NULL AND FALSEFALSEEgal was unbekannt ist: mit FALSE verknüpft bleibt AND FALSE.
NULL OR TRUETRUEMit TRUE verknüpft ist OR immer TRUE.
NOT NULLUNKNOWNDas Gegenteil von unbekannt ist unbekannt.
NULL + 1NULLRechnen mit NULL ergibt NULL. COALESCE(x, 0) + 1 hilft.
'Buch' || NULLNULLStandard-SQL: Verketten mit NULL ergibt NULL (Oracle behandelt '' und NULL gleich – Ausnahme).

🧮NULL bei Aggregaten, Sortierung und Gruppen

💡 Aggregatfunktionen ignorieren NULL
COUNT(*) zählt Zeilen, COUNT(preis) nur Zeilen mit Preis. AVG(preis) teilt durch die Anzahl der Nicht-NULL-Werte. SUM über lauter NULLs ergibt NULL, nicht 0.
💡 GROUP BY und DISTINCT: NULLs sind „gleich“
Beim Gruppieren landen alle NULLs in einer Gruppe, DISTINCT behält ein NULL. Hier gilt „nicht verschieden“ statt „gleich“ – im Standard: IS NOT DISTINCT FROM.
✅ Hilfsmittel
COALESCE(a, b, …) liefert den ersten Nicht-NULL-Wert, NULLIF(a, b) macht aus a ein NULL, wenn a = b (z. B. gegen Division durch 0).
SQL-Engine wird geladen …