Volver a la lista de artículos Artículos
Lectura de 5 minutos

Valores NULL y la Cláusula GROUP BY

Ya hemos cubierto cómo utilizar la cláusula GROUP BY y algunas funciones de agregación como SUM(), AVG(), MAX(), MIN(), COUNT(). En este artículo, explicaremos cómo funciona la cláusula GROUP BY cuando se trata de valores NULL. También explicaremos sobre el uso de NULLscon la cláusula ORDER BY.

La mejor manera de dominar GROUP BY y NULL en SQL es a través de la práctica. Recomiendo la Ejercicio de SQL pista en LearnSQL.es. Contiene más de 600 ejercicios prácticos para ayudarte a ganar confianza en tus habilidades.

En SQL, NULL es un marcador especial utilizado para indicar que un valor de datos no existe en la base de datos. Para más detalles, consulte la explicación de Wikipedia sobre NULL en SQL.

Utilizaremos la siguiente employee para ilustrar cómo funciona la cláusula GROUP BY funciona con valores 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 cláusula GROUP BY y los valores NULL

Comencemos ejecutando una consulta SQL sencilla con la cláusula GROUP BY y los valores NULL:

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

Nota: He añadido una lista numerada aquí para mayor claridad; normalmente los resultados se mostrarían como una lista sin numerar.

Podemos ver que el primer valor de resultado es un NULL representado por una cadena vacía (la línea vacía antes del departamento de TI). Este espacio vacío representa todos los valores NULL devueltos por la cláusula GROUP BY, por lo que podemos concluir que GROUP BY trata los NULL como valores válidos.

En la siguiente consulta, contaremos cuántos empleados hay en cada departamento, incluido el departamento "NULL":

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

Nota: He añadido una lista numerada aquí para mayor claridad; normalmente los resultados se mostrarían como una lista sin numerar.

Analizando los resultados anteriores desde una "GROUP BY perspectiva", podemos concluir que todos los valores NULL están agrupados en un valor o bucket. Esto hace que parezca que NULL es un departamento con dos empleados. Sin embargo, tratar los NULL de esta manera - agrupando muchos NULL en un cubo - no se ajusta al concepto de que un valor NULL no es igual a ningún otro valor, incluso a otro NULL.

Para explicar por qué los NULL se agrupan en un solo cubo, tenemos que revisar el estándar SQL. SQL define "dos valores cualesquiera que sean iguales entre sí, o dos NULLs cualesquiera", como "no distintos". Esta definición de "no distinto" permite a SQL agrupar y ordenar los NULL cuando se utiliza la cláusula GROUP BY (u otras palabras clave que realizan la agrupación).

Hay otro punto confuso en el resultado anterior: la forma en que se representa el NULL (mediante una línea en blanco) no está clara. Una forma interesante de resolver esta cuestión es utilizar la función COALESCE, que convierte los NULL en un valor específico pero deja los demás valores sin modificar. Veamos la siguiente consulta:

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

Funciones agregadas y valores nulos

Hasta ahora hemos trabajado con los valores NULL de la columna departamento, y sólo hemos utilizado la cláusula GROUP BY. Vamos a intentar ejecutar algunas consultas utilizando valores NULL como parámetros en funciones agregadas. En primer lugar, utilizaremos la función COUNT():

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

Sin la cláusula DISTINCT, COUNT(salary) devuelve el número de registros que tienen valores no NULL (2000, 2500, 2000, 1000) en la columna de salario. Por tanto, podemos concluir que COUNT no incluye valores NULL.

Intentemos utilizar la función COUNT(distinct column) que cuenta todos los valores diferentes de una columna. ¿Cómo trata esto a los valores NULL?

SELECT COUNT(distinct salary) as "Different Salaries"
FROM employee
RESULTADOS
Different Salaries
	3

La consulta devuelve un "3", pero hay cuatro salarios diferentes: 2000, 2500, 1000 y NULL. De nuevo, podemos concluir que el NULL no está incluido en el valor resultante.

Veamos otro ejemplo, esta vez utilizando la función de agregación AVG():

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

Analicemos si los valores NULL se incluyen en la función AVG(). El departamento de TI tiene tres empleados con los siguientes valores salariales: 2000, 1000 y NULL. El resultado de AVG para IT es 1500, por lo que está claro que el valor NULL no se tiene en cuenta en el cálculo de la media. (Porque (1000 + 2000 ) / 2 = 1500).

La conclusión es que los promedios sólo se calculan con valores no NULL. La regla general es que los valores NULL no se consideran en ninguna función agregada como SUM(), AVG(), COUNT(), MAX() y MIN(). La excepción a esta regla es la función COUNT(*) que cuenta todas las filas, incluso las que tienen valores NULL. He aquí un ejemplo:

SELECT COUNT(*) as "Total Records"
FROM employee
RESULTADOS
Total Records
         6

Como podemos ver COUNT(*) devuelve el número total de registros de la tabla "employee", incluso aquellos registros con valores NULL en algunos o todos los campos.

La cláusula ORDER BY y los valores NULL

El estándar SQL no define explícitamente un orden por defecto para los NULL. Algunas bases de datos como Oracle y PostgreSQL utilizan una especificación NULLS FIRST o NULLS LAST para indicar el lugar del valor NULL. El siguiente ejemplo muestra esta característica:

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

Expresiones booleanas con NULLs

Normalmente vemos TRUE o FALSE como resultado booleano, pero es habitual que las expresiones o condiciones que incluyen un NULL devuelvan un resultado UNKNOWN. El resultado UNKNOWN se trata en detalle en otro artículo que publicamos anteriormente aquí en nuestro blog.

¡PRUÉBALO TÚ MISMO!

Hay muchas características y funciones de las bases de datos relacionales que producen un comportamiento específico cuando se incluye un valor NULL. Puedes aprender más en el curso Funciones estándar de SQL de LearnSQL. ¡Pruébalo gratis!