I valori Null nel modello relazionale
In una base dati il valore NULL indica l'assenza dell'informazione in uno o più attributi di una tupla.
In un DBMS il valore NULL indica l'assenza di informazione.
Il DBMS non distingue se l'informazione manca perché è sconosciuta o non esiste.
A cosa serve Null
I valori nulli permettono l'inserimento dei dati in una base dati anche se l'informazione è incompleta.
Nel modello relazionale ogni tupla deve essere diversa dalle altre che compongono la stessa tabella, perché ogni tabella è la rappresentazione di una relazione matematica.
Può comunque capitare di non avere tutte le informazioni necessarie per compilare una tupla.
In questi casi ho due possibilità:
- non inserire l'informazione in base dati finché non è completa
- inserire l'informazione in base dati sostituendo gli attributi mancanti con il valore speciale NULL
A seconda dei casi scelgo la prima o la seconda strada.
Nota. La scelta del valore speciale NULL permette di distinguere i valori sconosciuti o inesistenti. Se usassi un valore del dominio, ad esempio lo spazio vuoto, la stringa "n.p." o lo zero, si creerebbero delle ambiguità con gli altri valori della base dati. Ad esempio, se nella tabella ci fosse un campo "telefono" vuoto vorrebbe dire che la persona non ha il telefono oppure non conosco il suo numero? Non è possibile saperlo.
Un esempio pratico
Questa tabella "dipendenti" ha quattro attributi: matricola, cognome, nome, stato civile
Devo aggiungere un nuovo dipendente in base dati ma non conosco lo stato civile, cosa devo fare?
La tupla è incompleta. Se la base dati fosse rigida non potrei inserirlo.
Per fortuna la base dati è una struttura flessibile e permette l'assenza dell'informazione se non è essenziale.
In questo contesto l'informazione sullo stato civile del lavoratore non è essenziale.
Indico l'assenza dell'informazione uso il valore speciale NULL.
Poi inserisco la tupla nella tabella.
Posso comunque modificare la tupla in secondo momento per completare l'informazione quando ne sarò a conoscenza.
Nota. Se non conoscessi il cognome o la matricola il problema sarebbe diverso. In questo caso l'informazione è essenziale e non può essere sostituita con un valore nullo. In questi altri casi il valore Null non è ammissibile, è meglio non inserire la tupla nella tabella e attendere di completare l'informazione.
Pro e contro degli indicatori nulli
Il vantaggio degli indicatori nulli è già noto
- Permette l'inserimento delle informazioni incomplete nella base dati
Questa pratica ha però diversi svantaggi e alcuni limiti.
- Se gli indicatori nulli sono molti, si riduce la qualità della base dati.
- Non sempre è possibile sostituire un valore con l'indicatore NULL
Esempio. Se l'attributo è un campo chiave della tabella (matricola) o comunque un'informazione rilevante (cognome) non posso sostituirlo con NULL. In questi casi il valore nullo non è ammissibile.
Le due tuple non ammissibili potrebbero anche essere un duplicato della stessa informazione. Non è possibile saperlo.
In conclusione, l'uso del valore null indica la non disponibilità di un'informazione.
E' ammissibile soltanto se l'informazione non è essenziale.
Is Null e Is Not Nul
I valori nulli non contribuiscono al risultato di un'espressione booleana perché non sono né veri, né falsi. Sono valori sconosciuti (unknow).
Per questa ragione nell'algebra relazionale e nel linguaggo SQL i valori nulli sono trattati con apposite condizioni atomiche di selezione:
- Is Null
Questa espressione è vera se il valore è nullo. Viceversa è falsa. - Is Not Null
Questa espressione è vera se il valore non è nullo. Viceversa è falsa.
Esempio
Questa relazione include un valore nullo (NULL) nell'attributo val (terza colonna) in corrispondenza della quarta tupla.
Se provo a selezionare tutti i valori possibili dell'attributo val in algebra relazionale
σ(val>5∨val≤5) (tabella)
o nel linguaggio SQL
SELECT * FROM tabella WHERE (val > 5) OR (val <= 5 )
Paradossalmente, il risultato finale ha una cardinalità minore, due tuple anziché tre, perché il valore nullo è escluso dalla selezione.
Pertanto, l'esclusione dei valori NULL può causare una perdita di informazioni nella base dati.
Per risolvere il problema in algebra relazionale si usa la condizione Is Null e la sua negazione Is Not Null.
σ(val>5∨val≤5∨val IS NULL) (tabella)
e lo stesso in SQL
SELECT * FROM tabella WHERE (val > 5) OR (val <= 5 ) OR (val IS NULL)
In questo modo ii risultato finale include tutte le tuple delle tabelle in ingresso.
E così via