In questa lezione conosceremo ancora meglio il misterioso amico NULL. Ovviamente, i tuoi errori personali con lui sono ancora davanti a te, ma... essere avvisato è essere preparato. Vediamo insieme alcuni errori tipici legati a NULL.
Errore 1: Usare l'operatore normale = per controllare NULL
Probabilmente l'errore più popolare tra chi inizia con SQL è provare a usare l'operatore = per controllare se un valore è NULL.
Cosa succede?
SELECT *
FROM studenti
WHERE eta = NULL;
Se pensavi ingenuamente che questo ti avrebbe mostrato tutti gli studenti con età indefinita, rimarrai deluso: questa query non restituirà nulla. Perché? Il punto è che NULL non è un valore, quindi gli operatori di confronto normali non funzionano con lui. Come dice il libro magico di SQL: "NULL non si può confrontare direttamente con niente".
Come si fa davvero?
Per controllare se un valore è NULL, usa IS NULL:
SELECT *
FROM studenti
WHERE eta IS NULL;
Ora otterrai tutti gli studenti la cui età non è specificata.
Errore 2: Le funzioni aggregate ignorano NULL (tranne COUNT(*))
Quando fai query con funzioni aggregate, NULL viene automaticamente escluso dai calcoli. Questo può portare a risultati inaspettati.
Cosa succede?
SELECT AVG(stipendio) AS stipendio_medio
FROM impiegati;
Se nella colonna stipendio c'è NULL, quelle righe vengono semplicemente ignorate e la media viene calcolata senza di loro. Questo può dare un'impressione sbagliata dello stipendio medio.
Come evitarlo?
Prima di fare aggregazioni, assicurati di sostituire NULL con un valore di default. Ad esempio, usa COALESCE():
SELECT AVG(COALESCE(stipendio, 0)) AS stipendio_medio
FROM impiegati;
Ora i valori NULL verranno sostituiti con 0 prima del calcolo.
Errore 3: Confrontare NULL tra loro
Nel database NULL non è uguale letteralmente a niente, nemmeno a un altro NULL. Può essere una sorpresa.
Cosa succede?
SELECT *
FROM studenti
WHERE NULL = NULL;
Anche questa query restituirà un risultato vuoto. Perché? Perché SQL pensa che l'assenza di un valore non può essere "uguale" all'assenza di un altro. Sì, SQL è un linguaggio filosofico.
Come si fa davvero?
Se vuoi controllare se due NULL sono "uguali", usa costrutti speciali come IS NULL. Ad esempio:
SELECT *
FROM studenti
WHERE nome IS NULL AND cognome IS NULL;
Errore 4: Divisione per NULL
Dividere per NULL non è solo un errore, è quasi un crimine matematico che SQL punisce con un risultato senza senso: NULL.
Cosa succede?
SELECT 10 / NULL AS risultato;
Risultato? NULL. SQL si rifiuta anche solo di provare a capire cosa vuoi da lui.
Come evitarlo?
Per proteggere le tue query da queste situazioni, usa COALESCE() o NULLIF():
SELECT 10 / COALESCE(divisore, 1) AS risultato
FROM calcoli;
In questa query, se divisore è NULL, invece di dividere per NULL dividerai per 1.
Errore 5: Operatori logici che non funzionano con NULL
NULL rompe la logica appena appare nelle espressioni. Ad esempio, la condizione TRUE AND NULL restituirà NULL, non TRUE o FALSE.
Cosa succede?
SELECT *
FROM studenti
WHERE eta > 18 OR eta = NULL;
In questo caso, anche se eta > 18 è vero per alcune righe, alcune con NULL nella colonna eta potrebbero essere escluse dal risultato. Perché? Perché la parte eta = NULL restituirà NULL, non TRUE.
Come si fa davvero?
Gestisci sempre esplicitamente i valori NULL nelle condizioni logiche:
SELECT *
FROM studenti
WHERE eta > 18 OR eta IS NULL;
Errore 6: Comportamento implicito nell'ordinamento di NULL (l'errore più "pesante")
Se usi ORDER BY in una query, il comportamento di NULL può sorprenderti. Di default, PostgreSQL mette le righe con NULL alla fine quando ordini in modo crescente e all'inizio quando ordini in modo decrescente.
Cosa succede?
SELECT nome_prodotto, prezzo
FROM prodotti
ORDER BY prezzo;
Se prezzo ha NULL, quelle righe appariranno alla fine della lista.
Come evitare sorprese?
Puoi specificare esplicitamente l'ordinamento per NULL usando NULLS FIRST o NULLS LAST:
SELECT nome_prodotto, prezzo
FROM prodotti
ORDER BY prezzo NULLS FIRST;
Errore 7: Gestione sbagliata delle chiavi esterne e NULL
I valori NULL nelle colonne con chiavi esterne a volte possono portare a comportamenti inaspettati.
Cosa succede?
Se hai aggiunto chiavi esterne a una tabella e provi a inserire una riga lasciando vuoto il campo della chiave esterna, PostgreSQL non farà una piega. Questo perché i valori NULL non vengono controllati rispetto alle tabelle collegate.
Come lavorare bene?
Usa il vincolo NOT NULL se vuoi escludere la possibilità di usare NULL in questi campi. Oppure semplicemente ricorda che i valori NULL restano "orfani", non appartenenti a nessuna delle tabelle collegate.
Scoprirai di più sulle tabelle collegate e sulle chiavi esterne nella prossima lezione :P
GO TO FULL VERSION