0Pricing
Coding Interview Prep · Lezione

IS NULL, IS NOT NULL ed eguaglianza NULL-safe

Verificare correttamente i NULL e gli operatori NULL-safe specifici di ciascun dialetto

IS NULL, IS NOT NULL ed eguaglianza NULL-safe è una lezione Coding Interview Prep 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 Coding Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Coding Interview Prep include 4 lezioni in totale.

Verificare NULL nel modo corretto

La lezione precedente ha dimostrato che non è possibile usare = per trovare i NULL. Come si verificano allora? Con i predicati dedicati IS NULL e IS NOT NULL.

Questi sono gli unici modi corretti e portabili per verificare i valori mancanti, e gli intervistatori respingeranno sempre col = NULL quando lo vedranno.

Questa lezione tratta IS NULL, IS NOT NULL, la famiglia IS DISTINCT FROM e gli operatori di uguaglianza NULL-safe specifici dei singoli dialetti. Conoscere le differenze tra database è un forte segnale di esperienza.

IS NULL e IS NOT NULL

IS NULL restituisce TRUE quando il valore è NULL e FALSE in tutti gli altri casi. Soprattutto, non restituisce mai UNKNOWN, quindi può essere usato direttamente in WHERE.

IS NOT NULL è il suo complemento esatto: TRUE per qualsiasi valore effettivo, FALSE per NULL.

Questi predicati sono fondamentali nella gestione di NULL. Sono SQL standard e si comportano allo stesso modo in MySQL, Postgres, SQL Server, Oracle e SQLite.

-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;

-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;

Perché col = NULL è sempre errato

È una trappola garantita nei colloqui: un candidato scrive WHERE bonus = NULL aspettandosi di trovare i bonus mancanti. La query restituisce zero righe.

Ricordi la logica a tre valori: bonus = NULL è UNKNOWN per ogni riga, comprese quelle in cui bonus è NULL, perché nulla è uguale a uno sconosciuto. WHERE mantiene solo TRUE, quindi non corrisponde nulla.

Alcuni database, in modalità non standard, riscrivono silenziosamente = NULL come IS NULL, ma non deve mai fare affidamento su questo comportamento. Scriva sempre IS NULL in modo esplicito.

-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;

-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;

Conteggiare i valori NULL e non NULL

Un'attività comune per gli analisti è il controllo della qualità dei dati: quanto è completa una colonna? Combini IS NULL con COUNT per riportare i valori mancanti.

Noti la differenza: COUNT(*) conta ogni riga, mentre COUNT(bonus) conta solo i bonus non NULL. La differenza tra i due conteggi equivale al numero di NULL, un concetto che riprenderemo nella lezione sugli aggregati.

SELECT
  COUNT(*)                                AS total_rows,
  COUNT(bonus)                            AS with_bonus,
  COUNT(*) - COUNT(bonus)                 AS missing_bonus,
  SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;

Il problema risolto dall'uguaglianza NULL-safe

Supponga di voler confrontare due colonne e considerare corrispondenti anche i valori entrambi NULL. Il semplice a = b non funziona: quando entrambi sono NULL, il risultato è UNKNOWN, quindi la coppia viene esclusa anche se intuitivamente i valori sono «uguali».

Questo caso si presenta quando si confronta una riga precedente con una nuova per rilevare le modifiche, oppure quando si esegue un join su colonne opzionali. Serve un confronto in cui NULL uguale a NULL restituisca TRUE e NULL rispetto a un valore restituisca FALSE. È questo che offre l'uguaglianza NULL-safe.

-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
--   NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note;  -- misses rows where both notes are NULL

IS DISTINCT FROM (SQL standard)

Il confronto NULL-safe dello standard ANSI è IS DISTINCT FROM, insieme al suo inverso IS NOT DISTINCT FROM. Sono supportati in Postgres, SQL Server (2022+) e altri database.

  • a IS NOT DISTINCT FROM b significa «uguale, considerando uguali anche NULL = NULL».
  • a IS DISTINCT FROM b significa «diverso, trattando NULL come un valore normale».

Restituiscono sempre TRUE o FALSE, mai UNKNOWN, quindi sono sicuri ovunque sia previsto un predicato.

-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;

-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;

L'operatore <=> di MySQL

