IN frente a ANY frente a ALL
Compare con conjuntos de valores
IN frente a ANY frente a ALL es una lección gratuita de SQL Academy 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 Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué son IN, ANY y ALL?
Al escribir consultas SQL, a menudo necesita comparar un valor con un conjunto de valores. SQL ofrece tres operadores potentes para ello: IN, ANY y ALL.
Los tres pueden trabajar con subconsultas que devuelven una lista de valores. Parecen similares, pero se comportan de forma diferente; elegir el adecuado puede hacer que su consulta sea mucho más expresiva y eficiente.
El operador IN
El operador IN comprueba si un valor coincide con algún valor de una lista o del resultado de una subconsulta. Es el más sencillo de los tres.
El ejemplo siguiente recupera los empleados que trabajan en los departamentos de Ventas, Recursos Humanos o Ingeniería.
SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');IN con una subconsulta
IN resulta especialmente potente cuando se combina con una subconsulta. En lugar de usar una lista codificada directamente, puede obtener los valores de comparación desde otra tabla.
En este caso, buscamos todos los empleados que pertenecen a un departamento cuyo presupuesto supera 100.000.
SELECT name, department
FROM employees
WHERE department IN (
SELECT dept_name
FROM departments
WHERE budget > 100000
);El operador ANY
ANY (también escrito como SOME) compara un valor con cada valor devuelto por una subconsulta mediante un operador de comparación como =, >, <, >= o <=.
La condición es verdadera si la comparación es verdadera para al menos un valor del resultado de la subconsulta.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT salary
FROM employees
WHERE department = 'HR'
);= ANY equivale a IN
Es importante conocer la siguiente equivalencia: = ANY (subquery) es lógicamente idéntico a IN (subquery). Ambos devuelven true cuando el valor coincide con al menos un resultado de la subconsulta.
Estas dos consultas producen el mismo resultado:
-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');
-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');El operador ALL
ALL compara un valor con todos los valores del resultado de una subconsulta. La condición solo es verdadera si la comparación se cumple para todos los valores devueltos.
Este ejemplo encuentra empleados cuyo salario es superior a todos los salarios de la categoría de becarios; es decir, ganan más que el becario con el salario más alto.
SELECT name, salary
FROM employees
WHERE salary > ALL (
SELECT salary
FROM employees
WHERE job_grade = 'Intern'
);ANY frente a ALL: comparación directa
La diferencia clave es la siguiente: ANY necesita que la condición sea verdadera para al menos un valor, mientras que ALL necesita que sea verdadera para todos los valores.
Puede verlo así: ANY equivale a aplicar OR a todas las comparaciones, mientras que ALL equivale a aplicar AND a todas las comparaciones.
-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');
-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');NOT IN frente a <> ALL
Al igual que = ANY refleja IN, el operador <> ALL equivale a NOT IN. Ambos devuelven true únicamente cuando el valor no coincide con ningún valor de la subconsulta.
Sin embargo, tenga cuidado: si la subconsulta devuelve siquiera un NULL, NOT IN no devolverá ninguna fila debido a la lógica trivaluada de SQL.
-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');
-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');La trampa de NULL con NOT IN
Un problema importante: si la subconsulta utilizada con NOT IN devuelve un NULL, toda la condición NOT IN se evalúa como UNKNOWN para cada fila y devuelve un conjunto de resultados vacío.
Para evitarlo, filtre los valores NULL en la subconsulta o use NOT EXISTS, que gestiona los valores NULL de forma segura.
-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);
-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
SELECT manager_id FROM employees
WHERE manager_id IS NOT NULL
);Ejemplo práctico: encontrar salarios altos
Veamos los tres operadores aplicados a un escenario realista. Tenemos una tabla employees con las columnas name, department y salary.
Queremos obtener los empleados que ganan más que el salario medio de cualquier departamento individual; es decir, más que la media de al menos un departamento.
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT AVG(salary)
FROM employees
GROUP BY department
)
ORDER BY salary DESC;¿Cuándo usar cada uno?
A continuación se ofrece una guía rápida para elegir entre los tres operadores:
- IN: cuando tiene una lista estática o necesita una comparación sencilla de igualdad con una subconsulta.
- = ANY: equivale a IN, pero permite usar otros operadores de comparación como
>o<. - ALL: cuando la condición debe cumplirse para todos los valores (por ejemplo, ser mayor que el máximo sin usar MAX).
- NOT IN: es práctico, pero tenga cuidado con los valores NULL; prefiera
NOT EXISTScuando la subconsulta pueda contener valores NULL.
Comprobación rápida
Compruebe su comprensión de IN, ANY y ALL.
Resumen de la lección
En esta lección ha aprendido a comparar valores con un conjunto mediante IN, ANY y ALL.
Conclusiones principales:
INcomprueba la pertenencia: es verdadero si el valor coincide con cualquier elemento de la lista o de la subconsulta.= ANYequivale aIN; usar otros operadores, como> ANY, significa que la condición es verdadera para al menos una coincidencia.ALLsignifica que la condición debe cumplirse para todos los valores devueltos por la subconsulta.NOT INno devuelve ninguna fila cuando la subconsulta contiene valores NULL; tenga siempre esto en cuenta.- Use
NOT EXISTScomo alternativa más segura aNOT INcuando pueda haber valores NULL.
Preguntas frecuentes
¿La lección «IN frente a ANY frente a ALL» es gratis?
Sí — el texto completo de «IN frente a ANY frente a 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 Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «IN frente a ANY frente a ALL»?
Compare con conjuntos de valores Practicas SQL Academy 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 Academy?
No se requiere experiencia previa. SQL Academy 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 «IN frente a ANY frente a 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 Academy?
Sí. Cada lección de SQL Academy 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 correlacionadas
- EXISTS y NOT EXISTS
- IN frente a ANY frente a ALL
- Rendimiento de EXISTS frente a JOIN