0Pricing
SQL Academy · Lección

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

  1. Patrones LIKE y comodines
  2. IN y NOT IN para conjuntos
  3. BETWEEN para rangos
  4. IS NULL, IS NOT NULL y COALESCE
← Volver a SQL Academy