IN y NOT IN para conjuntos
Filtre según listas de valores con IN y NOT IN, conozca el inconveniente de NULL en NOT IN y conviértalo a EXISTS para obtener una semántica segura.
IN y NOT IN para conjuntos es una lección gratuita de SQL Academy 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 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.
IN: comparar con una lista
IN es una forma abreviada de varios OR:
SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');
-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';IN con una subconsulta
Puede usar una subconsulta en el lado derecho:
SELECT * FROM orders
WHERE user_id IN (
SELECT id FROM users WHERE country = 'US'
);NOT IN: excluir una lista
Filtre las filas coincidentes:
SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');La trampa de NULL en NOT IN
Si el lado derecho contiene NULL, NOT IN devuelve NULL, y las filas cuyo predicado es NULL se descartan. Resultado: cero filas.
-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently
-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);Por qué NOT EXISTS es más seguro
NOT EXISTS utiliza la semántica estándar de las subconsultas correlacionadas y es seguro frente a NULL. La mayoría de los planificadores lo optimizan de forma idéntica a un NOT IN bien formado.
IN frente a OR: legibilidad
IN es más claro que las cadenas largas de OR y el planificador suele optimizarlo de forma idéntica:
-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...
-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)IN con tuplas (constructores de filas)
Compare pares de columnas:
SELECT * FROM order_items
WHERE (order_id, product_id) IN (
(1, 42), (2, 99), (3, 17)
);Uso de índices
Una lista IN sobre una columna indexada puede ejecutarse como varias búsquedas en el índice (Bitmap Index Scan). Por lo general, es rápido.
-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);Listas IN grandes
Las listas con miles de valores pueden volverse lentas. Prefiera:
- JOIN con una tabla real o temporal
= ANY(array)para pasar un parámetro de tipo array
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);IN con una lista vacía
Una lista IN vacía es ilegal en SQL estándar. Algunos clientes pasan un valor centinela; es más seguro generar la condición SQL de forma condicional.
-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.IN frente a JOIN
A veces, un JOIN es más claro que una subconsulta IN:
-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);
-- With JOIN:
SELECT o.*
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE u.pro;Resumen
IN es la forma sencilla de comprobar la pertenencia a un conjunto.
- Use IN en lugar de OR para mejorar la legibilidad
- NOT IN es peligroso con NULL; prefiera NOT EXISTS
- Para conjuntos grandes, use JOIN o pase arrays
Comprobación rápida
¿Cuál es el reemplazo más seguro para NOT IN (subquery) cuando la subconsulta puede contener NULL?
Preguntas frecuentes
¿La lección «IN y NOT IN para conjuntos» es gratis?
Sí — el texto completo de «IN y NOT IN para conjuntos» 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 y NOT IN para conjuntos»?
Filtre según listas de valores con IN y NOT IN, conozca el inconveniente de NULL en NOT IN y conviértalo a EXISTS para obtener una semántica segura. 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 2 de 4.
¿Cuánto tiempo toma la lección «IN y NOT IN para conjuntos»?
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
- Patrones LIKE y comodines
- IN y NOT IN para conjuntos
- BETWEEN para rangos
- IS NULL, IS NOT NULL y COALESCE