NULL-Semantik
NULL bedeutet unbekannter oder undefinierter Wert und ist kein regulaerer Wert eines Datentyps. NULL entsteht durch fehlende Eintraege, 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 unabhaengig vom Datentyp.
NULL heisst 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 fuer Addition, Subtraktion, Multiplikation und sogar Division: 1+NULL, 5*NULL und 1/NULL ergeben alle NULL. Auch die String-Konkatenation mit || verhaelt sich so; nur concat() ignoriert NULL-Werte.
NULL infiziert die Rechnung - alles wird NULL.
WHERE-Filter und UNKNOWN
In die Ergebnismenge werden nur Tupel uebernommen, fuer die die WHERE-Bedingung zu TRUE auswertet. Tupel mit Ergebnis FALSE oder UNKNOWN werden ausgeschlossen. Deshalb liefert semester < 13 OR semester >= 13 fuer Tupel mit semester = NULL nicht die Tautologie TRUE, sondern UNKNOWN - solche Tupel verschwinden.
Nur TRUE ueberlebt 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 Praedikate IS NULL und IS NOT NULL, die immer TRUE oder FALSE liefern (nie UNKNOWN). Zusaetzlich existieren DBMS-abhaengige Funktionen wie coalesce(), ifnull() und isnull().
NULL testet man mit IS NULL, nie mit = NULL.
Wahrheitstafeln AND und OR
Fuer AND gilt: UNKNOWN AND FALSE = FALSE, UNKNOWN AND TRUE = UNKNOWN, UNKNOWN AND UNKNOWN = UNKNOWN. Fuer 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 fuer nicht gematchte Tupel. Das nutzt man fuer Anti-Joins: WHERE h.matrnr IS NULL findet Studenten ohne Vorlesung. Aggregatfunktionen wie count(spalte), sum(), avg() ignorieren NULL automatisch; nur count(*) zaehlt alle Zeilen.
OUTER JOIN erzeugt NULL - Aggregat ignoriert NULL - ALL braucht IS NOT NULL.
Primaerschluessel und NULL
Nach der Entity-Integritaet darf ein Primaerschluessel niemals NULL sein und muss eindeutig sein. Nullwerte sind nur in Attributen erlaubt, die nicht Teil eines Primaerschluessels sind. Bei Fremdschluesseln ist NULL erlaubt und bedeutet: Beziehung noch nicht bekannt.
Primaerschluessel: nie NULL. Fremdschluessel: darf NULL sein.