Oggi continuiamo a esplorare NULL — l’eroe invisibile dei database. Se pensi ancora che NULL sia solo "niente", hai ragione, ma non del tutto. In questa lezione impareremo a controllare se nei nostri dati c’è NULL e cosa farci. Allora, pronti a dare la caccia all’assenza di valori?
Partiamo dal semplice — immagina di lavorare con il database di un e-commerce. Hai una tabella degli ordini, dove per alcuni ordini non hanno aggiunto info sui commenti, mentre per altri ci sono delle note. Se vuoi cercare tutti gli ordini senza note, ma usi i soliti confronti =, <>, rimarrai sorpreso... Perché? Perché NULL è un caso speciale!
In SQL i controlli sulla presenza o assenza di NULL si fanno con IS NULL e IS NOT NULL. Questi operatori ci aiutano a gestire NULL e ottenere i dati che ci servono.
Controllare i valori con IS NULL
IS NULL si usa per verificare se una colonna o un’espressione contiene il valore NULL.
SELECT *
FROM orders
WHERE comment IS NULL;
Questa query restituisce tutte le righe dove il valore nella colonna comment è NULL. Utile se vuoi trovare gli ordini senza note.
Ecco un esempio della tabella orders:
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Consegna urgente" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Query:
SELECT id, customer_name
FROM orders
WHERE comment IS NULL;
Risultato:
| id | customer_name |
|---|---|
| 2 | Maria Chi |
| 4 | Anna Song |
Nota che le righe con stringa vuota '' non sono incluse, perché '' non è NULL.
Controllare i valori con IS NOT NULL
IS NOT NULL funziona al contrario; controlla se il valore non è NULL. Per esempio, se vuoi tutti gli ordini con commenti inseriti:
SELECT *
FROM orders
WHERE comment IS NOT NULL;
Questa query restituisce solo le righe dove nella colonna comment ci sono dati (comprese le stringhe vuote '').
Esempio
La tabella orders resta la stessa.
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Consegna urgente" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Eseguiamo la query:
SELECT id, customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Risultato:
| id | customer_name | comment |
|---|---|---|
| 1 | Otto Art | "Consegna urgente" |
| 3 | Alex Lin | '' |
Nota che la riga con la stringa vuota '' è inclusa. SQL considera questo valore come "non vuoto".
Quando usare IS NULL e IS NOT NULL?
Ecco qualche scenario:
- Filtraggio dati: vuoi escludere i record incompleti dove mancano valori.
- Gestione errori: a volte
NULLpuò indicare un errore di inserimento dati, e devi isolare queste righe. - Analisi dati: contare i record con valori mancanti aiuta a capire la qualità dei dati.
Applicazione pratica
Proviamo qualche esercizio pratico:
Esercizio 1: Selezionare studenti senza data di nascita
Supponiamo di avere la tabella students:
| id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-05-10 |
| 2 | Maria Chi | NULL |
| 3 | Alex Lin | 1998-12-30 |
| 4 | Anna Song | NULL |
Query:
SELECT name
FROM students
WHERE birth_date IS NULL;
Risultato:
| name |
|---|
| Maria Chi |
| Anna Song |
Questa query è utile per trovare gli studenti a cui manca la data di nascita.
Esercizio 2: Selezionare ordini con commenti
| id | customer_name | total_amount | comment |
|---|---|---|---|
| 1 | Otto Art | 1500 | "Consegna urgente" |
| 2 | Maria Chi | 3000 | NULL |
| 3 | Alex Lin | 2000 | '' |
| 4 | Anna Song | 5000 | NULL |
Per la tabella orders possiamo trovare gli ordini con commenti compilati:
SELECT customer_name, comment
FROM orders
WHERE comment IS NOT NULL;
Risultato:
| customer_name | comment |
|---|---|
| Otto Art | "Consegna urgente" |
| Alex Lin | '' |
Confronto con gli operatori standard
Ora facciamo un passo di lato e proviamo a eseguire una query "sbagliata" per controllare NULL:
SELECT *
FROM orders
WHERE comment = NULL;
Sorpreso? La query non restituirà nessuna riga, nemmeno quelle dove comment è chiaramente NULL. Questo perché NULL non si può confrontare con gli operatori standard. Per questi confronti dobbiamo usare IS NULL.
GO TO FULL VERSION