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;| nombre | apellidos | telefono |
|---|---|---|
| Paula | Ortega Serrano | NULL |
| Alejandro | Serrano Blanco | NULL |
| Marta | Blanco Castro | NULL |
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;| nombre | apellidos | direccion |
|---|---|---|
| Ana | Martínez Ruiz | Calle Sierpes 42 |
| Andrés | Vega Romero | Av. de la Libertad 3 |
| Carlos | Rodríguez Martín | Av. Diagonal 220 |
| Carmen | Ruiz Jiménez | Av. de la Constitución 5 |
| David | Sánchez Moreno | Calle 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;| descripcion | total |
|---|---|
| clientes sin teléfono | 3 |
| clientes sin dirección | 2 |
| categorías raíz (sin padre) | 5 |
| empleados sin supervisor | 1 |
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;| nombre | apellidos | telefono | direccion |
|---|---|---|---|
| Paula | Ortega Serrano | NULL | Calle Toro 25 |
| Alejandro | Serrano Blanco | 689012346 | NULL |
| Marta | Blanco Castro | NULL | NULL |
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;| suma | producto | texto |
|---|---|---|
| NULL | NULL | NULL |
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;| nombre | contacto |
|---|---|
| Paula | Sin teléfono |
| Alejandro | Sin teléfono |
| Marta | Sin 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;| nombre | direccion |
|---|---|
| Alejandro | Dirección no disponible |
| Marta | Direcció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_clientes | con_telefono | sin_telefono |
|---|---|---|
| 20 | 17 | 3 |
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_normal | null_safe |
|---|---|
| NULL | 1 |
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:
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
