IS NULL

NULL en MySQL representa la ausencia de valor. No es cero, no es una cadena vacía, no es falso. Es literalmente "no hay dato". Trabajar con NULL requiere operadores específicos porque NULL se comporta de forma diferente a cualquier otro valor.

Por qué no funciona = con NULL

Este es probablemente el error más frecuente de los principiantes en SQL. La comparación = NULL no funciona como esperarías:

-- Esto NO encuentra clientes sin teléfono
SELECT nombre, telefono
FROM clientes
WHERE telefono = NULL;
Empty set (0.00 sec)

El resultado está vacío aunque sabemos que hay 3 clientes sin teléfono. El problema es que en SQL, cualquier comparación con NULL usando =, !=, <, > u otros operadores aritméticos devuelve NULL, no verdadero ni falso. Y las filas con condición NULL se excluyen del resultado.

La lógica detrás de esto es que NULL significa "desconocido". Si un valor es desconocido, no puedes saber si es igual a otro valor. ¿Es lo desconocido igual a lo desconocido? No se puede saber. Por eso NULL = NULL devuelve NULL, no TRUE.

IS NULL

El operador IS NULL es la forma correcta de comprobar si un valor es nulo:

SELECT nombre, apellidos, telefono
FROM clientes
WHERE telefono IS NULL;
nombreapellidostelefono
PaulaOrtega SerranoNULL
AlejandroSerrano BlancoNULL
MartaBlanco CastroNULL

Ahora sí encontramos los 3 clientes que no tienen teléfono registrado. IS NULL es el único operador que devuelve TRUE cuando el valor es NULL.

IS NOT NULL

IS NOT NULL es la negación: devuelve las filas donde la columna tiene un valor (cualquier valor, incluyendo cadenas vacías y ceros):

SELECT nombre, apellidos, direccion
FROM clientes
WHERE direccion IS NOT NULL
ORDER BY nombre
LIMIT 5;
nombreapellidosdireccion
AnaMartínez RuizCalle Sierpes 42
AndrésVega RomeroAv. de la Libertad 3
CarlosRodríguez MartínAv. Diagonal 220
CarmenRuiz JiménezAv. de la Constitución 5
DavidSánchez MorenoCalle Larios 10

En nuestra base de datos, la cliente Marta tiene tanto teléfono como dirección a NULL, y Alejandro tiene dirección NULL. Estos quedarían excluidos.

NULL en las tablas de ejemplo

Nuestras tablas tienen varios campos que pueden contener NULL por diseño:

SELECT
    'clientes sin teléfono' AS descripcion,
    COUNT(*) AS total
FROM clientes
WHERE telefono IS NULL
 
UNION ALL
 
SELECT 'clientes sin dirección',
    COUNT(*)
FROM clientes
WHERE direccion IS NULL
 
UNION ALL
 
SELECT 'categorías raíz (sin padre)',
    COUNT(*)
FROM categorias
WHERE categoria_padre_id IS NULL
 
UNION ALL
 
SELECT 'empleados sin supervisor',
    COUNT(*)
FROM empleados
WHERE supervisor_id IS NULL;
descripciontotal
clientes sin teléfono3
clientes sin dirección2
categorías raíz (sin padre)5
empleados sin supervisor1

Cada uno de estos NULL tiene un significado diferente: el cliente no proporcionó teléfono, la categoría no tiene padre porque es de nivel superior, o el empleado no tiene supervisor porque es el director general.

Encontrar registros con campos incompletos

Un caso práctico habitual es buscar registros con datos faltantes:

SELECT nombre, apellidos, telefono, direccion
FROM clientes
WHERE telefono IS NULL
   OR direccion IS NULL;
nombreapellidostelefonodireccion
PaulaOrtega SerranoNULLCalle Toro 25
AlejandroSerrano Blanco689012346NULL
MartaBlanco CastroNULLNULL

Esta consulta encuentra todos los clientes que tienen al menos un campo de contacto sin rellenar. Paula no tiene teléfono, Alejandro no tiene dirección, y Marta no tiene ninguno de los dos.

NULL en expresiones y funciones

Las operaciones aritméticas con NULL producen NULL:

SELECT
    10 + NULL AS suma,
    10 * NULL AS producto,
    CONCAT('hola', NULL) AS texto;
sumaproductotexto
NULLNULLNULL

Cualquier operación con NULL "contagia" el resultado. Esto puede causar problemas si no lo prevés. La función COALESCE es la solución habitual: devuelve el primer valor no nulo de una lista de argumentos:

SELECT
    nombre,
    COALESCE(telefono, 'Sin teléfono') AS contacto
FROM clientes
WHERE telefono IS NULL;
nombrecontacto
PaulaSin teléfono
AlejandroSin teléfono
MartaSin teléfono

COALESCE comprueba si telefono es NULL. Si lo es, devuelve 'Sin teléfono' como valor alternativo.

IFNULL como alternativa

MySQL también ofrece IFNULL, que funciona de manera similar a COALESCE pero solo acepta dos argumentos:

SELECT
    nombre,
    IFNULL(direccion, 'Dirección no disponible') AS direccion
FROM clientes
WHERE direccion IS NULL;
nombredireccion
AlejandroDirección no disponible
MartaDirección no disponible

COALESCE es estándar SQL y más flexible (acepta múltiples argumentos), mientras que IFNULL es específico de MySQL.

NULL en funciones de agregación

Las funciones de agregación como COUNT, SUM, AVG, MIN y MAX ignoran los valores NULL:

SELECT
    COUNT(*) AS total_clientes,
    COUNT(telefono) AS con_telefono,
    COUNT(*) - COUNT(telefono) AS sin_telefono
FROM clientes;
total_clientescon_telefonosin_telefono
20173

COUNT(*) cuenta todas las filas (20), pero COUNT(telefono) solo cuenta las filas donde telefono no es NULL (17). La diferencia nos dice cuántos clientes no tienen teléfono.

El operador

MySQL tiene un operador especial <=> llamado "null-safe equal" que permite comparar valores incluyendo NULLs. A diferencia de =, el operador <=> devuelve TRUE cuando ambos lados son NULL:

SELECT
    NULL = NULL AS comparacion_normal,
    NULL <=> NULL AS null_safe;
comparacion_normalnull_safe
NULL1

En la práctica, <=> se usa poco porque IS NULL es más legible. Pero puede ser útil en JOINs donde necesitas emparejar filas con valores nulos en ambos lados.

Resumen de reglas con NULL

Estas son las reglas fundamentales que conviene tener siempre presentes al trabajar con NULL en MySQL:

Cualquier comparación con NULL usando =, !=, <, > devuelve NULL. Usa IS NULL e IS NOT NULL para comprobar nulos. Las operaciones aritméticas y la concatenación con NULL devuelven NULL. Las funciones de agregación ignoran los valores NULL (excepto COUNT(*)). COALESCE e IFNULL permiten sustituir NULL por un valor alternativo.

Practica con IS NULL

Usa el editor para buscar valores nulos en los datos:

Simulador SQL
Ctrl+Enter para ejecutar

Con esto completamos la sección de operadores y filtros. En la siguiente sección exploraremos las cláusulas de agrupación: GROUP BY, HAVING y ROLLUP.

Escrito por Eduardo Lázaro