Saltar al contenido principal
eLearner.app
Módulo 4 · Lección 2 de 414/57 en el curso~10 min
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.

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

Consecuencia concreta: WHERE column = NULL nunca funciona. debes usar los operadores dedicados IS NULL / IS NOT NULL:

SQL
-- 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.

SQL
-- 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:

SQL
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 los NULL; 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

Ejercicio#sql.m4.l2.e1
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

Utilice COALESCE(department_id, -1) para reemplazar NULL con -1.

Solución disponible después de 3 intentos

Ejercicio de revisión

Ejercicio#sql.m4.l2.e2
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

COALESCE(d.name, '(nessuno)') maneja el NULL introducido por LEFT JOIN.

Solución disponible después de 3 intentos