Contenido de esta guía
Qué comprueba IN
IN expresa una pertenencia: la condición es verdadera cuando el valor de la izquierda coincide con al menos un elemento del conjunto de la derecha.
Con una lista pequeña suele ser más legible que encadenar varias comparaciones con OR. Con una subconsulta permite filtrar según datos almacenados en otra tabla.
Lista y subconsulta
WHERE ciudad IN ('Madrid', 'Sevilla')
WHERE cliente_id IN (
SELECT id
FROM clientes
WHERE activo = 1
)La subconsulta de IN debe devolver una sola columna cuando se compara un único valor.
Ejemplo guiado: clientes de dos ciudades
SELECT nombre, ciudad
FROM clientes
WHERE ciudad IN ('Madrid', 'Sevilla')
ORDER BY ciudad, nombre;| nombre | ciudad |
|---|---|
| Ana Torres | Madrid |
| Marta Ruiz | Madrid |
| Noa Vidal | Madrid |
| Pablo Sanz | Madrid |
| Elena Rey | Sevilla |
| Sara Gómez | Sevilla |
La condición equivale a preguntar si ciudad = 'Madrid' o ciudad = 'Sevilla', pero muestra la intención con menos repetición.
Por qué NOT IN y NULL requieren cuidado
Esperar un verdadero cuando el conjunto contiene NULL
Si no hay coincidencias pero el conjunto contiene un NULL, SQL puede producir un resultado desconocido en lugar de verdadero. En un WHERE, esa fila no pasa el filtro.
WHERE id NOT IN (
SELECT cliente_id
FROM lista_exclusiones
)Cuando la columna de la subconsulta admite NULL, filtra esos valores expresamente o utiliza NOT EXISTS con una comparación correlacionada.
IN no sustituye todas las comparaciones. Para intervalos usa operadores o BETWEEN; para patrones usa LIKE; para comprobar nulos usa IS NULL.
Comprueba lo aprendido
Filtra tres estados de pedido
Muestra id, estado y total de los pedidos cuyo estado sea 'pendiente', 'pagado' o 'enviado'. Ordena por id.
estado.Solución razonada
SELECT id, estado, total
FROM pedidos
WHERE estado IN ('pendiente', 'pagado', 'enviado')
ORDER BY id;IN compara cada estado con la lista completa y conserva cualquier coincidencia.
Compatibilidad entre motores
La forma básica con listas y subconsultas pertenece al SQL ampliamente soportado. Los límites prácticos de tamaño, la optimización y algunas variantes de comparación por filas pueden cambiar. Las reglas de NULL no deben sustituirse por intuiciones de lenguajes con valores booleanos de solo dos estados.
Qué debes recordar
INcomprueba coincidencia con cualquier elemento del conjunto.- Una subconsulta usada con
INpara comparar un solo valor debe devolver una columna. NOT INpuede producir desconocido cuando intervieneNULL.- Elige el operador que represente realmente la condición.