Valori NULL in MariaDB

NULL rappresenta un valore sconosciuto. Esso non è una stringa vuota o un valore zero. Questi sono tutti valori validi, non NULL.

Quando una tabella viene https://mariadb.com/kb/it/create-table/ o modificata, si può specificare che le colonne accettano i valori NULL o che non li accettano, usando rispettivamente le clausole NULL e NOT NULL.

Per esempio, una tabelle cliente può contenere le date di nascita. Per alcuni clienti questa informazione è sconosciuta, perciò il valore può essere NULL.

Lo stesso sistema potrebbe allocare un ID cliente per ogni record, e in questo caso il valore NULL non è ammesso.

CREATE TABLE customer (
 id INT NOT NULL, 
 date_of_birth DATE NULL
...
)

Operatori di comparazione

I valori NULL non possono essere utilizzati normalmente con la maggior parte degli operatori di compatazione. Per esempio per =, >, >=, <=, < e != ogni comparazione con un valore NULL restituisce sempre NULL, mai true (1) o false (0).

SELECT NULL = NULL;
+-------------+
| NULL = NULL |
+-------------+
|        NULL |
+-------------+

SELECT 99 = NULL;
+-----------+
| 99 = NULL |
+-----------+
|      NULL |
+-----------+

Per rimediare a questo problema, vi sono alcuni operatori specificamente pensati per lavorare con i valori NULL. Per verificare l'uguaglianza tra due valori che potrebbero essere NULL, vi è l'operatore <=>, cioè di uguaglianza NULL-safe.

SELECT 99 <=> NULL;
+-------------+
| 99 <=> NULL |
+-------------+
|           0 |
+-------------+

Tra gli altri operatori che lavorano con i NULL vi sono IS NULL e IS NOT NULL, ISNULL (per verificare un'espressione) e COALESCE (che restituisce il primo parametro non-NULL).

Ordinamento

Quando si ordinano i risultati per un campo che contiene valori NULL, NULL è considerato il valore più basso. Perciò ordinando in ordine discendente (DESC) i NULL saranno nelle ultime righe.

Tutti i valori NULL sono inoltre considerati uguali dalle clausole DISTINCT e GROUP BY.

Funzioni

Nella maggior parte dei casi, le funzioni restituiscono NULL se uno dei parametri è NULL. Vi sono però anche funzioni che gestiscono i NULL. Tra esse vi sono IFNULL() e NULLIF().

Le funzioni aggreganti, come SUM e AVG, ignorano i NULL.

CREATE TABLE t(x INT);

INSERT INTO t VALUES (1),(9),(NULL);

SELECT SUM(x) FROM t;
+--------+
| SUM(x) |
+--------+
|     10 |
+--------+

SELECT AVG(x) FROM t;
+--------+
| AVG(x) |
+--------+
| 5.0000 |
+--------+

Vi è un'eccezione: COUNT(*), che conta le righe, non controlla se un valore sia NULL o meno. Vediamo la differenza tra COUNT(x), che ignora i NULL, e COUNT(*), che li ignora:

SELECT COUNT(x) FROM t;
+----------+
| COUNT(x) |
+----------+
|        2 |
+----------+

SELECT COUNT(*) FROM t;
+----------+
| COUNT(*) |
+----------+
|        3 |
+----------+

AUTO_INCREMENT e TIMESTAMP

MariaDB gestisce i valori NULL in maniera speciale se il campo è un AUTO_INCREMENT o un TIMESTAMP. Inserendo un valore NULL in una colonna AUTO_INCREMENT, in realtà si inserisce il numero successivo nella sequenza autoincrementale. Questa tecnica si usa frequentemente con questi campi, per non doversi preoccupare del loro valore.

CREATE TABLE t2(id INT PRIMARY KEY AUTO_INCREMENT, letter CHAR(1));

INSERT INTO t2(letter) VALUES ('a'),('b');

SELECT * FROM t2;
+----+--------+
| id | letter |
+----+--------+
|  1 | a      |
|  2 | b      |
+----+--------+

Similmente, se si assegna un valore NULL a una campo TIMESTAMP, vengono inserite la data e l'ora corrente.

CREATE TABLE t3 (x INT, ts TIMESTAMP);

INSERT INTO t3(x) VALUES (1),(2);

After a pause,

INSERT INTO t3(x) VALUES (3);

SELECT* FROM t3;
+------+---------------------+
| x    | ts                  |
+------+---------------------+
|    1 | 2013-09-05 10:14:18 |
|    2 | 2013-09-05 10:14:18 |
|    3 | 2013-09-05 10:14:29 |
+------+---------------------+

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.