NULL-Semantik
NULL bedeutet unbekannter oder undefinierter Wert und ist kein regulärer Wert eines Datentyps. NULL entsteht durch fehlende Einträge, INSERT ohne Wert oder als Ergebnis von OUTER JOINs. NULL unterscheidet sich klar von 0 oder Leerstring: 0 ist bekannt und gleich 0, NULL ist unbekannt. Codds Regel 3 fordert einheitliche Behandlung von NULL unabhängig vom Datentyp.
NULL heißt nicht null, sondern unbekannt.
Dreiwertige Logik
SQL kennt drei Wahrheitswerte: TRUE, FALSE und UNKNOWN. Der Wert UNKNOWN entsteht immer dann, wenn mindestens ein Operand eines Vergleichs NULL ist. Damit unterscheidet sich SQL von klassischer boolescher zweiwertiger Logik. AND, OR und NOT sind entsprechend erweiterte Wahrheitstafeln definiert.
TRUE, FALSE, UNKNOWN - drei Wahrheitswerte statt zwei.
NULL-Propagation in Arithmetik
Sobald in einer arithmetischen Operation ein Operand NULL ist, ist auch das Ergebnis NULL. Das gilt für Addition, Subtraktion, Multiplikation und sogar Division: 1+NULL, 5*NULL und 1/NULL ergeben alle NULL. Auch die String-Konkatenation mit || verhält sich so; nur concat() ignoriert NULL-Werte.
NULL infiziert die Rechnung - alles wird NULL.
WHERE-Filter und UNKNOWN
In die Ergebnismenge werden nur Tupel übernommen, für die die WHERE-Bedingung zu TRUE auswertet. Tupel mit Ergebnis FALSE oder UNKNOWN werden ausgeschlossen. Deshalb liefert semester < 13 OR semester >= 13 für Tupel mit semester = NULL nicht die Tautologie TRUE, sondern UNKNOWN - solche Tupel verschwinden.
Nur TRUE überlebt WHERE - UNKNOWN wird wie FALSE verworfen.
IS NULL und IS NOT NULL
Da x = NULL immer UNKNOWN liefert, funktioniert der Gleichheitsvergleich nicht zum Test auf NULL. Stattdessen gibt es die Prädikate IS NULL und IS NOT NULL, die immer TRUE oder FALSE liefern (nie UNKNOWN). Zusätzlich existieren DBMS-abhängige Funktionen wie coalesce(), ifnull() und isnull().
NULL testet man mit IS NULL, nie mit = NULL.
Wahrheitstafeln AND und OR
Für AND gilt: UNKNOWN AND FALSE = FALSE, UNKNOWN AND TRUE = UNKNOWN, UNKNOWN AND UNKNOWN = UNKNOWN. Für OR gilt: UNKNOWN OR TRUE = TRUE, UNKNOWN OR FALSE = UNKNOWN, UNKNOWN OR UNKNOWN = UNKNOWN. NOT UNKNOWN ergibt UNKNOWN. Falls ein Operand allein das Ergebnis fixiert, ist der zweite egal.
AND mit FALSE bleibt FALSE, OR mit TRUE bleibt TRUE - sonst UNKNOWN.
NULL bei OUTER JOIN und Aggregation
LEFT/RIGHT/FULL OUTER JOINs erzeugen NULL für nicht gematchte Tupel. Das nutzt man für Anti-Joins: WHERE h.matrnr IS NULL findet Studenten ohne Vorlesung. Aggregatfunktionen wie count(spalte), sum(), avg() ignorieren NULL automatisch; nur count(*) zählt alle Zeilen.
OUTER JOIN erzeugt NULL - Aggregat ignoriert NULL - ALL braucht IS NOT NULL.
Primärschlüssel und NULL
Nach der Entity-Integrität darf ein Primärschlüssel niemals NULL sein und muss eindeutig sein. Nullwerte sind nur in Attributen erlaubt, die nicht Teil eines Primärschlüssels sind. Bei Fremdschlüsseln ist NULL erlaubt und bedeutet: Beziehung noch nicht bekannt.
Primärschlüssel: nie NULL. Fremdschlüssel: darf NULL sein.