21st Jul 2022 Lectura de 9 minutos ¿Qué hacen las cláusulas INTERSECT y MINUS de SQL? Andrew Bone SQL aprender SQL intersect minus Índice SQL INTERSECT SQL MINUS MINUS vs. INTERSECT: Ejemplos Más Ejemplos de SQL INTERSECT y MINUS Una tabla es un subconjunto de los datos de la otra tabla Ambas tablas tienen los mismos datos Una tabla no contiene datos INTERSECT, MINUS y más operadores de conjuntos 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: 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: 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. Tags: SQL aprender SQL intersect minus