SQL EXCEPT: Operador de conjunto

La cláusula SQL EXCEPT ayuda a los usuarios a combinar dos declaraciones SELECT y devuelve filas distintas de la primera declaración SELECT que no están disponibles en la segunda declaración SELECT.

El operador SQL Except es bueno cuando desea encontrar filas comunes exclusivas para un resultado. Me gusta usarlo cuando pruebo los resultados de la consulta. Tomo el resultado de mi consulta no comprobada y le hago una excepción contra una consulta comprobada. Esto me ayuda a identificar filas que merecen mi atención y solución de problemas.

Sintaxis de SQL Except

La sintaxis de una consulta SQL Except es muy simple:

SELECT * FROM tabla1
EXCEPT
SELECT * FROM tabla2

Esta consulta enumera los resultados de la tabla 1 sin incluir los registros de la tabla1 que también están en la tabla2.

En esta sintaxis:

  • SELECT_QUERY: consulta SQL que selecciona filas de información. Es decir,  Puede ser una consulta simple o compleja con condiciones.
  • EXCEPT: Palabra clave de SQL para combinar conjuntos de resultados de consultas, y extraer los registros únicos de la primera consulta, de la izquierda o anterior.

Atención: Las columnas de la primera consulta deben ser similares entre la primera y la segunda consulta (mismo número, mismo tipo y mismo orden).

Diagrama explicativo

Los círculos representan dos consultas. El círculo gris es la consulta de la izquierda; mientras que el círculo blanco es el derecho. El área dentro de cada círculo representa los resultados de esa consulta. En el diagrama a continuación, solo se devolverá la zona no interceptada de cada circulo gracias al comando SQL EXCEPT. 

Como puede ver, la parte de gris representa el resultado del operador SQL EXCEPT. Esta área representa aquellas filas que están a la izquierda y no a la derecha de la consulta.

sql except

Nota

  • El operador SQL EXCEPT devuelve todos los registros de la primera instrucción SELECT que no están en la segunda instrucción SELECT.
  • El operador SQL EXCEPT en SQL Server es equivalente al operador MINUS en Oracle.
  • Este operador al igual que unión y intersect pertenece a los operadores de conjunto en SQL

Ejemplo: con una sola expresión

Veamos un ejemplo del operador SQL EXCEPT en SQL Server (Transact-SQL) que devuelve campos con el mismo tipo de datos.

Por ejemplo:

SELECT  nombre, Genero, Año, Sueldo
FROM empleados
EXCEPT
SELECT nombre, Genero, Año, Sueldo
FROM Empleado_informacion;

En esta consulta el operador SQL EXCEPT devuelve todos los valores de la tabla EMPLEADOS y que no están en la tabla EMPLEADO_INFORMACION. Lo que esto significa es que si existiera un valor en la tabla EMPLEADO y también existiera en la tabla EMPLEADO_INFORMACION, el valor de la tabla EMPLEADO no aparecería en los resultados.

Ejemplo de SQL Except con Where

Imagine un sistema informático de una empresa. Este sistema contiene 2 tablas que contienen listas de empleados:

  • Una tabla de «EMPLEADOS» que contiene los nombres, apellidos y años de registro de los empleados
  • Una tabla “EMPLEADOS_INFORMACION” que contiene la información de los empleados que ganan un sueldo por encima de los 6000

Este ejemplo tendrá como objetivo seleccionar empleados que ganan un sueldo por encima de los 6000.

SELECT  nombre, Genero, Año, Sueldo 
FROM [ejemplo].[dbo].[EMPLEADOS]
EXCEPT 
SELECT nombre, Genero, Año, Sueldo 
FROM [ejemplo].[dbo].[EMPLEADO_INFORMACION]
WHERE SUELDO< 6000

sql except

Esta tabla de resultados muestra los empleados que están registrados y los que no están presentes en la segunda tabla que ganan por encima de los 6000. Si los resultados de la segunda tabla existen la primera no lo muestra en la consulta.

Diferencia entre las cláusulas SQL EXCEPT y NOT IN

Podemos ver que la funcionalidad de ambas cláusulas es la misma, es decir, ayudan a especificar ciertos conjuntos de resultados que no deben incluirse en el conjunto de resultados final de la consulta. Pero hay muchas diferencias en su funcionamiento.

Cada vez que usamos la cláusula EXCEPT, es necesario mencionar todos los valores de columna que la consulta recuperará en la consulta que mencionará los registros que se excluirán y, por lo tanto, la restricción a la que se deben exceptuar estos registros es aplicable para todos los valores de columna, mientras que en el caso de la cláusula NOT IN, solo se restringe el valor de una sola columna por su contenido valioso que especifica que el conjunto de resultados que tiene esa columna, este conjunto de valores no debe incluirse en el conjunto de resultados final.

Además de esto, el uso de la cláusula EXCEPT elimina todos los registros duplicados que se recuperarán del conjunto de resultados, mientras que la cláusula NOT IN conservará las entradas duplicadas en el conjunto de resultados final.

Conclusión

Como se discutió anteriormente, el operador SQL EXCEPT solo se puede usar con consultas SELECT y los conjuntos de resultados de la consulta deben ser del mismo tamaño. Se puede utilizar con dos o más consultas. Cuando se usa con más de dos consultas, primero opera en las dos primeras consultas y el conjunto de resultados de eso se convierte en la entrada para la comparación con el tercer conjunto de resultados de la consulta y así sucesivamente.

Deja un comentario