Contenido de esta guía
Qué problema resuelve
INTERSECT sirve para responder preguntas del tipo «¿qué elementos pertenecen a los dos grupos?». Cada SELECT produce un conjunto y el operador conserva la parte común.
La comparación se realiza sobre la fila completa. Si seleccionas dos columnas, ambas deben coincidir para que la fila forme parte del resultado.
Prepara consultas compatibles
Los dos SELECT deben devolver el mismo número de columnas y tipos comparables en la misma posición. Los nombres finales suelen proceder del primer SELECT.
SELECT columna
FROM primera_fuente
INTERSECT
SELECT columna
FROM segunda_fuente;INTERSECT elimina duplicados. El resultado representa coincidencias únicas. Si necesitas contar cuántas veces aparece cada valor, prepara primero esa información con una agregación.
Ejemplo guiado
Queremos los clientes que están registrados en Madrid y además permanecen activos:
SELECT nombre
FROM clientes
WHERE ciudad = 'Madrid'
INTERSECT
SELECT nombre
FROM clientes
WHERE activo = 1
ORDER BY nombre;| nombre |
|---|
| Ana Torres |
| Marta Ruiz |
| Noa Vidal |
Pablo Sanz vive en Madrid, pero no aparece porque su valor de activo es 0. Las otras tres personas cumplen las dos condiciones.
Cuándo usar un JOIN
INTERSECT compara resultados ya formados. Un JOIN relaciona filas mediante columnas y permite traer información adicional de varias tablas. Si solo necesitas saber qué valores están en ambos grupos, INTERSECT puede expresar la intención con mucha claridad.
Error frecuente
Seleccionar columnas diferentes en cada lado
No combines, por ejemplo, un identificador numérico con un nombre de texto solo porque ambos SELECT devuelven una columna. Las posiciones deben representar el mismo tipo de dato y la misma idea.
Comprueba lo aprendido
Encuentra clientes de Bilbao con pedidos
Devuelve, en orden alfabético, los nombres de clientes que viven en Bilbao y que además aparecen en algún pedido. Resuelve la coincidencia con INTERSECT.
clientes por ciudad.nombre en ambos lados y ordena al final.Solución razonada
SELECT nombre
FROM clientes
WHERE ciudad = 'Bilbao'
INTERSECT
SELECT c.nombre
FROM clientes AS c
JOIN pedidos AS p ON p.cliente_id = c.id
ORDER BY nombre;| nombre |
|---|
| Diego López |
| Lucía Vega |
Ambas personas viven en Bilbao y tienen al menos un pedido. INTERSECT evita repetir a Lucía aunque tenga más de uno.
Compatibilidad entre motores
PostgreSQL, SQLite, SQL Server y Oracle admiten INTERSECT. MySQL lo incorporó en la versión 8.0.31; una instalación anterior necesita expresar la misma intención con EXISTS, un JOIN u otra estrategia equivalente.
La prioridad al mezclar varios operadores de conjuntos puede sorprender. Usa paréntesis cuando combines INTERSECT con UNION o EXCEPT y la lectura no sea inequívoca.
Qué debes recordar
INTERSECTconserva las filas completas presentes en ambos resultados.- Los dos
SELECTdeben devolver columnas compatibles y con el mismo significado. - El resultado elimina duplicados salvo que el motor admita y uses
INTERSECT ALL. - Si necesitas combinar columnas de varias tablas, probablemente buscas un
JOIN.
Conceptos relacionados
Fuentes técnicas
La explicación se ha contrastado con documentación oficial: