Puedes ejecutar cualquier consulta SQL en nuestra consola interactiva: Abrir consola SQL →
IN en SQL: filtra múltiples valores de forma elegante
La cláusula IN permite comprobar si un valor coincide con cualquiera dentro de una lista. Es más limpio, más rápido y más legible que usar múltiples condiciones con OR.
Tabla de contenidos
1. ¿Qué es IN?
IN permite comprobar si un valor coincide con cualquiera dentro de una lista. Es equivalente a usar múltiples OR, pero mucho más limpio.
SELECT * FROM usuarios
WHERE ciudad IN ('Madrid', 'Barcelona', 'Valencia');
2. IN con números
SELECT * FROM productos
WHERE id IN (1, 3, 5);
Devuelve productos con id 1, 3 o 5.
3. IN con texto
SELECT * FROM usuarios
WHERE nombre IN ('Ana', 'Luis');
4. NOT IN
SELECT * FROM usuarios
WHERE ciudad NOT IN ('Madrid', 'Sevilla');
5. IN con subconsultas
IN también puede usarse con subconsultas, lo que lo hace extremadamente poderoso.
SELECT nombre FROM usuarios
WHERE id IN (
SELECT usuario_id FROM pedidos
);
6. Ejemplos prácticos
SELECT * FROM empleados WHERE departamento IN ('IT', 'Ventas');
SELECT * FROM productos WHERE categoria IN ('Ropa', 'Electrónica');
SELECT * FROM usuarios WHERE id IN (2, 4, 6);
SELECT * FROM pedidos WHERE estado NOT IN ('Cancelado', 'Pendiente');
7. Ejercicios para practicar
- Filtra usuarios que vivan en Madrid o Barcelona.
- Filtra productos con id 1, 2 o 5.
- Filtra empleados cuyo departamento sea IT o HR.
- Filtra usuarios cuyo nombre NO sea Ana ni Marta.
- Filtra usuarios cuyo id esté en una subconsulta.
SELECT * FROM usuarios WHERE ciudad IN ('Madrid', 'Barcelona');
SELECT * FROM productos WHERE id IN (1, 2, 5);
SELECT * FROM empleados WHERE departamento IN ('IT', 'HR');
SELECT * FROM usuarios WHERE nombre NOT IN ('Ana', 'Marta');
SELECT * FROM usuarios
WHERE id IN (SELECT usuario_id FROM pedidos);
8. Mini‑proyecto: Filtrar pedidos por estado
CREATE TABLE pedidos (
id INT PRIMARY KEY,
producto VARCHAR(50),
estado VARCHAR(50)
);
INSERT INTO pedidos VALUES
(1, 'Teclado', 'Enviado'),
(2, 'Ratón', 'Pendiente'),
(3, 'Monitor', 'Cancelado');
SELECT * FROM pedidos
WHERE estado IN ('Enviado', 'Pendiente');
9. Errores comunes
- Usar demasiados OR en lugar de IN.
- Olvidar que NOT IN ignora valores NULL.
- Usar IN con listas enormes sin índices.
- Confundir IN con BETWEEN.
10. Preguntas frecuentes
¿IN es más rápido que OR?
Sí, en la mayoría de motores SQL.
¿Puedo usar IN con subconsultas?
Sí, y es una de sus mayores ventajas.