0Pricing
Coding Interview Prep · Lección

IS NULL, IS NOT NULL e igualdad segura para NULL

Compruebe correctamente los valores NULL y conozca los operadores seguros para NULL según cada dialecto

IS NULL, IS NOT NULL e igualdad segura para NULL es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

Cómo comprobar NULL correctamente

La lección anterior demostró que no puede utilizar = para encontrar valores NULL. Entonces, ¿cómo se comprueban? Con los predicados específicos IS NULL e IS NOT NULL.

Estas son las únicas formas correctas y portables de comprobar si faltan valores, y los entrevistadores rechazarán col = NULL cada vez que lo vean.

En esta lección se explican IS NULL, IS NOT NULL, la familia IS DISTINCT FROM y los operadores de igualdad seguros frente a NULL específicos de cada dialecto. Conocer las diferencias entre bases de datos es una señal clara de experiencia avanzada.

IS NULL e IS NOT NULL

IS NULL devuelve TRUE cuando el valor es NULL y FALSE en cualquier otro caso. Lo crucial es que nunca devuelve UNKNOWN, por lo que se puede utilizar directamente en WHERE de forma segura.

IS NOT NULL es su complemento exacto: TRUE para cualquier valor real y FALSE para NULL.

Estos predicados son las herramientas fundamentales para gestionar NULL. Forman parte del SQL estándar y se comportan de la misma manera en MySQL, Postgres, SQL Server, Oracle y SQLite.

-- Find employees with no recorded bonus
SELECT name FROM employees WHERE bonus IS NULL;

-- Find employees that do have a bonus
SELECT name FROM employees WHERE bonus IS NOT NULL;

Por qué col = NULL siempre es incorrecto

Esta es una trampa segura en las entrevistas: un candidato escribe WHERE bonus = NULL esperando encontrar los bonus ausentes. La consulta devuelve cero filas.

Recuerde la lógica trivaluada: bonus = NULL es UNKNOWN para todas las filas, incluidas las que tienen NULL, porque nada es igual a algo desconocido. WHERE conserva únicamente TRUE, así que nada coincide.

Algunas bases de datos, en modos no estándar, reescriben silenciosamente = NULL como IS NULL, pero nunca debe depender de ello. Escriba siempre IS NULL de forma explícita.

-- WRONG: returns zero rows, bonus = NULL is UNKNOWN for all
SELECT name FROM employees WHERE bonus = NULL;

-- RIGHT:
SELECT name FROM employees WHERE bonus IS NULL;

Recuento de valores NULL y no NULL

Una tarea habitual de los analistas es auditar la calidad de los datos: ¿qué grado de integridad tiene una columna? Combine IS NULL con COUNT para informar de los valores ausentes.

Observe el contraste: COUNT(*) cuenta todas las filas, mientras que COUNT(bonus) cuenta únicamente los bonus que no son NULL. La diferencia entre ambos equivale al recuento de NULL, un hecho que retomaremos en la lección sobre agregaciones.

SELECT
  COUNT(*)                                AS total_rows,
  COUNT(bonus)                            AS with_bonus,
  COUNT(*) - COUNT(bonus)                 AS missing_bonus,
  SUM(CASE WHEN bonus IS NULL THEN 1 ELSE 0 END) AS missing_check
FROM employees;

El problema que resuelve la igualdad segura frente a NULL

Suponga que desea comparar dos columnas y considerar coincidentes los casos en que ambas sean NULL. La expresión a = b normal falla: cuando ambas son NULL, el resultado es UNKNOWN, por lo que el par queda excluido aunque intuitivamente sean «lo mismo».

Esto aparece al comparar una fila antigua con una nueva para detectar cambios o al hacer JOIN sobre columnas opcionales. Necesita una comparación en la que NULL = NULL dé TRUE y NULL frente a un valor dé FALSE. Eso es lo que proporciona la igualdad segura frente a NULL.

-- Goal: change-detection where two NULLs count as equal
-- Plain equality fails when both sides are NULL:
--   NULL = NULL -> UNKNOWN (treated as not-equal)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note = n.note;  -- misses rows where both notes are NULL

IS DISTINCT FROM (SQL estándar)

La comparación segura frente a NULL del estándar ANSI es IS DISTINCT FROM y su inversa IS NOT DISTINCT FROM. Ambas son compatibles con Postgres, SQL Server (2022+) y otros sistemas.

  • a IS NOT DISTINCT FROM b significa «igual, considerando que NULL = NULL cuenta como igualdad».
  • a IS DISTINCT FROM b significa «diferente, tratando NULL como un valor normal».

Estas expresiones siempre devuelven TRUE o FALSE, nunca UNKNOWN, por lo que son seguras en cualquier lugar donde se espere un predicado.

-- TRUE when notes match, including both NULL
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS NOT DISTINCT FROM n.note;

-- TRUE when notes differ (NULL vs value counts as different)
SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note IS DISTINCT FROM n.note;

Operador <=> de MySQL

MySQL incluye un operador compacto de igualdad segura frente a NULL escrito como <=> (el operador spaceship).

a <=> b devuelve 1 (TRUE) cuando ambos lados son iguales o ambos son NULL, y 0 (FALSE) en cualquier otro caso. Es el equivalente en MySQL de IS NOT DISTINCT FROM.

