Retour à la liste des articles Articles
6 minutes de lecture

Les valeurs NULL et la clause GROUP BY

Nous avons déjà vu comment utiliser la clause GROUP BY et certaines fonctions d'agrégation comme SUM(), AVG(), MAX(), MIN(), COUNT(). Dans cet article, nous allons expliquer comment la clause GROUP BY fonctionne lorsque des valeurs NULL sont impliquées. Nous expliquerons également comment utiliser les valeurs NULLavec la clause ORDER BY.

La meilleure façon de maîtriser GROUP BY et NULL en SQL est de s'exercer. Je recommande le La pratique du SQL à l'adresse LearnSQL.fr. Il contient plus de 600 exercices pratiques pour vous aider à prendre confiance en vos compétences.

En SQL, NULL est un marqueur spécial utilisé pour indiquer qu'une valeur de données n'existe pas dans la base de données. Pour plus de détails, consultez l 'explication de NULL en SQL sur Wikipedia.

Nous allons utiliser le tableau suivant employee suivante pour illustrer comment la clause GROUP BY fonctionne avec les valeurs NULL.

EMPLOYEE TABLE
EmplidNameDepartmentSalary
100John Smith IT 2000
101Jean Pellu NULL 2500
102Mary Popins FINANCES2000
103Blas MerrieuNULL NULL
104Joan Piquet IT 1000
105Jose Gomez IT NULL

La clause GROUP BY et les valeurs NULL

Commençons par exécuter une requête SQL simple avec la clause GROUP BY et les valeurs NULL :

SELECT department 
FROM employee 
GROUP BY department;
RESULTATS
department
1.	
2.	IT
3.	FINANCES

Remarque : j'ai ajouté une liste numérotée pour plus de clarté ; habituellement, les résultats sont affichés sous forme de liste non numérotée.

Nous pouvons voir que la première valeur de résultat est un NULL représenté par une chaîne vide (la ligne vide avant le département informatique). Cet espace vide représente toutes les valeurs NULL renvoyées par la clause GROUP BY. Nous pouvons donc en conclure que GROUP BY traite les NULL comme des valeurs valides.

Dans la prochaine requête, nous allons compter le nombre d'employés dans chaque département, y compris le département "NULL" :

SELECT department, count(*) 
FROM employee 
GROUP BY department;
RESULTATS
department		count(*)
1. 			2
2. IT        		3
3. FINANCES 		1

Note : J'ai ajouté une liste numérotée ici pour plus de clarté ; habituellement, les résultats seraient affichés sous forme de liste non numérotée.

En analysant les résultats précédents d'un "GROUP BY perspective", nous pouvons conclure que toutes les valeurs NULL sont regroupées dans une seule valeur ou un seul seau. Cela donne l'impression que NULL est un département avec deux employés. Cependant, traiter les valeurs NULL de cette façon - en regroupant plusieurs valeurs NULL dans un seul seau - n'est pas conforme au concept selon lequel une valeur NULL n'est égale à aucune autre valeur, même à une autre valeur NULL.