MySQL offre un operatore compatto di uguaglianza NULL-safe scritto come <=> (l'operatore spaceship).

a <=> b restituisce 1 (TRUE) quando i due lati sono uguali o entrambi NULL, e 0 (FALSE) negli altri casi. È l'equivalente MySQL di IS NOT DISTINCT FROM.

Se l'intervistatore chiede come eseguire un confronto NULL-safe specificamente in MySQL, questa è la risposta idiomatica.

-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null,   -- 1
       (NULL <=> 5)    AS null_vs_val, -- 0
       (5 <=> 5)       AS val_eq;      -- 1

SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;

Schema rapido tra i dialetti

Gli intervistatori apprezzano i candidati che conoscono i limiti della portabilità. Ecco la panoramica degli operatori per l'uguaglianza NULL-safe:

  • ANSI / Postgres / SQL Server 2022+: IS NOT DISTINCT FROM
  • MySQL / MariaDB: <=>
  • SQLite: IS e IS NOT funzionano come operatori di uguaglianza NULL-safe
  • Oracle: non dispone di un operatore nativo; è possibile simularlo con DECODE(a, b, 1, 0) = 1 o con tecniche basate su COALESCE

Se non si conosce il motore, si può ricorrere alla forma manuale portabile mostrata di seguito.

-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b;      -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b;  -- complement

Confronto manuale portabile NULL-safe

Quando non è disponibile un operatore nativo, è possibile costruire un'uguaglianza NULL-safe a partire da elementi fondamentali. Il modello portabile combina una normale uguaglianza con una clausola esplicita per il caso in cui entrambi i valori siano NULL.

Lo si può leggere così: «sono uguali OPPURE sono entrambi assenti». Funziona con qualsiasi database, perciò è un'ottima risposta quando l'intervistatore non specifica il dialetto.

SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
   OR (o.note IS NULL AND n.note IS NULL);

-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')

Esempio più approfondito: chiavi di JOIN NULL-safe

Un caso realistico in cui si può cadere in errore è il join su una chiave nullable. Se region può essere NULL su entrambi i lati, un normale equi-join elimina silenziosamente quelle coppie, perché NULL = NULL restituisce UNKNOWN.

Se la regola di business stabilisce che «le righe senza regione devono comunque corrispondere ad altre righe senza regione», è necessario rendere la condizione di join NULL-safe. Durante il colloquio, espliciti l'ipotesi e scelga poi l'operatore adatto al motore utilizzato.

-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
  ON a.region IS NOT DISTINCT FROM b.region;

-- MySQL equivalent: ON a.region <=> b.region

Punti chiave per il colloquio

Per gestire correttamente qualsiasi domanda sui test dei NULL:

  • Utilizzi sempre IS NULL / IS NOT NULL; non usi mai = NULL.
  • Questi predicati restituiscono solo TRUE o FALSE, quindi sono sicuri in WHERE.
  • Per confrontare «NULL uguale a NULL», utilizzi IS NOT DISTINCT FROM (ANSI) oppure <=> (MySQL).
  • Dichiari il dialetto di riferimento; se non è specificato, proponga la soluzione alternativa portabile basata sulla clausola OR.

Citare sia l'operatore standard sia quello del fornitore dimostra una preparazione ampia, che i selezionatori sanno riconoscere.

Verifica rapida

Scelga il confronto NULL-safe corretto.

Riepilogo

Ora sa verificare correttamente la presenza di NULL:

  • IS NULL / IS NOT NULL sono gli unici test NULL corretti e portabili; non restituiscono mai UNKNOWN.
  • col = NULL restituisce sempre zero righe; è un classico trabocchetto nei colloqui.
  • L'uguaglianza NULL-safe considera uguali due NULL: IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
  • Quando non esiste un operatore dedicato, utilizzi (a = b) OR (a IS NULL AND b IS NULL).

Prossimo argomento: sostituire i valori NULL con COALESCE, NULLIF e funzioni specifiche del fornitore come ISNULL.

Domande Frequenti

La lezione «IS NULL, IS NOT NULL ed eguaglianza NULL-safe» è gratuita?

Sì — il testo completo di «IS NULL, IS NOT NULL ed eguaglianza NULL-safe» è 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 Coding Interview Prep, passa a CoddyKit PRO. Il corso Coding Interview Prep include 4 lezioni in totale.

Cosa imparerò in «IS NULL, IS NOT NULL ed eguaglianza NULL-safe»?

Verificare correttamente i NULL e gli operatori NULL-safe specifici di ciascun dialetto Eserciti Coding Interview Prep 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 Coding Interview Prep?

Non è richiesta alcuna esperienza precedente. Coding Interview Prep 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, IS NOT NULL ed eguaglianza NULL-safe»?

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 Coding Interview Prep?

Sì. Ogni lezione Coding Interview Prep 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. Logica a tre valori e UNKNOWN
  2. IS NULL, IS NOT NULL ed eguaglianza NULL-safe
  3. COALESCE, NULLIF e ISNULL
  4. NULL in aggregati, join e DISTINCT
← Torna a Coding Interview Prep