Database MariaDB o MySQL ed il valore NULL

12 novembre 2016

​​Per lavorare con il valore NULL in MariaDB o MySQL bisogna partire dal presupposto che ques'ultimo viene analizzato in maniera diversa dagli altri valori.
Utilizzare gli operatori aritmetici di confronto non è di alcuna utilità in quanto il risultato di un confronto con NULL darà sempre NULL:
 MariaDB > SELECT 3 = NULL, 3 <> NULL, 3 < NULL, 3 > NULL;
+----------+-----------+----------+----------+
| 3 = NULL | 3 <> NULL | 3 < NULL | 3 > NULL |
+----------+-----------+----------+----------+
| NULL | NULL | NULL | NULL |
+----------+-----------+----------+----------+
Anche la query seguente fornirà NULL come risultato:
 MariaDB > SELECT NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
| NULL |
+-------------+
Se aggiungiamo che i valori 0 e NULL in MariaDB-MySQL significano falso è chiaro che in questo modo siamo del tutto fuorviati.

Per chiarire meglio il concetto supponiamo di avere una tabella che chiameremo tabella_esempio:
+----------+------------+-------------+
| cognome | nome | nazionalita |
+----------+------------+-------------+
| MARIO | ROSSI | 1 |
| VERDI | GIUSEPPE | NULL |
| FEDERICA | FELLINI | 1 |
| ZAMA | PASQUALE | 2 |
| CICCO | ANTONIO | 1 |
| ZAICK | ERGAN | 2 |
| VERI | SARA | NULL |
| SARTORI | SAVERIO | 1 |
+----------+------------+-------------+

Se volessimo estrarre dalla tabella i record per i quali il campo nazionalita assume il valore NULL, con la seguente query non otterremo il risultato sperato:
MariaDB > SELECT cognome, nome, nazionalita FROM tabella_esempio WHERE nazionalita = NULL ;
Empty set (0.00 sec)
​Infatti il numero di record restituiti sarà zero.
Per lavorare con colonne contenenti valori NULL dobbiamo invece ricorrere agli operatori IS NULL e IS NOT NULL
MariaDB > select cognome,nome, nazionalita from tabella_esempio where nazionalita IS NULL;      
+-----------+----------+-------------+
| cognome | nome | nazionalita |
+-----------+----------+-------------+
| VERDI | GIUSEPPE | NULL |
| VERI | SARA | NULL |
+-----------+----------+-------------+
2 rows in set (0.00 sec)
 Al contrario per estrarre i record per i quali il campo nazionalita è settato:
MariaDB > SELECT cognome, nome, nazionalita from tabella_esempio WHERE nazionalita IS NOT NULL ;
+----------+------------+-------------+
| cognome | nome | nazionalita |
+----------+------------+-------------+
| MARIO | ROSSI | 1 |
| FEDERICA | FELLINI | 1 |
| ZAMA | PASQUALE | 2 |
| CICCO | ANTONIO | 1 |
| DOTTA | SONIA | 1 |
| ZAICK | ERGAN | 2 |
| SARTORI | SAVERIO | 1 |
+----------+------------+-------------+
7 rows in set (0.00 sec)