NULL e' un valore .. anzi un NON valore specifico. Non esiste, non viene conteggiato, valutato, non e' VUOTO, non e' ZERO. Non lo trovi con where campo = '' ma con where campo IS NULL.

NOT NULL esiste sempre e puo' essere vuoto, pieno, zero, FALSE, TRUE.

Ci dovrebbe essere sempre una buona ragione per mettere un campo NULL, come per esempio in statistiche o altri raggruppamenti.

La differenza sara' che NULL non viene proprio visto, NOT NULL vuoto vien visto e valutato come tale.

es. un campo con 10 valori di cui 8 con dati presenti, con NULL i campi che vengono conteggiati sono 8, con NOT NULL invece sono 10. Se facessi una media (AVG) sulla colonna i risultati sarebbero ben diversi.