Si un entrevistador pregunta específicamente por la comparación segura frente a NULL en MySQL, esta es la respuesta idiomática.

-- MySQL: 1 when both equal or both NULL
SELECT (NULL <=> NULL) AS both_null,   -- 1
       (NULL <=> 5)    AS null_vs_val, -- 0
       (5 <=> 5)       AS val_eq;      -- 1

SELECT * FROM old_t o JOIN new_t n ON o.id = n.id
WHERE o.note <=> n.note;

Guía rápida entre dialectos

Los entrevistadores valoran a los candidatos que conocen los límites de portabilidad. Este es el mapa de igualdad segura frente a NULL:

  • ANSI / Postgres / SQL Server 2022+: IS NOT DISTINCT FROM
  • MySQL / MariaDB: <=>
  • SQLite: IS y IS NOT funcionan como igualdad segura frente a NULL
  • Oracle: no tiene un operador nativo; puede emularlo con DECODE(a, b, 1, 0) = 1 o con trucos basados en COALESCE

Si no está seguro de qué motor se utiliza, recurra a la forma manual portable que se muestra a continuación.

-- SQLite NULL-safe equality
SELECT * FROM t WHERE a IS b;      -- TRUE when both NULL
SELECT * FROM t WHERE a IS NOT b;  -- complement

Coincidencia manual portable segura frente a NULL

Cuando no hay un operador nativo disponible, puede construir una igualdad segura frente a NULL a partir de elementos básicos. El patrón portable combina una igualdad normal con una cláusula explícita para el caso en que ambos valores sean NULL.

Interprételo así: «son iguales O ambos están ausentes». Funciona en cualquier base de datos, por lo que es una excelente respuesta cuando el entrevistador no especifica el dialecto.

SELECT *
FROM old_t o JOIN new_t n ON o.id = n.id
WHERE (o.note = n.note)
   OR (o.note IS NULL AND n.note IS NULL);

-- Alternative using COALESCE with a sentinel that
-- cannot occur in real data:
-- WHERE COALESCE(o.note, '##NULL##') = COALESCE(n.note, '##NULL##')

Ejemplo más detallado: claves de JOIN seguras frente a NULL

Un caso engañoso realista es hacer JOIN usando una clave que admite NULL. Si region puede ser NULL en ambos lados, un equi-join normal descarta silenciosamente esos pares porque NULL = NULL es UNKNOWN.

Si la regla de negocio indica que «las filas sin región deben coincidir con otras filas sin región», debe hacer que la condición del JOIN sea segura frente a NULL. Exponga la suposición en voz alta durante la entrevista y, después, elija el operador que corresponda al motor.

-- Postgres / ANSI: match including both-NULL regions
SELECT a.id, b.id
FROM table_a a
JOIN table_b b
  ON a.region IS NOT DISTINCT FROM b.region;

-- MySQL equivalent: ON a.region <=> b.region

Puntos clave para la entrevista

Para responder correctamente a cualquier pregunta sobre comprobación de NULL:

  • Utilice siempre IS NULL / IS NOT NULL; nunca = NULL.
  • Estos predicados solo devuelven TRUE o FALSE, por lo que son seguros en WHERE.
  • Para comparar de modo que «NULL sea igual a NULL», utilice IS NOT DISTINCT FROM (ANSI) o <=> (MySQL).
  • Indique el dialecto al que se dirige y, si no está seguro, ofrezca la alternativa portable con una cláusula OR.

Mencionar tanto el operador estándar como el del proveedor demuestra una amplitud de conocimientos que los evaluadores notan.

Comprobación rápida

Elija la comparación correcta y segura frente a NULL.

Resumen

Ahora puede comprobar correctamente si un valor es NULL:

  • IS NULL / IS NOT NULL son las únicas comprobaciones de NULL correctas y portables; nunca devuelven UNKNOWN.
  • col = NULL siempre devuelve cero filas; es una trampa clásica de las entrevistas.
  • La igualdad segura frente a NULL considera iguales dos valores NULL: IS NOT DISTINCT FROM (ANSI/Postgres), <=> (MySQL), IS (SQLite).
  • Cuando no existe un operador, utilice (a = b) OR (a IS NULL AND b IS NULL).

A continuación: sustitución de valores predeterminados para NULL con COALESCE, NULLIF y funciones de proveedores como ISNULL.

Preguntas frecuentes

¿La lección «IS NULL, IS NOT NULL e igualdad segura para NULL» es gratis?

Sí — el texto completo de «IS NULL, IS NOT NULL e igualdad segura para NULL» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «IS NULL, IS NOT NULL e igualdad segura para NULL»?

Compruebe correctamente los valores NULL y conozca los operadores seguros para NULL según cada dialecto Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Coding Interview Prep?

No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «IS NULL, IS NOT NULL e igualdad segura para NULL»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?

Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Lógica trivalente y UNKNOWN
  2. IS NULL, IS NOT NULL e igualdad segura para NULL
  3. COALESCE, NULLIF e ISNULL
  4. Valores NULL en agregaciones, joins y DISTINCT
← Volver a Coding Interview Prep