sql >> Base de Datos >  >> RDS >> Database

Comprender la diferencia entre los operadores EXCEPT y NOT IN

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