SUM et AVG avec des NULL
Pourquoi AVG ignore les NULL et comment cela modifie la réponse attendue par les recruteurs
SUM et AVG avec des NULL est une leçon SQL Interview Prep gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Interview Prep comprend 4 leçons au total.
Le piège caché dans AVG
Voici une question classique d’entretien qui déstabilise les candidats inattentifs : « Vous avez une colonne de salaire contenant des NULL. Que calcule AVG(salaire), et est-ce bien ce que souhaite l’entreprise ? »
La réponse honnête révèle si vous comprenez que les agrégats ignorent les NULL, ce qui modifie le dénominateur d’une moyenne. Si vous vous trompez en production, votre moyenne affichée sera silencieusement surestimée.
Rendons ce comportement parfaitement clair.
Données d’exemple
Utilisez cette table employees contenant une colonne bonus pouvant contenir NULL pendant toute la leçon :
- Alice, prime 100
- Bob, prime 200
- Carol, prime NULL
- Dan, prime 300
Quatre lignes, trois primes différentes de NULL et une valeur NULL. Nous allons exécuter SUM et AVG sur ces données et observer le traitement de NULL.
SUM ignore les NULL
SUM(bonus) additionne uniquement les valeurs différentes de NULL : 100 + 200 + 300 = 600. La ligne contenant NULL ne contribue pas au total : elle est simplement ignorée, et n’est pas traitée comme zéro au sens arithmétique qui modifierait le décompte.
En pratique, cela revient à considérer NULL comme une valeur absente. SUM ne génère jamais d’erreur à cause des NULL et ne renvoie NULL que si toutes les valeurs d’entrée sont NULL.
SELECT SUM(bonus) AS total_bonus
FROM employees;
-- returns 600AVG ignore aussi les NULL
AVG(bonus) est la fonction essentielle à comprendre. Elle calcule la somme des valeurs différentes de NULL divisée par le nombre de valeurs différentes de NULL : 600 / 3 = 200.
Le dénominateur est 3, et non 4. La ligne contenant NULL est exclue à la fois du numérateur et du diviseur. C’est précisément la raison pour laquelle AVG peut surprendre : la moyenne porte sur les valeurs présentes, et non sur toutes les lignes.
SELECT AVG(bonus) AS avg_bonus
FROM employees;
-- 600 / 3 = 200, NOT 600 / 4 = 150Pourquoi le dénominateur est important
Supposons que NULL signifie pour l’entreprise « n’a reçu aucune prime » = 0. La véritable moyenne devrait alors être 600 / 4 = 150, mais AVG(bonus) renvoie 200.
La bonne réponse en entretien est : « AVG ignore les NULL, donc la moyenne porte sur les employés qui ont une prime. Si NULL signifie zéro, je dois d’abord convertir les NULL en 0. » C’est en explicitant cette différence que vous gagnez le point.
Forcer les NULL à zéro avec COALESCE
Pour calculer la moyenne sur toutes les lignes en considérant NULL comme 0, entourez la colonne de COALESCE(bonus, 0). Chaque ligne possède alors une valeur numérique et le dénominateur devient 4.
On obtient 600 / 4 = 150. À retenir : AVG(col) et AVG(COALESCE(col, 0)) répondent à des questions métier différentes. Choisissez donc en connaissance de cause.
SELECT AVG(COALESCE(bonus, 0)) AS avg_over_all
FROM employees;
-- 600 / 4 = 150AVG = SUM / COUNT, avec précaution
Une identité utile : AVG(col) est égal à SUM(col) / COUNT(col) — remarquez qu’il s’agit de COUNT(col), et non de COUNT(*), car AVG et cette forme de COUNT ignorent toutes deux les NULL.
Si vous écrivez par erreur SUM(col) / COUNT(*), vous obtenez la moyenne sur l’ensemble des lignes (150 ici), qui diffère de celle d’AVG (200). Les recruteurs vous demandent parfois de reconstituer AVG manuellement pour vérifier que vous choisissez le bon COUNT.
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;Piège de la division entière
Un problème subtil peut survenir lorsque vous calculez des moyennes manuellement : dans de nombreuses bases de données, la division de deux entiers effectue une division entière et tronque les décimales. 7 / 2 peut produire 3, et non 3,5.
AVG renvoie généralement un nombre décimal, mais si vous le reconstituez avec SUM / COUNT sur des colonnes entières, vous risquez de perdre en précision. Multipliez d’abord par 1.0 ou convertissez la valeur en type décimal.
SELECT
SUM(bonus) / COUNT(bonus) AS maybe_truncated,
SUM(bonus) * 1.0 / COUNT(bonus) AS precise
FROM employees;Lorsque tout est NULL
Voici un cas limite que les recruteurs apprécient : que se passe-t-il si toutes les valeurs sont NULL ou si le filtre ne correspond à aucune ligne ?
SUMrenvoie NULL (et non 0) lorsqu’il n’y a aucune entrée différente de NULL.AVGrenvoie également NULL, car une division par un décompte nul n’est pas définie.COUNT, en revanche, renvoie 0.
Entourez le résultat de COALESCE(SUM(col), 0) si vous avez besoin d’une valeur numérique par défaut.
SELECT COALESCE(SUM(bonus), 0) AS safe_total
FROM employees
WHERE 1 = 0; -- no rows: returns 0, not NULLMoyennes par groupe
Les mêmes règles concernant les NULL s’appliquent à l’intérieur de GROUP BY. La moyenne AVG de chaque groupe est divisée par le nombre de valeurs différentes de NULL de ce groupe. Un groupe composé uniquement de primes NULL produit AVG = NULL pour ce groupe.
Ainsi, lorsque les moyennes par département vous paraissent surprenantes, soupçonnez d’abord des NULL qui réduisent les dénominateurs individuels, avant de soupçonner un problème de jointure.
SELECT department, AVG(bonus) AS avg_bonus
FROM employees
GROUP BY department;Comment formuler la réponse
Une réponse d’entretien bien formulée pourrait être : « SUM et AVG ignorent tous deux les NULL. AVG divise par le nombre de valeurs différentes de NULL, de sorte que les NULL réduisent effectivement le dénominateur. Si NULL doit compter comme zéro, je le convertis avec COALESCE avant l’agrégation ; sinon, la moyenne reflète uniquement les lignes qui possèdent une valeur. »
Cette seule phrase démontre votre exactitude, votre compréhension des enjeux métier et votre connaissance de la correction à appliquer.
Vérification rapide
Appliquez la règle aux données d’exemple.
Récapitulatif
Points essentiels concernant SUM et AVG avec des NULL :
- Tous deux ignorent entièrement les NULL.
AVG(col)=SUM(col) / COUNT(col)— le dénominateur exclut les NULL.- Utilisez
COALESCE(col, 0)lorsque NULL signifie zéro et doit être pris en compte. - Des entrées composées uniquement de NULL ou aucune ligne font renvoyer NULL à SUM et AVG (COUNT renvoie 0).
- Méfiez-vous de la division entière lorsque vous reconstituez AVG manuellement.
Ensuite : MIN, MAX et l’agrégation de données non numériques.
Questions Fréquemment Posées
La leçon « SUM et AVG avec des NULL » est-elle gratuite ?
Oui — le texte complet de « SUM et AVG avec des NULL » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Interview Prep, passe à CoddyKit PRO. Le cours SQL Interview Prep comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « SUM et AVG avec des NULL » ?
Pourquoi AVG ignore les NULL et comment cela modifie la réponse attendue par les recruteurs Tu pratiques SQL Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer SQL Interview Prep ?
Aucune expérience préalable n'est requise. SQL Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « SUM et AVG avec des NULL » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon SQL Interview Prep ?
Oui. Chaque leçon SQL Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- COUNT(*) ou COUNT(colonne) ou COUNT(DISTINCT)
- SUM et AVG avec des NULL
- MIN, MAX et agrégation non numérique
- Agrégats sans GROUP BY