Volver a la lista de artículos Artículos
Lectura de 9 minutos

¿Qué hacen las cláusulas INTERSECT y MINUS de SQL?

¿Conoce la diferencia entre las cláusulas INTERSECT y MINUS de SQL y cómo utilizarlas? En este artículo encontrarás ejemplos y explicaciones.

SQL INTERSECT y MINUS son cláusulas útiles para encontrar rápidamente la diferencia entre dos tablas y encontrar las filas que comparten.

INTERSECT compara los datos entre tablas y devuelve sólo las filas de datos que existen en ambas tablas.

MINUS compara los datos entre las tablas y devuelve las filas de datos que existen sólo en la primera tabla que se especifica.

Tanto SQL INTERSECT como MINUS (o EXCEPT, dependiendo de su dialecto SQL) forman parte del curso de fundamentos SQL de LearnSQL.es.

SQL INTERSECT

El operador SQL INTERSECT se utiliza para devolver los resultados de dos o más sentencias SELECT. Sin embargo, sólo devuelve las filas seleccionadas por todas las consultas o conjuntos de datos. Si un registro existe en una consulta y no en la otra, se omitirá en los resultados de INTERSECT.

El número y el orden de las columnas debe ser el mismo en todas las consultas de SELECT.

Los tipos de datos de las columnas deben ser los mismos, o al menos compatibles entre sí. INTERSECT filtra los duplicados y devuelve sólo las filas distintas que son comunes entre todas las consultas.

Esta es la sintaxis del operador INTERSECT:

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

INTERSECT

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

Todo lo que está dentro de los corchetes es totalmente opcional. El concepto de INTERSECT se explica con más detalle en el siguiente diagrama:

INTERSECT

La consulta INTERSECT devolverá los registros del área sombreada. Estos son los registros que existen en ambos conjuntos de datos

INTERSECT es sólo una forma de combinar los resultados de diferentes consultas SQL. Si estás interesado en aprender más, este artículo cubre los diferentes métodos para combinar los resultados de las consultas SQL.

SQL MINUS

La cláusula SQL MINUS se utiliza para combinar dos sentencias SELECT, pero devuelve filas de la primera sentencia SELECT que no son devueltas por la segunda sentencia SELECT. SQL MINUS sólo devuelve las filas que no están disponibles en la segunda sentencia SELECT.

Cada sentencia SELECT dentro de una consulta MINUS debe contener el mismo número de campos en los conjuntos de resultados junto con tipos de datos similares.

El operador MINUS no está soportado en todas las bases de datos SQL. Puede utilizarse en bases de datos como MySQL y Oracle. Para bases de datos como SQL Server, PostgreSQL y SQLite, utilice el operador EXCEPT para realizar este tipo de consulta.

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

MINUS

SELECT column_1 [, column_2, …, column_n]
FROM table_1 [, table_2, …, table_n]
[WHERE condition]

El código SQL que aparece entre los corchetes es totalmente opcional. El concepto de SQL MINUS se explica con más detalle en este diagrama:

MINUS

La consulta MINUS devolverá los registros del área roja. Estos son los registros que existen en el primer conjunto de datos y no en el segundo.

MINUS vs. INTERSECT: Ejemplos

Apliquemos las cláusulas INTERSECT y MINUS a un ejemplo práctico. Imaginemos que tenemos las siguientes tablas.

customers - Contiene detalles sobre nuestros clientes

idcustomer_namecountry
1Infotech SolutionsGermany
2Corpway IndustriesIreland
3Fenway IncEngland
4Fairview LtdFrance

suppliers - Contiene detalles sobre nuestros proveedores.

idcustomer_namecountry
1Carbon Way SuppliersSpain
2Alloy IncFrance
3Materials Delivered LtdIreland
4Concrete CrewPoland
5Conglorito SystemsItaly

Ahora escribamos una consulta en INTERSECT. Queremos encontrar los países que tienen en común nuestros proveedores y clientes.

SELECT country
FROM customers
INTERSECT
SELECT country
FROM suppliers

Especificamos la columna del país en cada cláusula SELECT. La ejecución de esta consulta da como resultado el siguiente conjunto de datos:

country
France
Ireland

Si miramos hacia atrás en el customers y suppliers podemos ver que este resultado es correcto. Sólo los países de Francia e Irlanda se comparten entre las tablas.

Ahora vamos a aplicar el operador MINUS a las mismas tablas. Esto nos permitirá obtener los países de nuestra customers que no están en nuestra tabla suppliers tabla:

SELECT country
FROM customers
MINUS
SELECT country
FROM suppliers

Al ejecutar esta consulta se obtiene el resultado:

country
England
Germany

Ahí lo tenemos: los países que son exclusivos de nuestra customers tabla. El orden de las cláusulas de SELECT es muy importante aquí, y es algo que debes tener en cuenta cuando uses el operador MINUS. Invirtamos el orden de nuestras cláusulas SELECT y veamos qué ocurre.

SELECT country
FROM suppliers
EXCEPT
SELECT country
FROM customers

Al ejecutar esta consulta se obtienen los siguientes datos:

country
Italy
Poland
Spain

Como puede ver, nuestro conjunto de resultados es muy diferente. El SQL comienza con nuestra tabla suppliers y luego elimina los países que existen en la tabla customers tabla.

Si se siente abrumado, considere la posibilidad de probar el curso Principios básicos de SQL de LearnSQL.com, que le proporcionará una base sólida de SQL. Le enseñará las sentencias SQL básicas como WHERE, GROUP BY, ORDER BY y HAVING. También aprenderá cómo JOIN tablas y añadir, modificar o eliminar datos de una base de datos.

