Subconsultas IN, ANY y ALL
Use subconsultas de pertenencia a conjuntos y evite la conocida trampa de NOT IN con NULL
Subconsultas IN, ANY y ALL es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 3 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.
Subconsultas de pertenencia a conjuntos
Cuando una subconsulta devuelve una lista de valores, puede comprobar la pertenencia a ella con IN, ANY o ALL. Estas operaciones permiten preguntar en SQL ¿está este valor en ese conjunto? o ¿supera este valor a todos o a algún elemento de ese conjunto?
IN— coincide con cualquier valor de la lista.ANY/SOME— es verdadero si la comparación se cumple para al menos un elemento.ALL— es verdadero solo si se cumple para todos los elementos.
IN con una subconsulta
El caso habitual: encontrar empleados que trabajan en cualquier departamento ubicado en 'NYC'. La subconsulta devuelve un conjunto de identificadores de departamentos y IN conserva las filas que coinciden con cualquiera de ellos.
Esta forma se lee de manera natural y es la que los entrevistadores esperan ver primero.
SELECT name
FROM employees
WHERE dept_id IN (
SELECT id FROM departments WHERE city = 'NYC'
);= ANY equivale a IN
Una equivalencia interesante que les gusta a los entrevistadores: = ANY (subquery) significa exactamente lo mismo que IN (subquery). Ambas expresiones son verdaderas cuando el valor es igual a al menos un elemento del conjunto.
La consulta siguiente devuelve exactamente el mismo resultado que la anterior. ANY y su sinónimo SOME generalizan esto a otros operadores como > y <.
SELECT name
FROM employees
WHERE dept_id = ANY (
SELECT id FROM departments WHERE city = 'NYC'
);ANY con un operador de comparación
ANY se vuelve muy útil con > o <. salary > ANY (set) es verdadero si salary supera al menos al elemento más pequeño — es decir, si es mayor que el mínimo.
Esto encuentra a los empleados que ganan más que al menos una persona del departamento 5.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary FROM employees WHERE dept_id = 5
);ALL con un operador de comparación
salary > ALL (set) es verdadero solo si salary supera a todos los elementos — es decir, si es mayor que el máximo. Esto encuentra a los empleados que ganan más que todas las personas del departamento 5.
Memorice la equivalencia: > ALL = mayor que MAX, > ANY = mayor que MIN. Los entrevistadores preguntan esto constantemente.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE dept_id = 5
);NOT IN: la famosa trampa de NULL
Esta es la trampa de subconsultas que más se pregunta en las entrevistas. Si la subconsulta de un NOT IN devuelve aunque sea un NULL, todo el NOT IN puede no devolver ninguna fila — no los registros huérfanos que esperaba.
¿Por qué? x NOT IN (1, 2, NULL) se expande a x <> 1 AND x <> 2 AND x <> NULL. La última comparación es UNKNOWN, por lo que el AND nunca puede ser verdadero.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
);Por qué esa consulta falla silenciosamente
Si orders.customer_id admite valores nulos y alguna fila contiene un NULL en esa columna, la consulta anterior devuelve cero filas aunque claramente existan clientes sin pedidos.
- La presencia de NULL convierte la lógica en
UNKNOWN. - No se produce ningún error — simplemente devuelve resultados incorrectos (vacíos).
Mencionar este peligro explícitamente durante una entrevista transmite una gran solvencia.
Corregir NOT IN con NULL
Tres soluciones seguras que los entrevistadores aceptan:
- Excluir los NULL de la subconsulta: añadir
WHERE customer_id IS NOT NULL. - Reescribir la consulta usando
NOT EXISTS, que gestiona correctamente los NULL. - Usar una anti-combinación
LEFT JOIN ... IS NULL.
La versión protegida de abajo devuelve la lista real de clientes sin pedidos.
SELECT name
FROM customers
WHERE id NOT IN (
SELECT customer_id FROM orders
WHERE customer_id IS NOT NULL
);IN funciona bien con NULL
Un dato tranquilizador: un IN simple (sin negación) no se ve afectado por los NULL de la lista. x IN (1, 2, NULL) es verdadero si x es igual a 1 o 2; el NULL simplemente nunca coincide.
El peligro de NULL es exclusivo de NOT IN. Conocer la diferencia entre ambos casos es precisamente lo que distingue una respuesta segura de una suposición.
IN de varias columnas
Algunos dialectos (Postgres, MySQL) permiten usar IN con una tupla de columnas para comparar pares de una vez. Esto encuentra las líneas de pedido cuya combinación (producto, región) aparece en una tabla de promociones.
SQL Server no admite IN con valores de fila; allí tendría que reescribirlo con EXISTS. Mencionar esta diferencia de portabilidad impresiona a los entrevistadores.
SELECT *
FROM order_lines
WHERE (product_id, region) IN (
SELECT product_id, region FROM promotions
);Respuesta breve para entrevistas
Diga esto: «IN comprueba la pertenencia a un conjunto y equivale a = ANY. Con operadores de comparación, > ANY significa mayor que el mínimo y > ALL significa mayor que el máximo. La gran trampa es usar NOT IN con una subconsulta que puede devolver NULL: devuelve silenciosamente cero filas, así que lo protejo con IS NOT NULL o cambio a NOT EXISTS.»
Esa respuesta cubre la pertenencia, la semántica de ANY/ALL y la trampa de NULL en una sola frase.
Comprobación rápida
La trampa de subconsultas favorita del entrevistador.
Repaso
Subconsultas de pertenencia, dominadas:
IN== ANY: coincide con cualquier elemento del conjunto.> ANYsignifica mayor que el mínimo;> ALLsignifica mayor que el máximo.NOT INcon un NULL en la subconsulta devuelve silenciosamente cero filas — protéjalo conIS NOT NULLo useNOT EXISTS.- Un
INsimple tolera los NULL; elINde varias columnas funciona en algunos dialectos.
A continuación: EXISTS frente a IN y la cuestión del rendimiento que tanto les gusta plantear a los entrevistadores sénior.
Preguntas frecuentes
¿La lección «Subconsultas IN, ANY y ALL» es gratis?
Sí — el texto completo de «Subconsultas IN, ANY y ALL» 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 «Subconsultas IN, ANY y ALL»?
Use subconsultas de pertenencia a conjuntos y evite la conocida trampa de NOT IN con NULL 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 3 de 4.
¿Cuánto tiempo toma la lección «Subconsultas IN, ANY y ALL»?
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
- Subconsultas escalares en SELECT y WHERE
- Subconsultas en la cláusula FROM (tablas derivadas)
- Subconsultas IN, ANY y ALL
- Rendimiento de EXISTS frente a IN