El operador INTERSECT en SQL se utiliza para combinar los resultados de dos o más consultas y devolver únicamente las filas que aparecen en todas ellas.
En otras palabras: muestra la intersección de conjuntos.
👉 Es similar a la operación matemática de intersección: si un valor está presente en los dos conjuntos, aparece en el resultado.
Sintaxis básica de INTERSECT
SELECT columna1, columna2, ...
FROM tablaA
[condiciones]
INTERSECT
SELECT columna1, columna2, ...
FROM tablaB
[condiciones];Reglas importantes:
- Las consultas deben tener el mismo número de columnas.
- Las columnas deben ser de tipos de datos compatibles.
- Por defecto, elimina duplicados (como
UNION, pero aplicado a intersección).
Ejemplo básico de INTERSECT
Supongamos estas tablas:
empleados
| id | nombre | departamento |
|---|---|---|
| 1 | Ana | Ventas |
| 2 | Luis | Marketing |
| 3 | Carla | IT |
candidatos
| id | nombre | puesto |
|---|---|---|
| 10 | Luis | Marketing |
| 11 | Carla | Finanzas |
| 12 | Marta | IT |
Consulta:
SELECT nombre FROM empleados
INTERSECT
SELECT nombre FROM candidatos;
Resultado:
| nombre |
|---|
| Luis |
| Carla |
👉 Devuelve los nombres que aparecen en ambas tablas.
Ejemplo con condiciones
SELECT nombre FROM empleados WHERE departamento = 'IT'
INTERSECT
SELECT nombre FROM candidatos WHERE puesto = 'IT';
👉 Devuelve candidatos que además ya trabajan en el departamento de IT (más sobre condiciones en WHERE).
INTERSECT vs UNION vs EXCEPT
- UNION → devuelve todas las filas de ambas consultas, eliminando duplicados.
- UNION ALL → igual que
UNION, pero mantiene duplicados. - EXCEPT → devuelve filas de la primera consulta que no están en la segunda.
- INTERSECT → devuelve solo las filas comunes entre ambas consultas.
Ejemplo comparativo
Tablas simplificadas:
Tabla A:
1
2
3
Tabla B:
2
3
4
A UNION B→1,2,3,4A EXCEPT B→1A INTERSECT B→2,3
INTERSECT con múltiples columnas
Podemos comparar más de una columna al mismo tiempo:
SELECT id, nombre FROM empleados
INTERSECT
SELECT id, nombre FROM antiguos_empleados;
👉 Devuelve empleados que aparecen en ambas tablas con mismo id y nombre.
INTERSECT con subconsultas
SELECT cliente_id FROM pedidos WHERE total > 500
INTERSECT
SELECT id FROM clientes WHERE ciudad = 'Madrid';
👉 Devuelve los IDs de clientes que viven en Madrid y además tienen pedidos superiores a 500 (más sobre subconsultas).
Diferencias entre INTERSECT y INNER JOIN
Aunque ambos devuelven coincidencias, no son lo mismo:
INNER JOINcombina filas de varias tablas en una sola consulta, uniendo columnas.INTERSECTcompara dos resultados completos y devuelve los que coinciden en todas las columnas seleccionadas.
Ejemplo con INNER JOIN:
SELECT c.nombre
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id;
Ejemplo con INTERSECT:
SELECT nombre FROM clientes
INTERSECT
SELECT nombre FROM clientes_vip;
👉 JOIN se usa más para relaciones entre tablas; INTERSECT para comparar conjuntos.
Motores de bases de datos y soporte de INTERSECT
- PostgreSQL: soporta
INTERSECT. - Oracle: soporta
INTERSECT. - SQL Server: soporta
INTERSECT. - MySQL: ❌ no soporta INTERSECT directamente. Se puede emular con INNER JOIN o con IN.
Ejemplo equivalente en MySQL:
SELECT nombre FROM empleados
WHERE nombre IN (SELECT nombre FROM candidatos);
Errores comunes con INTERSECT
- Número distinto de columnas
-- ❌ Error: la primera consulta tiene 2 columnas, la segunda 1
SELECT id, nombre FROM empleados
INTERSECT
SELECT nombre FROM candidatos;
- Tipos de datos incompatibles
-- ❌ Error: columna id es INT y columna nombre es VARCHAR
SELECT id FROM empleados
INTERSECT
SELECT nombre FROM candidatos;
- Esperar que devuelva duplicados
👉 ComoUNION, elimina duplicados por defecto. Si se quieren mantener, se debe simular con JOIN.
Buenas prácticas con INTERSECT
- Usar
INTERSECTpara comparar conjuntos completos, no como reemplazo deJOIN. - Asegurarse de que las columnas sean del mismo tipo y tengan sentido lógico al compararlas.
- En MySQL, usar equivalentes con
INNER JOINoIN. - Para mejorar performance, asegurarse de que las columnas comparadas estén indexadas.
Ejemplo avanzado: clientes frecuentes
SELECT cliente_id FROM pedidos WHERE fecha >= '2025-01-01'
INTERSECT
SELECT cliente_id FROM pedidos WHERE fecha < '2025-01-01';
👉 Devuelve clientes que han realizado pedidos tanto en 2025 como en años anteriores.
Preguntas frecuentes (FAQ)
1. ¿INTERSECT elimina duplicados?
Sí. Devuelve solo valores distintos que estén en ambas consultas.
2. ¿Existe INTERSECT ALL?
Sí, algunos motores lo soportan. Devuelve la intersección manteniendo los duplicados mínimos.
3. ¿Se puede usar INTERSECT con más de dos consultas?
Sí.
SELECT columna FROM A
INTERSECT
SELECT columna FROM B
INTERSECT
SELECT columna FROM C;
4. ¿Qué diferencia hay entre INTERSECT e INNER JOIN?
JOIN combina datos de varias tablas; INTERSECT compara resultados y devuelve coincidencias exactas.
5. ¿Qué motores no soportan INTERSECT?
MySQL y MariaDB no lo soportan directamente, pero se puede emular con JOIN o IN.
Conclusión
El operador INTERSECT en SQL es una herramienta muy útil para encontrar coincidencias entre conjuntos de resultados.
- Es ideal para comparar tablas y obtener solo lo que tienen en común.
- Funciona de manera declarativa y clara, evitando consultas más complejas.
- Hay que tener en cuenta las limitaciones: número y tipo de columnas, y soporte en el motor de base de datos.
Dominar INTERSECT, junto con UNION y EXCEPT, te da un control avanzado sobre la manipulación de conjuntos de datos en SQL.
Compara tipos de uniones y casos de uso en JOINS y consulta el Glosario SQL completo.