Este ha sido un ejemplo sencillo que muestra cómo se pueden utilizar los operadores INTERSECT y MINUS para recuperar rápidamente conjuntos de datos distintos. Veamos algunos ejemplos más que le muestran cómo actúan estos operadores en tres escenarios diferentes:

  • Una tabla es el subconjunto de los datos de la otra tabla.
  • Ambas tablas tienen los mismos datos.
  • Una tabla de la consulta no contiene datos.

Más Ejemplos de SQL INTERSECT y MINUS

Una tabla es un subconjunto de los datos de la otra tabla

Para este escenario, imaginemos que tenemos dos tablas llamadas employees y planning_committee. Como puede ver, la tabla planning_committee es un subconjunto de employeeslo que significa que todos sus datos también están contenidos en employees.

employees - Todos los empleados de nuestra empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

planning_committee - Todos los empleados del comité de planificación de nuestra empresa.

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Veamos cómo se comporta la cláusula INTERSECT en este escenario.

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM planning_committee

Se devuelve el siguiente conjunto de datos:

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Como puede ver, sólo se devuelve el subconjunto. Esto se debe a que la tabla planning_committee es un subconjunto de la tabla employees por lo que el resultado será simplemente la tabla planning_committee tabla.

¿Qué sucede si utilizamos la cláusula MINUS en su lugar? Imaginemos que queremos encontrar todos los empleados que no están en el comité de planificación. Esto se puede conseguir escribiendo la siguiente consulta:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM planning_committee

La ejecución de esta consulta arroja el siguiente resultado:

employee_idfirst_namelast_name
321873JohnSmith
832923ChristinaGrey

Puede ver que estos empleados no están en la tabla planning_committee tabla; ¡este es el resultado deseado! De nuevo, el orden de las tablas es importante. Si invirtiéramos el orden de las cláusulas de SELECT así...

SELECT employee_id, first_name, last_name
FROM planning_committee
EXCEPT
SELECT employee_id, first_name, last_name
FROM employees

... ejecutando esta consulta se obtendría un resultado muy diferente:

employee_idfirst_namelast_name

Como todos los datos de la tabla planning_committee están contenidos en la tabla employees tabla, no se devuelve nada. SQL MINUS sólo devuelve datos distintos.

Es hora de ver nuestro siguiente escenario.

Ambas tablas tienen los mismos datos

Puede haber una situación en la que dos tablas SQL tengan datos idénticos. ¿Cómo manejan las cláusulas INTERSECT y MINUS esta situación, y qué resultados debe esperar? Averigüémoslo.

Para este escenario, usaremos las siguientes tablas:

payroll - Todos los empleados que están actualmente en la nómina de nuestra empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

employees - Todos los empleados de nuestra empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Puede ver que todos los empleados de nuestra empresa están actualmente en la nómina y están cobrando como es debido. Esto hace que estas tablas contengan datos idénticos.

Veamos cómo la cláusula INTERSECT maneja este caso:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM payroll

La ejecución de esta consulta devuelve este resultado:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Dado que todos los datos fueron compartidos entre las dos tablas, ¡se devuelve todo!

Es hora de ver cómo la cláusula MINUS maneja las tablas que comparten datos idénticos:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM payroll

La ejecución de esta consulta muestra el siguiente resultado:

employee_idfirst_namelast_name

No se devuelve ningún dato. SQL comienza seleccionando los datos de nuestra employees tabla y luego resta los datos que existen en la payroll tabla. En este caso, se elimina todo.

Esto nos lleva a nuestro escenario final. ¿Qué ocurre si una de las tablas que forma parte de una cláusula INTERSECT o MINUS no contiene datos?

Una tabla no contiene datos

Para este escenario, utilizaremos las siguientes tablas:

employees - Todos los empleados de nuestra empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

on_vacation - Todos los empleados de nuestra empresa que están actualmente de vacaciones.

employee_idfirst_namelast_name

Averigüemos cómo maneja la cláusula INTERSECT una tabla vacía:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM on_vacation

Nos da el siguiente resultado después de ejecutar esta consulta:

employee_idfirst_namelast_name

No hay resultados. Cuando utilizamos una tabla vacía como parte de la cláusula INTERSECT, obtendremos un conjunto de datos vacío. Esto se debe a que no se han encontrado coincidencias entre las dos tablas.

La forma en que la cláusula MINUS se ve afectada por la inclusión de una tabla vacía depende totalmente del orden que se especifique. Por ejemplo, esta consulta ...

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM on_vacation

... produce el siguiente resultado:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

La cláusula MINUS tiene aquí muy poco efecto, ya que esencialmente no está quitando nada (un conjunto de datos vacío) de la tabla employees tabla.

Sin embargo, si invertimos el orden de las cláusulas de SELECT, así ...

SELECT employee_id, first_name, last_name
FROM on_vacation
MINUS
SELECT employee_id, first_name, last_name
FROM employees

... nos encontramos con un resultado muy diferente:

employee_idfirst_namelast_name
Smith

Otro conjunto de datos vacío. Esto ocurre porque la primera cláusula SELECT recupera los datos de la tabla on_vacation tabla, que en este caso es nada. A continuación, instruimos a SQL para que extraiga los employees datos de nuestro conjunto de datos vacío. Esto no tiene ningún efecto, ya que el conjunto de datos ya está vacío.

INTERSECT, MINUS y más operadores de conjuntos SQL

En este artículo, hemos cubierto SQL INTERSECT y MINUS en gran detalle. Estos son conocidos como operadores de conjuntos SQL, que también incluyen UNION y UNION ALL. Puedes leer una introducción a los operadores de conjuntos SQL aquí, junto con cómo refinar aún más los resultados con operadores de conjuntos.