NULL significa che il campo NON esiste. Quindi non significa empty (0000-00-00) ma proprio campo mancante. Infatti deve essere identificato in modo apposito.

Un campo NULL valorizzato e poi successivamente azzerato non ritorna NULL, ma diventa campo vuoto o con il valore di default, ma presente. Per tornare NULL deve essere espressamente dichiarato con un update (set campo = NULL)

Meglio usare la data di default 0000-00-00 per una data assente o data non valida e non NULL per una campo con valori temporali.

per evitare di stampare la data 0000-00-00 puoi sempre ricorrere ad una if nella query:

codice:
select *, if(data = '0000-00-00', NULL, data) as data
from tabella