Lecciones del módulo (2/4)
Manejo de NULLs: IS NULL y COALESCE
En el conjunto de datos employees, Andrea Costa es especial: tiene
CÓDIGOPH1. Ya has rozado NULL (con
LEFT JOIN), pero ha llegado el momento de tomarlo en serio: NULLs en SQL
comportarse de manera diferente que cualquier otro valor, e ignorarlos es una de las
Principales causas de errores en el código de producción.
NULL no es cero, no es una cadena vacía
NULL significa valor desconocido/faltante. No es 0, ni '', ni
CÓDIGOPH3. Es "No lo sé". De esto se desprende una propiedad sorprendente:
NULL no es igual a nada, ni siquiera a sí mismo.
-- All these expressions return NULL (not true!):
SELECT NULL = NULL; -- NULL
SELECT NULL = 0; -- NULL
SELECT NULL <> 'qualcosa'; -- NULLConsecuencia concreta: WHERE column = NULL nunca funciona. debes usar
los operadores dedicados IS NULL / IS NOT NULL:
-- Employees without a department:
SELECT first_name, last_name
FROM employees
WHERE department_id IS NULL;
-- Employees WITH a department:
SELECT first_name, last_name
FROM employees
WHERE department_id IS NOT NULL;COALESCE: el respaldo NULO
A menudo desea mostrar algo en lugar de NULL cuando los datos son
falta: la cadena '(none)', cero, una fecha predeterminada. La función que
hace exactamente esto es COALESCE(a, b, c, ...): devuelve el primer
argumento no NULL en la lista.
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM employees;Combinado con LEFT JOIN se vuelve increíblemente poderoso para informes:
SELECT e.first_name,
e.last_name,
COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id;Resultado: todos los empleados regresaron, con el nombre del departamento o una descripción explícita. etiqueta para aquellos que no la tienen.
NULL y agregados
Funciones agregadas ignorar NULL (excepto COUNT(*)):
COUNT(department_id)cuenta sólo las filas con un valor;- Los promedios de
AVG(salary)ignoran losNULL; no los trata como 0; SUM(...)suma solo los valores no NULL.
Esto es casi siempre lo que quieres. Pero es bueno saberlo: si eres
buscando "el número total de empleados" use COUNT(*), no
CÓDIGOPH1.
Pruébalo
Para cada empleado, muestre el nombre (first_name), el apellido (last_name) y una columna 'dipartimento_id' que es igual a su depart_id o -1 si no está asignado. Tres columnas, una fila por empleado.
Mostrar pista
Utilice COALESCE(department_id, -1) para reemplazar NULL con -1.
Solución disponible después de 3 intentos
Ejercicio de revisión
Devuelve el nombre (first_name), el apellido (last_name) y el nombre del departamento (departments.name) de TODOS los empleados, mostrando '(nessuno)' cuando falta el departamento. Utilice UNIÓN IZQUIERDA + FUSIONAR.
Mostrar pista
COALESCE(d.name, '(nessuno)') maneja el NULL introducido por LEFT JOIN.
Solución disponible después de 3 intentos