0Pricing
SQL Interview Prep · Lección

Lógica trivalente y UNKNOWN

Descubra por qué NULL = NULL no es verdadero y cómo UNKNOWN se propaga por las condiciones

Lógica trivalente y UNKNOWN es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 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 SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

Por qué NULL confunde a los candidatos

NULL es la principal fuente de respuestas incorrectas en las entrevistas de SQL. La trampa consiste en tratarlo como un valor normal, cuando en realidad NULL significa «desconocido» o «ausente», no cero ni una cadena vacía.

A los entrevistadores les gusta este caso porque la sintaxis parece correcta, pero el resultado es incorrecto sin que se note. Pueden mostrarle un filtro que «debería» devolver una fila y preguntarle por qué no devuelve nada.

En esta lección construirá el modelo mental que resuelve cualquier pregunta sobre NULL: la lógica trivaluada. Cuando interiorice que las comparaciones pueden devolver TRUE, FALSE o UNKNOWN, todo lo demás se deduce de ahí.

NULL no es un valor

La frase más importante que debe decir en una entrevista es: NULL es la ausencia de un valor, no un valor en sí mismo.

Esto significa que no puede compararlo con = como compara los números. La base de datos no sabe si dos valores desconocidos son iguales, así que no se compromete con TRUE ni con FALSE.

  • NULL = 5 no es FALSE, sino UNKNOWN
  • NULL = NULL no es TRUE, sino UNKNOWN
  • NULL <> NULL también es UNKNOWN

Por eso, un filtro de igualdad ingenuo aplicado a una columna que admite NULL descarta filas silenciosamente.

Lógica bivaluada frente a trivaluada

La mayoría de los lenguajes de programación utilizan la lógica bivaluada: una expresión es TRUE o FALSE. SQL añade un tercer resultado, UNKNOWN, cada vez que hay un NULL en una comparación.

Por tanto, cualquier predicado de SQL puede evaluarse como TRUE, FALSE o UNKNOWN. La cláusula WHERE conserva una fila solo cuando su predicado es exactamente TRUE. UNKNOWN se comporta como FALSE al filtrar, pero lógicamente no es lo mismo.

Los entrevistadores comprueban si conoce esta diferencia, porque UNKNOWN se comporta de forma distinta bajo NOT que FALSE.

Un filtro que descarta filas silenciosamente

Este es el ejemplo clásico resuelto paso a paso. Suponga que bonus a veces es NULL. Un reclutador pregunta: «Esta consulta debería devolver a todas las personas cuyo bonus no sea 1000. ¿Por qué omite a los empleados sin bonus?»

Para una fila en la que bonus es NULL, bonus <> 1000 se evalúa como UNKNOWN, no como TRUE. WHERE conserva únicamente las filas TRUE, así que esos empleados desaparecen.

La solución consiste en tratar NULL explícitamente, algo que veremos en la siguiente lección. Por ahora, reconozca que las filas ausentes son una consecuencia lógica, no un error.

SELECT name, bonus
FROM employees
WHERE bonus <> 1000;
-- Rows where bonus IS NULL are excluded:
-- NULL <> 1000 evaluates to UNKNOWN, not TRUE

NULL en expresiones AND

La lógica trivaluada cambia el comportamiento de AND. Memorice la regla y podrá responder en el acto a cualquier pregunta sobre tablas de verdad.

  • TRUE AND UNKNOWN = UNKNOWN
  • FALSE AND UNKNOWN = FALSE
  • UNKNOWN AND UNKNOWN = UNKNOWN

La intuición es la siguiente: a AND le basta un FALSE para ser definitivamente FALSE. Por eso, FALSE AND cualquier cosa sigue siendo FALSE. En cambio, TRUE AND un valor desconocido sigue siendo desconocido, porque la parte desconocida podría resolverse de cualquiera de las dos formas.

-- If status = 'active' is TRUE but bonus = 100 is UNKNOWN:
SELECT *
FROM employees
WHERE status = 'active' AND bonus = 100;
-- Combined result is UNKNOWN, so the row is NOT returned

NULL en expresiones OR

OR es el reflejo de AND. Solo necesita un TRUE para ser definitivamente TRUE, así que TRUE hace que UNKNOWN deje de importar.

  • TRUE OR UNKNOWN = TRUE
  • FALSE OR UNKNOWN = UNKNOWN
  • UNKNOWN OR UNKNOWN = UNKNOWN

Por tanto, una fila aún puede cumplir una condición OR aunque una de sus ramas sea desconocida, siempre que otra rama sea realmente TRUE. Esta es una pregunta de seguimiento frecuente después de la pregunta sobre AND.

SELECT *
FROM employees
WHERE department = 'Sales' OR bonus = 100;
-- A Sales employee with NULL bonus:
-- TRUE OR UNKNOWN = TRUE, so the row IS returned

NOT invierte TRUE/FALSE, pero no UNKNOWN

Este es el matiz que los entrevistadores suelen reservar para el final. NOT invierte TRUE y FALSE, pero NOT UNKNOWN sigue siendo UNKNOWN.

Por eso, no puede limitarse a envolver una condición que falla en NOT para invertir el resultado. Si bonus = 1000 es UNKNOWN para una fila con NULL, entonces NOT (bonus = 1000) también es UNKNOWN y la fila sigue excluida.

