Los operadores EXCEPT y NOT IN se utilizan para filtrar registros de una tabla en función de un criterio específico. En este artículo, veremos estos operadores en detalle e investigaremos las diferencias entre ellos.
Antes de continuar, creemos algunos datos ficticios que usaremos en este ejemplo:
Preparación de datos ficticios
Ejecute el siguiente script para crear una base de datos y tablas ficticias que usaremos en este artículo.
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars1 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) CREATE TABLE Cars2 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
En el script anterior, creamos una base de datos ShowRoom con dos tablas, Cars1 y Cars2.
Agreguemos algunos registros ficticios a las tablas Cars1 y Cars2.
Ejecute el siguiente script:
USE ShowRoom INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 1500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200) INSERT INTO Cars2 VALUES (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200), (11, 'Atlas', 'Volkswagen', 5000), (12, '110', 'Bugatti', 8000), (13, 'Landcruiser', 'Toyota', 3000), (14, 'Civic', 'Honda', 1800), (15, 'Accord', 'Honda', 2800)
Ahora tenemos un conjunto de datos útil.
Veamos cómo los operadores EXCEPT y NOT IN difieren entre sí usando estos datos.
EXCEPTO Operador
El operador EXCEPT filtra todos los registros del resultado de la consulta de la izquierda, que también están presentes en el resultado de la consulta de la derecha y devuelve los resultados restantes de la consulta de la izquierda.
La sintaxis del operador EXCEPT es la siguiente:
Right_Query EXCEPT Left_Query
Hay dos condiciones que deben cumplirse antes de la ejecución del operador EXCEPT. Ellos son:
- El orden y el número de las columnas devueltas por ambas consultas deben ser iguales.
- Los tipos de datos de las columnas deben coincidir o ser compatibles.
Esto puede sonar complicado. Sin embargo, el siguiente ejemplo lo aclarará.
En las tablas Cars1 y Cars2, los registros con id 6 a id 10 son comunes. Si usamos el operador EXCEPT con registros de la tabla Cars1 a la izquierda y la tabla Cars2 a la derecha, se devolverán aquellos registros de la tabla Cars1 que no estén en Cars2.
Veamos el operador EXCEPT en acción.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
El resultado de la consulta anterior se verá así:
La consulta del lado izquierdo recupera todos los registros de la tabla Cars1 mientras que la del lado derecho recupera todos los registros de la tabla Cars2. En la tabla Cars1, los registros con id 6 a 10 también están presentes en la tabla Cars2, por lo tanto, el operador EXCEPT solo devolvió las primeras cinco filas de la tabla Cars1.
De manera similar, si desea devolver todos los registros de la tabla Cars2 que no están presentes en la tabla Cars1, simplemente puede mover la tabla Cars2 a la izquierda del operador EXCEPT como se muestra en la siguiente consulta:
USE ShowRoom SELECT id, name, company, power FROM Cars2 Except SELECT id, name, company, power FROM Cars1
Uso del operador EXCEPT en una sola tabla
En los ejemplos anteriores, aplicamos el operador EXCEPT en dos tablas. Sin embargo, el operador EXCEPT también se puede usar para filtrar registros de una sola tabla. Por ejemplo, si desea filtrar todos los registros de la tabla Cars1 donde el valor de potencia es superior a 3000, puede usar el operador EXCEPT de la siguiente manera:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power from Cars1 WHERE power < 3000
En el script anterior, la consulta del lado izquierdo del operador EXCEPT recupera todos los registros de la tabla Cars1. La consulta en el lado derecho del operador EXCEPT recupera solo aquellos registros de la tabla Cars1 donde el valor de potencia es inferior a 3000. El operador EXCEPT filtra los registros de la consulta de la izquierda que existen en los resultados de la consulta de la derecha. Por lo tanto, todos los registros en la tabla Cars1 donde la potencia es inferior a 3000 se filtrarán y el resto de los registros se devolverán como se muestra en el siguiente resultado:
NO EN Operador
El operador NOT IN también se usa para filtrar filas. Busquemos todos los registros de la tabla Cars1 que también están presentes en la tabla Cars2 y devolvamos el resto de los registros usando el operador NOT IN.
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
El resultado de la consulta anterior se ve así:
Esto es similar a los resultados obtenidos con el operador EXCEPT.
Diferencia entre los operadores EXCEPT y NOT IN
Podemos ver que los resultados obtenidos usando los operadores EXCEPT y NOT IN son similares. Sin embargo, existen dos diferencias principales entre los operadores EXCEPT y NOT IN:
1- NOT IN Devuelve registros duplicados mientras que EXCEPT devuelve solo registros distintos
El operador EXCEPTO elimina las filas duplicadas de los resultados y devuelve solo registros DISTINTOS. Por otro lado, el operador NOT IN devolverá registros duplicados.
Veamos esto con la ayuda de un ejemplo. Ejecute la siguiente consulta para insertar un registro duplicado en la tabla Cars1.
INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800)
Ahora la tabla Cars1 tiene dos registros duplicados. Puede verificar esto ejecutando la siguiente consulta:
SELECT * FROM Cars1
La tabla Cars1 se verá así:
Puede ver que las filas 1 y 11 son duplicados entre sí.
Primero usemos el operador EXCEPT para filtrar todos los registros de la tabla Cars1 que están presentes en la tabla Cars2.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
El resultado se ve así:
Puede ver que aunque las filas 1 y 11 estaban duplicadas en la tabla Cars1 y no estaban presentes en la tabla Cars2, el operador EXCEPT no devolvió estas dos filas. Solo ha devuelto filas distintas.
Ahora usemos el operador NOT IN para la misma tarea:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
El resultado de la consulta anterior se ve así:
Puede ver que NOT IN devuelve filas duplicadas, es decir, la fila 1 y la fila 6.
2- EXCEPT compara columnas mientras que NOT IN compara un solo valor
El operador EXCEPT compara valores en una o más de una columna. Esto significa que el número de columnas debe ser el mismo. Por otro lado, el operador NOT IN compara valores en una sola columna.
Por ejemplo, no puede tener un número diferente de columnas para las consultas a la izquierda y a la derecha de un operador EXCEPTO como se muestra en el siguiente ejemplo:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name,power FROM Cars2
La consulta anterior devuelve el siguiente error:
Para el operador NOT IN, no puede tener más de una columna en la subconsulta. Esto significa que la siguiente consulta devolverá un error:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id, name from Cars2)
En el script anterior, la subconsulta tiene dos columnas, es decir, id y nombre. Por lo tanto, se lanzará un error:
Lecturas adicionales:
- Escuelas W3:ejemplos IN y NOT IN
- TechontheNet:el operador EXCEPTO
- YouTube:el operador EXCEPT