INTERSECT en SQL: qué es, cómo funciona y ejemplos prácticos

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

idnombredepartamento
1AnaVentas
2LuisMarketing
3CarlaIT

candidatos

idnombrepuesto
10LuisMarketing
11CarlaFinanzas
12MartaIT

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 B1,2,3,4
  • A EXCEPT B1
  • A INTERSECT B2,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 JOIN combina filas de varias tablas en una sola consulta, uniendo columnas.
  • INTERSECT compara 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

  1. 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;
  1. Tipos de datos incompatibles
-- ❌ Error: columna id es INT y columna nombre es VARCHAR
SELECT id FROM empleados
INTERSECT
SELECT nombre FROM candidatos;
  1. Esperar que devuelva duplicados
    👉 Como UNION, elimina duplicados por defecto. Si se quieren mantener, se debe simular con JOIN.

Buenas prácticas con INTERSECT

  • Usar INTERSECT para comparar conjuntos completos, no como reemplazo de JOIN.
  • Asegurarse de que las columnas sean del mismo tipo y tengan sentido lógico al compararlas.
  • En MySQL, usar equivalentes con INNER JOIN o IN.
  • 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.

Scroll al inicio