0Pricing
SQL Academy · Lezione

IS NULL e IS NOT NULL

Verifichi correttamente la presenza di valori mancanti

IS NULL e IS NOT NULL è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.

Verificare i valori mancanti

Poiché i confronti con NULL restituiscono sempre unknown, SQL mette a disposizione due operatori dedicati per verificare i valori mancanti: IS NULL e IS NOT NULL.

Questi sono gli unici operatori affidabili per trovare o escludere i NULL. In questa lezione imparerà a utilizzarli correttamente.

-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;

-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;

Perché = NULL non funziona

È allettante scrivere WHERE phone = NULL, ma questa condizione non restituisce mai corrispondenze. Per ogni riga viene valutata come unknown e WHERE conserva solo le righe true.

Il risultato è un insieme vuoto — un errore silenzioso, poiché non viene generato alcun errore.

-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;

-- The fix
SELECT * FROM customers WHERE phone IS NULL;

IS NULL in azione

IS NULL restituisce true esattamente quando il valore è mancante e false negli altri casi. Non restituisce mai unknown.

Per questo è sicuro usarlo ovunque sia necessario ottenere un risultato booleano netto, true o false.

SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;

-- id | name  | missing_phone
-- ---+-------+--------------
--  1 | Alice | f
--  2 | Bob   | t
--  3 | Carol | t

IS NOT NULL in azione

IS NOT NULL è l'esatto opposto: true quando il valore è presente, false quando è mancante.

Lo si utilizzi per filtrare le righe che contengono effettivamente dati, ad esempio i clienti che è possibile chiamare.

SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;

-- name  | phone
-- ------+----------
-- Alice | 555-0101

Combinare con AND / OR

È possibile combinare i test sui NULL con altre condizioni usando AND e OR.

Ad esempio, si possono trovare i clienti attivi che devono ancora fornire un numero di telefono — una query comune per verificare la qualità dei dati.

SELECT id, name
FROM customers
WHERE is_active = true
  AND phone IS NULL;

-- Active customers missing a phone number

NULL in NOT IN: una trappola

NOT IN si comporta in modo problematico quando l'elenco contiene un NULL. Se un valore dell'insieme è NULL, NOT IN può restituire unknown per ogni riga, eliminando risultati che ci si aspettava di ottenere.

Si preferisca NOT EXISTS oppure si filtrino prima i NULL dalla sottoquery.

-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);

-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);

IS DISTINCT FROM

PostgreSQL offre IS DISTINCT FROM e IS NOT DISTINCT FROM — operatori di confronto sicuri rispetto ai NULL.

A differenza di =, trattano due NULL come uguali e un NULL rispetto a un valore come diverso, restituendo sempre true o false, mai unknown.

SELECT
  NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
  NULL IS DISTINCT FROM 5        AS b, -- true: NULL differs from 5
  5 IS DISTINCT FROM 5          AS c; -- false: same value

Confrontare due colonne che possono contenere NULL

Quando si confrontano due colonne che possono entrambe contenere NULL, il semplice = non rileva il caso in cui entrambe siano NULL. IS NOT DISTINCT FROM lo gestisce in modo chiaro.

È particolarmente utile per trovare le righe che non sono cambiate, anche quando il valore è sconosciuto.

-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;

Contare i NULL

Un uso pratico di IS NULL consiste nel verificare la qualità dei dati — contando quante righe non contengono un valore.

Lo si combini con FILTER (PostgreSQL) oppure con un CASE all'interno di COUNT per contare affiancati i NULL e i valori non NULL.

SELECT
  count(*) AS total,
  count(*) FILTER (WHERE phone IS NULL)     AS missing,
  count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;

Controlli sui NULL nei vincoli CHECK

È possibile usare i test sui NULL all'interno dei vincoli CHECK per applicare regole come "se una riga è stata spedita, deve avere una data di spedizione".

Nota: un vincolo CHECK viene superato quando la sua condizione è true o unknown, quindi si valutino attentamente i casi che coinvolgono NULL.

CREATE TABLE orders (
  id        integer PRIMARY KEY,
  status    text NOT NULL,
  ship_date date,
  CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);

Buone pratiche

Adotti queste abitudini per gestire i NULL in modo sicuro:

  • Si verifichi sempre con IS NULL / IS NOT NULL, mai con = NULL.
  • Si presti attenzione a NOT IN con sottoquery che possono restituire NULL.
  • Si utilizzi IS DISTINCT FROM per confronti di uguaglianza sicuri rispetto ai NULL.
  • Si verifichino i dati mancanti con count(*) FILTER (...).
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM b

Verifica rapida

Desidera tutti i clienti per i quali la colonna phone non contiene alcun valore. Quale clausola WHERE è corretta?

Riepilogo

Ha imparato il modo corretto per verificare i valori mancanti con IS NULL e IS NOT NULL, e perché = NULL non funziona mai.

Ha anche incontrato la trappola di NOT IN, l'operatore a prova di NULL IS DISTINCT FROM e come controllare i NULL con FILTER. Ora imparerà a sostituire i NULL con valori predefiniti sensati usando COALESCE e NULLIF.

SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

Domande Frequenti

La lezione «IS NULL e IS NOT NULL» è gratuita?

Sì — il testo completo di «IS NULL e IS NOT NULL» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.

Cosa imparerò in «IS NULL e IS NOT NULL»?

Verifichi correttamente la presenza di valori mancanti Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Academy?

Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «IS NULL e IS NOT NULL»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Academy?

Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il vero significato di NULL
  2. IS NULL e IS NOT NULL
  3. COALESCE e NULLIF
  4. NULL negli aggregati e nei join
← Torna a SQL Academy