Pour expliquer pourquoi les NULL sont regroupés dans un seul bac, nous devons revoir la norme SQL. SQL définit "deux valeurs égales l'une à l'autre, ou deux NULL", comme "non distinctes". Cette définition de "non distinct" permet à SQL de regrouper et de trier les NULL lorsque la clause GROUP BY (ou d'autres mots-clés qui effectuent un regroupement) est utilisée.

Il y a un autre point de confusion dans le résultat précédent : la façon dont le NULL est représenté (par une ligne blanche) n'est pas claire. Une façon intéressante de résoudre ce problème est d'utiliser la fonction COALESCE, qui convertit les NULL en une valeur spécifique mais laisse les autres valeurs inchangées. Voyons la requête suivante :

SELECT coalesce(department,'Unassigned department'), count(*) 
FROM employee 
GROUP BY 1;
RESULTATS
department			count(*)
IT				3
Unassigned department	        2
FINANCES			1

Fonctions agrégées et valeurs nulles

Jusqu'à présent, nous avons travaillé avec les valeurs NULL dans la colonne département, et nous avons seulement utilisé la clause GROUP BY. Essayons d'exécuter quelques requêtes en utilisant des valeurs NULL comme paramètres dans des fonctions d'agrégation. Tout d'abord, nous allons utiliser la fonction COUNT() :

SELECT COUNT(salary) as "Salaries"
FROM employee
RESULTATS
Salaries
     4

Sans la clause DISTINCT, COUNT(salary) renvoie le nombre d'enregistrements qui ont des valeurs non NULL (2000, 2500, 2000, 1000) dans la colonne salaire. Nous pouvons donc conclure que COUNT n'inclut pas les valeurs NULL.

Essayons d'utiliser la fonction COUNT(distinct column) qui compte toutes les valeurs différentes d'une colonne. Comment cette fonction traite-t-elle les valeurs NULL ?

SELECT COUNT(distinct salary) as "Different Salaries"
FROM employee
RÉSULTATS
Different Salaries
	3

La requête renvoie un "3", mais il y a quatre salaires différents : 2000, 2500, 1000, et NULL. Encore une fois, nous pouvons conclure que le NULL n'est pas inclus dans la valeur résultante.

Voyons un autre exemple, en utilisant cette fois la fonction d'agrégation AVG():

SELECT coalesce(department,'Unassigned department'), AVG(salary) 
FROM employee 
GROUP BY 1
RESULTATS
department			count(*)
Unassigned department    	2500
IT				1500
FINANCES			2000

Analysons si les valeurs NULL sont incluses dans la fonction AVG(). Le département informatique compte trois employés avec les valeurs de salaire suivantes : 2000, 1000 et NULL. Le résultat de AVG pour IT est 1500, il est donc clair que la valeur NULL n'est pas prise en compte dans le calcul de la moyenne. (Parce que (1000 + 2000 ) / 2 = 1500).

La conclusion est que les moyennes ne sont calculées qu'avec des valeurs non NULL. La règle générale est que les valeurs NULL ne sont pas prises en compte dans les fonctions d'agrégation telles que SUM(), AVG(), COUNT(), MAX() et MIN(). L'exception à cette règle est la fonction COUNT(*) qui compte toutes les lignes, même celles qui contiennent des valeurs NULL. Voici un exemple :

SELECT COUNT(*) as "Total Records"
FROM employee
RÉSULTATS
Total Records
         6

Comme on peut le voir, COUNT(*) renvoie le nombre total d'enregistrements dans la table "employeeComme nous le voyons, la fonction renvoie le nombre total d'enregistrements dans la table " ", même ceux qui ont des valeurs NULL dans certains ou tous les champs.

La clause ORDER BY et les valeurs NULL

La norme SQL ne définit pas explicitement un ordre de tri par défaut pour les valeurs NULL. Certaines bases de données comme Oracle et PostgreSQL utilisent une spécification NULLS FIRST ou NULLS LAST pour indiquer la place de la valeur NULL. L'exemple suivant montre cette fonctionnalité :

SELECT department, COUNT(*) as "Num of employees" , AVG(salary) as "Avg Dept. Salary"
FROM employee
GROUP BY department
ORDER BY department NULLS LAST
RESULTS
department			Num of employees		Avg Dept. Salary
FINANCES			1				2000
IT				3				1500
				2				2500

Expressions booléennes impliquant des NULS

Nous voyons normalement VRAI ou FAUX comme résultat booléen, mais il est courant que les expressions ou les conditions qui incluent un NULL renvoient un résultat INCONNU. Le résultat UNKNOWN est traité en détail dans un autre article que nous avons déjà publié ici sur notre blog.

ESSAYEZ VOUS-MÊME !

Il existe de nombreuses fonctions et caractéristiques des bases de données relationnelles qui produisent un comportement spécifique lorsqu'une valeur NULL est impliquée. Vous pouvez en apprendre davantage dans le cours LearnSQL's Fonctions SQL standards. Essayez-le gratuitement !