SUM e AVG con i NULL
Capire perché AVG ignora i NULL e come questo modifica la risposta attesa al colloquio
SUM e AVG con i NULL è una lezione SQL 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 SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.
L'insidia nascosta in AVG
Ecco una domanda classica da colloquio che mette in difficoltà i candidati disattenti: "Ha una colonna salary con alcuni NULL. Che cosa calcola AVG(salary) e corrisponde a ciò che vuole l'azienda?"
La risposta rivela se comprende che le funzioni di aggregazione ignorano i valori NULL, modificando così il denominatore di una media. Se sbaglia questo aspetto in produzione, la media riportata risulta gonfiata senza che sia evidente.
Rendiamo il comportamento inequivocabile.
Dati di esempio
Utilizzi questa tabella employees con una colonna bonus che può contenere NULL per tutta la lezione:
- Alice, bonus 100
- Bob, bonus 200
- Carol, bonus NULL
- Dan, bonus 300
Quattro righe, tre bonus non NULL e uno NULL. Eseguiremo SUM e AVG su questi dati e osserveremo come viene trattato NULL.
SUM ignora i NULL
SUM(bonus) somma solo i valori non NULL: 100 + 200 + 300 = 600. La riga con NULL non contribuisce: viene semplicemente ignorata, non trattata come zero nel senso aritmetico di modificare il conteggio.
L'effetto pratico è lo stesso che si otterrebbe considerando NULL come assente. SUM non genera mai errori sui NULL e non restituisce mai NULL, a meno che tutti gli input non siano NULL.
SELECT SUM(bonus) AS total_bonus
FROM employees;
-- returns 600Anche AVG ignora i NULL
AVG(bonus) è la funzione cruciale. Calcola la somma dei valori non NULL divisa per il numero di valori non NULL: 600 / 3 = 200.
Il denominatore è 3, non 4. La riga con NULL viene esclusa sia dal numeratore sia dal divisore. Ecco perché AVG può sorprendere: la media viene calcolata sui valori presenti, non su tutte le righe.
SELECT AVG(bonus) AS avg_bonus
FROM employees;
-- 600 / 3 = 200, NOT 600 / 4 = 150Perché il denominatore è importante
Supponga che il significato aziendale di un bonus NULL sia "non ha ricevuto alcun bonus" = 0. In questo caso la media corretta dovrebbe essere 600 / 4 = 150, ma AVG(bonus) restituisce 200.
La risposta corretta in un colloquio è: "AVG ignora i NULL, quindi calcola la media sui dipendenti che hanno un bonus. Se NULL significa zero, devo prima convertire i NULL in 0." Esplicitare questa differenza è ciò che permette di ottenere il punto.
Impostare i NULL a zero con COALESCE
Per calcolare la media su tutte le righe trattando NULL come 0, racchiuda la colonna in COALESCE(bonus, 0). Ora ogni riga ha un valore numerico, quindi il denominatore diventa 4.
Il risultato è 600 / 4 = 150. Il punto è che AVG(col) e AVG(COALESCE(col, 0)) rispondono a domande aziendali diverse. Scelga consapevolmente.
SELECT AVG(COALESCE(bonus, 0)) AS avg_over_all
FROM employees;
-- 600 / 4 = 150AVG = SUM / COUNT, con attenzione
Un'identità utile: AVG(col) è uguale a SUM(col) / COUNT(col) — noti che si tratta di COUNT(col), non di COUNT(*), perché sia AVG sia quel COUNT ignorano i NULL.
Se scrive erroneamente SUM(col) / COUNT(*), ottiene la media calcolata su tutte le righe (qui 150), che differisce da AVG (200). A volte gli intervistatori chiedono di ricostruire AVG manualmente per verificare che scelga il COUNT corretto.
SELECT
AVG(bonus) AS builtin_avg, -- 200
SUM(bonus) * 1.0 / COUNT(bonus) AS manual_avg, -- 200
SUM(bonus) * 1.0 / COUNT(*) AS over_all_rows -- 150
FROM employees;L'insidia della divisione intera
Quando si calcolano manualmente le medie, può verificarsi un errore sottile: in molti database, dividere due numeri interi esegue una divisione intera, troncando i decimali. 7 / 2 può produrre 3, non 3.5.
AVG restituisce generalmente un valore decimale, ma se la ricostruisce con SUM / COUNT su colonne intere potrebbe perdere precisione. Moltiplichi per 1.0 oppure esegua prima il cast a un tipo decimale.
SELECT
SUM(bonus) / COUNT(bonus) AS maybe_truncated,
SUM(bonus) * 1.0 / COUNT(bonus) AS precise
FROM employees;Quando tutto è NULL
Un caso limite molto amato dagli intervistatori: che cosa succede se ogni valore è NULL o se il filtro non corrisponde ad alcuna riga?
SUMrestituisce NULL (non 0) quando non ci sono input non NULL.AVGrestituisce anch'esso NULL, poiché la divisione per zero è indefinita.COUNT, al contrario, restituisce 0.
Racchiuda il risultato in COALESCE(SUM(col), 0) se ha bisogno di un valore numerico predefinito.
SELECT COALESCE(SUM(bonus), 0) AS safe_total
FROM employees
WHERE 1 = 0; -- no rows: returns 0, not NULLMedie per gruppo
Le stesse regole sui NULL si applicano anche all'interno di GROUP BY. La media AVG di ogni gruppo viene calcolata dividendo per il numero di valori non NULL di quel gruppo. Un gruppo composto interamente da bonus NULL produce AVG = NULL per quel gruppo.
Quindi, quando vede medie sorprendenti per reparto, sospetti prima i NULL che riducono i singoli denominatori, invece di sospettare subito un bug nella join.
SELECT department, AVG(bonus) AS avg_bonus
FROM employees
GROUP BY department;Come formulare la risposta
Una risposta ben formulata in un colloquio potrebbe essere: "SUM e AVG ignorano entrambi i NULL. AVG divide per il numero di valori non NULL, quindi i NULL riducono di fatto il denominatore. Se NULL deve valere zero, lo converto con COALESCE prima dell'aggregazione; altrimenti la media riflette solo le righe che contengono un valore."
Quella sola frase dimostra correttezza, consapevolezza del contesto aziendale e conoscenza della soluzione.
Controllo rapido
Applichi la regola ai dati di esempio.
Riepilogo
Punti chiave su SUM e AVG con i NULL:
- Entrambe ignorano completamente i NULL.
AVG(col)=SUM(col) / COUNT(col)— il denominatore esclude i NULL.- Utilizzi
COALESCE(col, 0)quando NULL significa zero e deve essere conteggiato. - Gli input composti solo da NULL o privi di righe fanno restituire NULL a SUM e AVG (COUNT restituisce 0).
- Faccia attenzione alla divisione intera quando ricostruisce AVG manualmente.
Il prossimo argomento è MIN, MAX e l'aggregazione di dati non numerici.
Domande Frequenti
La lezione «SUM e AVG con i NULL» è gratuita?
Sì — il testo completo di «SUM e AVG con i 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 Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.
Cosa imparerò in «SUM e AVG con i NULL»?
Capire perché AVG ignora i NULL e come questo modifica la risposta attesa al colloquio Eserciti SQL 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 SQL Interview Prep?
Non è richiesta alcuna esperienza precedente. SQL 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 «SUM e AVG con i 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 Interview Prep?
Sì. Ogni lezione SQL 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
- COUNT(*) contro COUNT(column) e COUNT(DISTINCT)
- SUM e AVG con i NULL
- MIN, MAX e aggregazione non numerica
- Aggregati senza GROUP BY