7th Jul 2022 Lectura de 5 minutos Valores NULL y la Cláusula GROUP BY Maria Alcaraz funciones de agregado NULL valores NULL Índice La cláusula GROUP BY y los valores NULL Funciones agregadas y valores nulos La cláusula ORDER BY y los valores NULL Expresiones booleanas con NULLs ¡PRUÉBALO TÚ MISMO! 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! Tags: funciones de agregado NULL valores NULL