Dreiwertige Logik und UNKNOWN
Warum NULL = NULL nicht TRUE ergibt und wie sich UNKNOWN durch Bedingungen fortpflanzt
Dreiwertige Logik und UNKNOWN ist eine kostenlose SQL Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 1 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 SQL Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Warum NULL Kandidaten in die Irre führt
NULL ist die häufigste Ursache für falsche Antworten in SQL-Interviews. Die Falle besteht darin, NULL wie einen normalen Wert zu behandeln, obwohl NULL in Wirklichkeit „unbekannt“ oder „nicht vorhanden“ bedeutet – nicht 0 und keine leere Zeichenkette.
Interviewerinnen und Interviewer mögen dieses Beispiel, weil die Syntax korrekt aussieht, das Ergebnis aber unbemerkt falsch ist. Sie könnten Ihnen einen Filter zeigen, der eine Zeile „eigentlich“ zurückgeben sollte, und fragen, warum er nichts zurückgibt.
In dieser Lektion entwickeln Sie das mentale Modell, das jede NULL-Frage entschärft: die dreiwertige Logik. Sobald Sie verinnerlicht haben, dass Vergleiche TRUE, FALSE oder UNKNOWN ergeben können, folgt der Rest daraus.
NULL ist kein Wert
Der wichtigste Satz, den Sie in einem Interview sagen sollten: NULL ist das Fehlen eines Werts und nicht selbst ein Wert.
Das bedeutet, dass Sie NULL nicht mit = so vergleichen können wie Zahlen. Die Datenbank weiß nicht, ob zwei unbekannte Werte gleich sind, und legt sich deshalb nicht auf TRUE oder FALSE fest.
NULL = 5ist nicht FALSE, sondern UNKNOWNNULL = NULList nicht TRUE, sondern UNKNOWNNULL <> NULList ebenfalls UNKNOWN
Deshalb entfernt ein naiver Gleichheitsfilter für eine NULL-fähige Spalte Zeilen unbemerkt.
Zweiwertige vs. dreiwertige Logik
Die meisten Programmiersprachen verwenden zweiwertige Logik: Ein Ausdruck ist entweder TRUE oder FALSE. SQL fügt bei einem Vergleich mit NULL ein drittes Ergebnis hinzu: UNKNOWN.
Daher kann jedes Prädikat in SQL eines von drei Ergebnissen liefern: TRUE, FALSE oder UNKNOWN. Die WHERE-Klausel behält eine Zeile nur dann, wenn ihr Prädikat genau TRUE ist. UNKNOWN verhält sich beim Filtern wie FALSE, ist logisch aber nicht dasselbe.
Interviewerinnen und Interviewer prüfen, ob Sie diesen Unterschied kennen, weil sich UNKNOWN unter NOT anders als FALSE verhält.
Ein Filter, der unbemerkt Zeilen entfernt
Hier ist das klassische durchgespielte Beispiel. Angenommen, bonus ist manchmal NULL. Eine interviewende Person fragt: „Diese Abfrage sollte alle Personen zurückgeben, deren Bonus nicht 1000 beträgt. Warum werden Mitarbeitende ohne Bonus übersprungen?“
Für eine Zeile, in der bonus NULL ist, ergibt bonus <> 1000 UNKNOWN und nicht TRUE. WHERE behält nur TRUE-Zeilen, daher verschwinden diese Mitarbeitenden.
Die Lösung besteht darin, NULL ausdrücklich zu behandeln; das behandeln wir in der nächsten Lektion. Erkennen Sie zunächst, dass die fehlenden Zeilen eine logische Folge und kein Fehler sind.
SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUENULL in AND-Ausdrücken
Die dreiwertige Logik verändert das Verhalten von AND. Merken Sie sich die Regel, dann können Sie jede Frage zu Wahrheitstabellen spontan beantworten.
- TRUE AND UNKNOWN = UNKNOWN
- FALSE AND UNKNOWN = FALSE
- UNKNOWN AND UNKNOWN = UNKNOWN
Die Intuition dahinter: AND benötigt nur ein einziges FALSE, um eindeutig FALSE zu sein. Daher bleibt FALSE AND alles FALSE. TRUE AND UNKNOWN bleibt jedoch UNKNOWN, weil die unbekannte Seite noch in beide Richtungen ausgehen könnte.
-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returnedNULL in OR-Ausdrücken
OR funktioniert spiegelbildlich zu AND. Es benötigt nur ein einziges TRUE, um eindeutig TRUE zu sein; TRUE lässt UNKNOWN daher ohne Wirkung.
- TRUE OR UNKNOWN = TRUE
- FALSE OR UNKNOWN = UNKNOWN
- UNKNOWN OR UNKNOWN = UNKNOWN
Eine Zeile kann also weiterhin eine OR-Bedingung erfüllen, obwohl ein Zweig UNKNOWN ist, solange ein anderer Zweig tatsächlich TRUE ist. Dies ist eine häufige Anschlussfrage nach der AND-Frage.
SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returnedNOT invertiert TRUE/FALSE, aber nicht UNKNOWN
Hier ist der subtile Punkt, den sich Interviewerinnen und Interviewer für den Schluss aufheben. NOT invertiert TRUE in FALSE und FALSE in TRUE, aber NOT UNKNOWN bleibt UNKNOWN.
Deshalb können Sie eine fehlschlagende Bedingung nicht einfach in NOT einschließen, um das Ergebnis umzukehren. Wenn bonus = 1000 für eine NULL-Zeile UNKNOWN ist, dann ist auch NOT (bonus = 1000) UNKNOWN, und die Zeile bleibt ausgeschlossen.
Eine Negation rettet NULL-Zeilen nicht. Nur eine explizite Prüfung mit IS NULL tut das.
-- For a row where bonus IS NULL:
-- bonus = 1000 -> UNKNOWN
-- NOT (bonus = 1000) -> UNKNOWN (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);Durchgespieltes Beispiel: Die NOT IN-Falle
Dies ist eines der meistgestellten NULL-Rätsel. NOT IN mit einer Liste, die ein NULL enthält, liefert überhaupt keine Zeilen – zur Überraschung von Kandidatinnen und Kandidaten, die erwarten, dass NULL einfach übersprungen wird.
Intern wird x NOT IN (1, 2, NULL) zu x <> 1 AND x <> 2 AND x <> NULL erweitert. Dieser letzte Vergleich ist UNKNOWN, und TRUE AND TRUE AND UNKNOWN wird zu UNKNOWN, sodass nichts die Bedingung erfüllt.
Die sichere Alternative ist NOT EXISTS; dafür ist sie nicht anfällig.
-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);
-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.Warum UNKNOWN sich in WHERE wie FALSE verhält
Eine häufige Anschlussfrage lautet: „Wenn UNKNOWN nicht FALSE ist, warum wird die Zeile dann genauso wie eine FALSE-Zeile entfernt?“
Die präzise Antwort lautet: WHERE, ON und HAVING verwenden alle die Regel nur TRUE behalten. Sowohl FALSE als auch UNKNOWN scheitern an diesem Test und sehen beim Filtern daher identisch aus.
Der Unterschied zeigt sich nur bei Negation und CHECK-Constraints. Eine CHECK-Constraint akzeptiert eine Zeile, wenn die Bedingung TRUE oder UNKNOWN ist. Eine NULL kann daher eine CHECK-Constraint passieren, von der Sie angenommen hatten, dass sie sie blockiert.
-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL -> NULL > 0 is UNKNOWN -> allowedTiefergehendes Beispiel: COUNT und die Lücke bei der Wahrheitsauswertung
Führen Sie das mit einer realistischen Interviewfrage zusammen: „Wir haben 100 Mitarbeitende. SELECT COUNT(*) WHERE bonus = 100 liefert 30, und WHERE bonus <> 100 liefert 50. Wo sind die anderen 20?“
Die fehlenden 20 haben einen NULL-Bonus. Für sie ist weder = 100 noch <> 100 TRUE; beide ergeben UNKNOWN, sodass diese Zeilen durch beide Filter fallen.
Zu sagen: „Die Gruppen ergeben zusammen nicht die Gesamtzahl, weil NULL keines der beiden Prädikate erfüllt“, ist genau die Antwort, die Interviewerinnen und Interviewer erwarten.
SELECT
COUNT(*) FILTER (WHERE bonus = 100) AS eq_100,
COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
COUNT(*) AS total
FROM employees;Wichtige Punkte fürs Interview
Wenn NULL-Logik zur Sprache kommt, nennen Sie diese Punkte, um Ihre Erfahrung zu zeigen:
- NULL bedeutet unbekannt; Vergleiche damit ergeben UNKNOWN.
- SQL verwendet dreiwertige Logik: TRUE, FALSE, UNKNOWN.
- WHERE, ON und HAVING behalten nur TRUE-Zeilen.
NOT UNKNOWNbleibt UNKNOWN, daher stellt eine Negation NULL-Zeilen nicht wieder her.NOT INmit einem beliebigen NULL liefert keine Zeilen; bevorzugen SieNOT EXISTS.
Nennen Sie zuerst das Modell und gehen Sie dann die Wahrheitstabelle durch. Diese Reihenfolge zeigt, dass Sie nicht nur den Trick, sondern auch das Warum verstehen.
Schnelltest
Überprüfen Sie Ihr Verständnis der dreiwertigen Logik.
Zusammenfassung
Sie verfügen nun über das grundlegende mentale Modell für NULL:
- NULL ist unbekannt, kein Wert; vergleichen Sie es nie mit
=oder<>. - SQL ist dreiwertig: Prädikate liefern TRUE, FALSE oder UNKNOWN.
- Filterklauseln behalten nur TRUE; Zeilen mit UNKNOWN verschwinden ebenso wie Zeilen mit FALSE.
NOTinvertiert TRUE und FALSE, lässt UNKNOWN aber unverändert.- Die Kombination aus
NOT INund NULL liefert null Zeilen; verwenden Sie stattdessenNOT EXISTS.
Als Nächstes: die korrekte Prüfung auf NULL mit IS NULL, IS NOT NULL und NULL-sicheren Gleichheitsoperatoren.
Häufig gestellte Fragen
Ist die Lektion „Dreiwertige Logik und UNKNOWN“ kostenlos?
Ja — der vollständige Text von „Dreiwertige Logik und UNKNOWN“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Dreiwertige Logik und UNKNOWN“?
Warum NULL = NULL nicht TRUE ergibt und wie sich UNKNOWN durch Bedingungen fortpflanzt Du übst SQL 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 SQL Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. SQL 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 1 von 4.
Wie lange dauert die Lektion „Dreiwertige Logik und UNKNOWN“?
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 SQL Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede SQL 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
- Dreiwertige Logik und UNKNOWN
- IS NULL, IS NOT NULL und NULL-sichere Gleichheit
- COALESCE, NULLIF und ISNULL
- NULL-Werte in Aggregaten, JOINs und DISTINCT