0Pricing
SQL Academy · Lezione

Il vero significato di NULL

Sconosciuto, non zero e non vuoto

Il vero significato di NULL è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Alla scoperta di NULL

NULL è il modo con cui SQL indica "non lo so". Non è zero, non è una stringa vuota e non è false — rappresenta l'assenza di un valore.

Quando una colonna non ha un valore noto, il database vi memorizza NULL. Capire il comportamento di NULL è uno dei passaggi più importanti per scrivere query corrette.

-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;

-- id | name    | phone
-- ---+---------+------------
--  1 | Alice   | 555-0101
--  2 | Bob     | NULL        <- phone unknown
--  3 | Carol   | NULL

NULL non è zero

Un errore comune consiste nel trattare NULL come il numero 0. Sono due concetti completamente diversi.

  • 0 è un valore noto: zero.
  • NULL indica che il valore è mancante o sconosciuto.

Se il saldo di un conto è 0, il cliente non ha denaro. Se è NULL, semplicemente il saldo non è ancora noto.

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULL non è una stringa vuota

Per le colonne di testo, anche NULL e la stringa vuota '' sono diversi.

  • '' è una stringa di lunghezza zero — un valore noto e presente.
  • NULL indica che non è stata fornita alcuna stringa.

È possibile memorizzare intenzionalmente una nota vuota oppure lasciare del tutto assente la nota. SQL distingue i due casi.

SELECT id, note, length(note) AS note_len
FROM tickets;

-- id | note | note_len
-- ---+------+----------
--  1 | ''   |        0   <- empty but present
--  2 | NULL |     NULL   <- absent; length is also unknown

Logica a tre valori

La logica normale ha due risultati: true e false. SQL ne aggiunge un terzo: sconosciuto.

Qualsiasi confronto che coinvolge NULL restituisce unknown, perché non è possibile confrontare un valore che non si possiede. Questa è la cosiddetta logica a tre valori.

-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
  NULL = 5      AS eq,      -- unknown
  NULL <> 5     AS neq,     -- unknown
  NULL = NULL   AS self_eq, -- unknown (!)
  NULL > 0      AS gt;      -- unknown

NULL = NULL non è TRUE

La regola più sorprendente è che NULL = NULL non è true. La valutazione produce unknown.

Perché? Se entrambi i valori sono sconosciuti, non si può affermare che siano uguali: potrebbero essere qualsiasi cosa. Per verificare se qualcosa è NULL, è necessario usare IS NULL invece di =.

-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;

-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;

WHERE conserva solo le righe TRUE

Una clausola WHERE conserva una riga solo quando la sua condizione è true. Le righe per cui la condizione è false o unknown vengono scartate.

Per questo, filtrare una colonna NULL con = rimuove silenziosamente righe che ci si potrebbe aspettare di vedere.

-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';

-- Returns only Alice

NULL si propaga nelle operazioni aritmetiche

NULL è contagioso nelle espressioni. Quasi ogni operazione aritmetica o sulle stringhe che coinvolge NULL produce NULL.

Se uno degli input è sconosciuto, anche il risultato non può essere noto.

SELECT
  10 + NULL    AS sum,    -- NULL
  100 * NULL   AS prod,   -- NULL
  NULL / 2     AS div,    -- NULL
  'Hi ' || NULL AS greet; -- NULL (string concat)

Da dove provengono i NULL

I NULL compaiono in diverse situazioni comuni:

  • Un INSERT che omette una colonna che può contenere NULL.
  • Un outer join senza una riga corrispondente da un lato.
  • Un'aggregazione su zero righe, ad esempio SUM di un insieme vuoto restituisce NULL.

Conoscere la loro origine aiuta a decidere come gestirli.

-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');

SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL

Prevenire i NULL: NOT NULL

Se una colonna deve avere sempre un valore, la si dichiari NOT NULL. Il database rifiuterà quindi qualsiasi riga che tenti di lasciarla vuota.

È un modo efficace per mantenere puliti i dati ed evitare sorprese dovute ai NULL in seguito.

CREATE TABLE users (
  id    integer PRIMARY KEY,
  email text NOT NULL,   -- must always be provided
  bio   text             -- nullable: optional
);

-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');

NULL e DISTINCT / GROUP BY

Esiste un caso in cui SQL tratta i NULL come uguali: il raggruppamento e l'eliminazione dei duplicati.

In DISTINCT e GROUP BY, tutti i valori NULL vengono raccolti in un unico gruppo, anche se NULL = NULL produce sconosciuto negli altri contesti. Questo caso particolare mantiene utile il raggruppamento.

SELECT phone, count(*)
FROM customers
GROUP BY phone;

-- phone    | count
-- ---------+------
-- 555-0101 |     1
-- NULL     |     2   <- all NULLs grouped together

Riepilogo del modello mentale

Tenga a mente queste regole ogni volta che incontra un NULL:

  • NULL significa sconosciuto, non zero o vuoto.
  • I confronti con NULL producono sconosciuto — si usino IS NULL / IS NOT NULL.
  • WHERE conserva solo le righe true.
  • Le operazioni aritmetiche con NULL producono NULL.
  • Il raggruppamento tratta i NULL come un unico gruppo.
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

Verifica rapida

Quale risultato produce l'espressione NULL = NULL nello standard SQL?

Riepilogo

Ora comprende che cosa sia davvero NULL: un indicatore di un valore mancante o sconosciuto, distinto da 0 e ''.

Ha visto la logica a tre valori di SQL, perché = NULL non funziona mai, come NULL si propaga nelle operazioni aritmetiche e come WHERE scarta le righe il cui risultato è sconosciuto. Successivamente, imparerà il modo corretto di verificare la presenza di NULL con IS NULL e IS NOT NULL.

-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL;     -- correct
-- SELECT * FROM customers WHERE phone = NULL;   -- always empty!

Domande Frequenti

La lezione «Il vero significato di NULL» è gratuita?

Sì — il testo completo di «Il vero significato di 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 «Il vero significato di NULL»?

Sconosciuto, non zero e non vuoto 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 1 di 4.

Quanto tempo richiede la lezione «Il vero significato di 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