La negación no recupera las filas con NULL. Solo lo hace una prueba explícita con IS NULL.

-- For a row where bonus IS NULL:
--   bonus = 1000        -> UNKNOWN
--   NOT (bonus = 1000)  -> UNKNOWN  (still excluded)
SELECT * FROM employees WHERE NOT (bonus = 1000);

Ejemplo resuelto: la trampa de NOT IN

Este es uno de los acertijos sobre NULL más frecuentes. NOT IN con una lista que contiene un NULL no devuelve ninguna fila, lo que sorprende a los candidatos que esperan que simplemente omita el NULL.

Internamente, x NOT IN (1, 2, NULL) se expande a x <> 1 AND x <> 2 AND x <> NULL. Esa última comparación es UNKNOWN, y TRUE AND TRUE AND UNKNOWN se reduce a UNKNOWN, por lo que nada cumple la condición.

La alternativa segura es NOT EXISTS, que no es vulnerable a este problema.

-- Returns ZERO rows if the subquery yields any NULL
SELECT name
FROM employees
WHERE manager_id NOT IN (SELECT manager_id FROM managers);

-- Each comparison against NULL becomes UNKNOWN,
-- and the AND-chain collapses to UNKNOWN for every row.

Por qué UNKNOWN se comporta como FALSE en WHERE

Una pregunta de seguimiento habitual es: «Si UNKNOWN no es FALSE, ¿por qué la fila se descarta igual que una fila FALSE?»

La respuesta precisa es que WHERE, ON y HAVING aplican la regla de conservar solo TRUE. Tanto FALSE como UNKNOWN no superan esa prueba, así que, a efectos del filtrado, parecen idénticos.

La diferencia solo se manifiesta con la negación y las restricciones CHECK. Una restricción CHECK acepta una fila cuando la condición es TRUE o UNKNOWN, por lo que un NULL puede superar una restricción CHECK que usted suponía que lo bloquearía.

-- CHECK passes on TRUE or UNKNOWN, so NULL salary is allowed:
-- CONSTRAINT salary_positive CHECK (salary > 0)
-- INSERT ... salary = NULL  -> NULL > 0 is UNKNOWN -> allowed

Ejemplo avanzado: COUNT y la brecha de valores de verdad

Unámoslo todo con un enunciado realista de entrevista. «Tenemos 100 empleados. SELECT COUNT(*) WHERE bonus = 100 devuelve 30 y WHERE bonus <> 100 devuelve 50. ¿Dónde están los otros 20?»

Los 20 que faltan tienen un bonus NULL. Ni = 100 ni <> 100 es TRUE para ellos; ambas expresiones son UNKNOWN, así que quedan fuera de los dos filtros.

Decir «los grupos no suman el total porque NULL no satisface ninguno de los dos predicados» es exactamente la respuesta que los entrevistadores esperan.

SELECT
  COUNT(*) FILTER (WHERE bonus = 100)  AS eq_100,
  COUNT(*) FILTER (WHERE bonus <> 100) AS ne_100,
  COUNT(*) FILTER (WHERE bonus IS NULL) AS null_bonus,
  COUNT(*) AS total
FROM employees;

Puntos clave para la entrevista

Cuando aparezca la lógica de NULL, mencione estos puntos para demostrar un nivel avanzado:

  • NULL significa desconocido; las comparaciones con él producen UNKNOWN.
  • SQL utiliza la lógica trivaluada: TRUE, FALSE y UNKNOWN.
  • WHERE, ON y HAVING conservan únicamente las filas TRUE.
  • NOT UNKNOWN sigue siendo UNKNOWN, por lo que la negación no recupera las filas con NULL.
  • NOT IN con cualquier NULL no devuelve filas; prefiera NOT EXISTS.

Exponga primero el modelo y después recorra la tabla de verdad. Ese orden demuestra que comprende el porqué, no solo el truco.

Comprobación rápida

Ponga a prueba su comprensión de la lógica trivaluada.

Resumen

Ya dispone del modelo mental básico de NULL:

  • NULL es desconocido, no un valor; nunca lo compare con = ni con <>.
  • SQL utiliza tres valores: los predicados devuelven TRUE, FALSE o UNKNOWN.
  • Las cláusulas de filtrado conservan únicamente TRUE; las filas UNKNOWN desaparecen igual que las filas FALSE.
  • NOT invierte TRUE y FALSE, pero deja UNKNOWN sin cambios.
  • La trampa de NOT IN con NULL devuelve cero filas; recurra a NOT EXISTS.

A continuación: la forma correcta de comprobar NULL con IS NULL, IS NOT NULL y los operadores de igualdad seguros frente a NULL.

Preguntas frecuentes

¿La lección «Lógica trivalente y UNKNOWN» es gratis?

Sí — el texto completo de «Lógica trivalente y UNKNOWN» 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 SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Lógica trivalente y UNKNOWN»?

Descubra por qué NULL = NULL no es verdadero y cómo UNKNOWN se propaga por las condiciones Practicas SQL 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 SQL Interview Prep?

No se requiere experiencia previa. SQL 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 1 de 4.

¿Cuánto tiempo toma la lección «Lógica trivalente y UNKNOWN»?

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 SQL Interview Prep?

Sí. Cada lección de SQL 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 SQL Interview Prep