Fondamenti

NULL e COALESCE in SQL: gestiscono i valori mancanti

Gestisci esplicitamente i valori mancanti per produrre filtri, calcoli e report affidabili.

Team SQL.tn10min
Editor SQL che mostra come gestire i valori mancanti in una tabella

Cosa significa NULL in SQL?

NULL segnala l'assenza di un valore noto. Non rappresenta zero, una stringa vuota o il testo "NULL". Una data di consegna NULL può, ad esempio, significare che l'ordine non è stato ancora consegnato.

Questa sfumatura è essenziale: sostituire automaticamente un'assenza con zero può trasformare un'informazione sconosciuta in un'affermazione errata. Prima di qualsiasi query, documentare il motivo per cui la colonna accetta NULL.

Le persone, gli ordini e i dettagli di contatto in questo articolo sono fittizi e sono solo a scopo didattico.

Cerca un valore mancante con IS NULL

La condizione telephone = NULL non restituisce le righe previste. Un confronto con un valore sconosciuto produce un risultato sconosciuto, che WHERE non conserva.

SQL fornisce quindi gli operatori IS NULL e IS NOT NULL. La prima ricerca le assenze; il secondo mantiene i valori immessi.

  • Corretto: telephone IS NULL.
  • Corretto: telephone IS NOT NULL.
  • Errato: telephone = NULL o telephone <> NULL.
Clienti senza numero di telefono
SELECT id_client, nom
FROM clients
WHERE telephone IS NULL
ORDER BY id_client ASC;

Perché NULL cambia le condizioni?

Una condizione SQL può essere vera, falsa o sconosciuta. Se remise vale NULL, le espressioni remise = 0, remise > 0 e remise <> 0 sono sconosciute: nessuna consente di dedurre l'importo reale.

Questa logica spiega perché una condizione negativa non recupera necessariamente tutte le altre righe. Quando la regola deve includere delle assenze, scriverla esplicitamente con OR remise IS NULL.

Prodotti senza sconto positivo
SELECT produit, remise
FROM produits
WHERE remise = 0
   OR remise IS NULL;

COALESCE restituisce il primo valore disponibile

COALESCE legge i suoi argomenti da sinistra a destra e restituisce il primo che non è NULL. Questa funzione è utile per visualizzare un'etichetta alternativa o scegliere tra più modalità di contatto.

Non modifica i dati registrati. La sostituzione esiste solo nel risultato della query, che conserva le informazioni originali.

Scegli il miglior contatto disponibile
SELECT
  nom,
  COALESCE(telephone, email, 'Non specificato') AS contact
FROM clients
ORDER BY nom ASC;
Gli argomenti per COALESCE devono avere tipi compatibili. Il testo alternativo è adatto per una colonna di testo, non direttamente per un calcolo numerico.

Sostituisci NULL in un calcolo solo se la regola lo consente

Una quantità NULL rende generalmente sconosciuto un calcolo aritmetico. Se il modello di business stabilisce che uno sconto mancante è effettivamente pari a zero, COALESCE può rendere esplicita questa regola.

D’altro canto, il reddito sconosciuto non dovrebbe essere trasformato arbitrariamente in reddito zero. Questa decisione abbasserebbe artificialmente una media e potrebbe distorcere un indicatore.

  • Impostare la direzione di NULL prima del calcolo.
  • Utilizzare un valore sostitutivo dello stesso tipo.
  • Conservare l'assenza se contiene informazioni utili.
Prezzo netto con sconto facoltativo
SELECT
  produit,
  prix - COALESCE(remise, 0) AS prix_net
FROM produits;

COUNT, SUM e AVG non trattano tutti NULL allo stesso modo

COUNT(*) conta tutte le righe, mentre COUNT(colonne) ignora i valori NULL in questa colonna. Questa differenza facilita la misurazione del numero totale di clienti e del numero di telefoni inseriti.

Anche SUM e AVG ignorano i valori NULL. Utilizzando AVG(COALESCE(note, 0)) invece si sommano le assenze al denominatore con valore zero: il risultato quindi non ha più lo stesso significato.

Misurare il tasso di intelligenza
SELECT
  COUNT(*) AS nombre_clients,
  COUNT(telephone) AS telephones_renseignes,
  ROUND(100.0 * COUNT(telephone) / NULLIF(COUNT(*), 0), 1) AS taux_renseignement
FROM clients;

Errori comuni da evitare

L'elaborazione di NULL deve essere visibile nella query e giustificata dall'esigenza aziendale, non aggiunta solo per rimuovere caselle vuote.

  • Confronta una colonna in NULL con = o <>.
  • NULL confuso, zero e stringa vuota.
  • Utilizzare COALESCE senza verificare la compatibilità del tipo.
  • Sostituire le assenze con zero prima di AVG senza giustificazione.
  • Dimenticando che una concatenazione o un'operazione può diventare NULL a seconda del motore SQL.

Un metodo affidabile in quattro domande

Prima chiediti perché manca il valore, poi se questa assenza deve essere preservata, filtrata o sostituita. Quindi scegli IS NULL, IS NOT NULL o COALESCE a seconda della risposta.

Infine, controlla il numero di record restituiti e ricalcola manualmente un piccolo campione. L'esercizio dedicato a COALESCE permette di applicare questo metodo su una semplice tabella cliente.

Metti in pratica questa guida.

Apri l’esercizio collegato, esegui la query e confronta il risultato atteso.

Inizia l’esercizio