❓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 \ b | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| TRUE | TRUE | FALSE | UNKNOWN |
| FALSE | FALSE | FALSE | FALSE |
| UNKNOWN | UNKNOWN | FALSE | UNKNOWN |
OR
| a \ b | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| FALSE | TRUE | FALSE | UNKNOWN |
| UNKNOWN | TRUE | UNKNOWN | UNKNOWN |
NOT
| NOT | TRUE | = | FALSE |
| NOT | FALSE | = | TRUE |
| NOT | UNKNOWN | = | UNKNOWN |
Merkhilfe: UNKNOWN verhält sich wie „vielleicht“. FALSE AND vielleicht = FALSE, TRUE OR vielleicht = TRUE, sonst bleibt es vielleicht.
🎛️Welche Zeilen kommen durch?
| name | stadt | stadt <> 'Berlin' | im Ergebnis? | |
|---|---|---|---|---|
| Anna Berg | Hamburg | anna@example.org | TRUE | ✅ |
| Ben Schulz | Berlin | ben@example.org | FALSE | — |
| Clara Vogel | München | clara@example.org | TRUE | ✅ |
| David Kranz | Berlin | NULL | FALSE | — |
| Emil Novak | Köln | emil@example.org | TRUE | ✅ |
| Frieda Lang | NULL | frieda@example.org | UNKNOWN | — |
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
| Ausdruck | Ergebnis | Warum? |
|---|---|---|
| NULL = NULL | UNKNOWN | NULL heißt „unbekannt“ – zwei Unbekannte sind nicht nachweislich gleich. |
| NULL <> 5 | UNKNOWN | Auch Ungleichheit mit einem Unbekannten ist unbekannt. |
| NULL IS NULL | TRUE | IS NULL ist der einzige sichere Test auf NULL (liefert nie UNKNOWN). |
| 3 IN (1, 2, NULL) | UNKNOWN | 3 = NULL ist UNKNOWN, also ist die ganze Liste nicht sicher FALSE. |
| 3 NOT IN (1, 2, NULL) | UNKNOWN | Die berühmte Falle: NOT IN mit einem NULL in der Liste ist nie TRUE. |
| 1 IN (1, NULL) | TRUE | Ein Treffer reicht – dann ist das NULL egal. |
| NULL AND FALSE | FALSE | Egal was unbekannt ist: mit FALSE verknüpft bleibt AND FALSE. |
| NULL OR TRUE | TRUE | Mit TRUE verknüpft ist OR immer TRUE. |
| NOT NULL | UNKNOWN | Das Gegenteil von unbekannt ist unbekannt. |
| NULL + 1 | NULL | Rechnen mit NULL ergibt NULL. COALESCE(x, 0) + 1 hilft. |
| 'Buch' || NULL | NULL | Standard-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 …