Database
 sql >> Base de Dados >  >> RDS >> Database

Entendendo a diferença entre os operadores EXCEPT e NOT IN


Os operadores EXCEPT e NOT IN são usados ​​para filtrar registros de uma tabela com base em um critério específico. Neste artigo, veremos esses operadores em detalhes e investigaremos as diferenças entre eles.

Antes de prosseguirmos, vamos criar alguns dados fictícios que usaremos neste exemplo:

Preparando dados fictícios


Execute o script a seguir para criar um banco de dados fictício e tabelas que usaremos neste artigo.
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
 )

No script acima, criamos um banco de dados ShowRoom com duas tabelas, Cars1 e Cars2.

Vamos adicionar alguns registros fictícios às tabelas Carros1 e Carros2.

Execute o seguinte 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)

Agora temos um conjunto de dados útil.

Vejamos como os operadores EXCEPT e NOT IN diferem entre si usando esses dados.

EXCETO Operador


O operador EXCEPT filtra todos os registros do resultado da consulta à esquerda, que também estão presentes no resultado da consulta à direita e retorna os resultados restantes da consulta à esquerda.

A sintaxe do operador EXCEPT é a seguinte:
Right_Query EXCEPT Left_Query

Existem duas condições que precisam ser atendidas antes da execução do operador EXCEPT. Eles estão:
  • A ordem e o número das colunas retornadas por ambas as consultas devem ser iguais.
  • Os tipos de dados das colunas devem corresponder ou ser compatíveis.

Isso pode parecer complicado. No entanto, o exemplo a seguir deixará isso claro.

Nas tabelas Carros1 e Carros2, os registros com id 6 a id 10 são comuns. Se utilizarmos o operador EXCEPT com registros da tabela Carros1 à esquerda e da tabela Carros2 à direita, serão retornados os registros da tabela Carros1 que não estão em Carros2.
Vamos ver o operador EXCEPT em ação.
USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

O resultado da consulta acima ficará assim:



A consulta do lado esquerdo recupera todos os registros da tabela Carros1 enquanto a do lado direito recupera todos os registros da tabela Carros2. Na tabela Carros1 os registros com id 6 a 10 também estão presentes na tabela Carros2, portanto, o operador EXCEPT retornou apenas as cinco primeiras linhas da tabela Carros1.

Da mesma forma, se você deseja retornar todos os registros da tabela Cars2 que não estão presentes na tabela Cars1, basta mover a tabela Cars2 para a esquerda do operador EXCEPT conforme mostrado na consulta a seguir:
USE ShowRoom
SELECT id, name, company, power FROM  Cars2
Except
SELECT id, name, company, power FROM  Cars1

Usando o operador EXCEPT em uma única mesa


Nos exemplos anteriores, aplicamos o operador EXCEPT em duas tabelas. No entanto, o operador EXCEPT também pode ser usado para filtrar registros de uma única tabela. Por exemplo, se você deseja filtrar todos os registros da tabela Carros1 onde o valor de potência é maior que 3.000, você pode usar o operador EXCEPT da seguinte forma:
USE ShowRoom
SELECT id, name, company, power FROM Cars1 
Except
SELECT id, name, company, power from Cars1 WHERE power < 3000

No script acima, a consulta à esquerda do operador EXCEPT recupera todos os registros da tabela Cars1. A consulta do lado direito do operador EXCEPT recupera apenas os registros da tabela Carros1 onde o valor da potência é menor que 3.000. O operador EXCEPT filtra os registros da consulta à esquerda que existem nos resultados da consulta à direita. Portanto, todos os registros na tabela Cars1 onde a potência for inferior a 3.000 serão filtrados e o restante dos registros será retornado conforme mostrado na saída abaixo:


NOT IN Operador


O operador NOT IN também é usado para filtrar linhas. Vamos encontrar todos os registros da tabela Carros1 que também estão presentes na tabela Carros2 e retornar o restante dos registros usando o operador NOT IN.
USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

O resultado da consulta acima fica assim:



Isso é semelhante aos resultados obtidos usando o operador EXCEPT.

Diferença entre operadores EXCEPT e NOT IN


Podemos ver que os resultados obtidos usando o operador EXCEPT e NOT IN são semelhantes. No entanto, existem duas diferenças principais entre os operadores EXCEPT e NOT IN:

1- NOT IN retorna registros duplicados enquanto EXCEPT retorna somente registros distintos

O operador EXCEPT remove linhas duplicadas dos resultados e retorna apenas registros DISTINCT. Por outro lado, o operador NOT IN retornará registros duplicados.
Vamos dar uma olhada nisso com a ajuda de um exemplo. Execute a seguinte consulta para inserir um registro duplicado na tabela Cars1.
INSERT INTO Cars1

VALUES
(1, 'Corrolla', 'Toyota', 1800)

Agora a tabela Carros1 tem dois registros duplicados. Você pode verificar isso executando a seguinte consulta:
SELECT * FROM Cars1

A tabela Cars1 ficará assim:



Você pode ver que as linhas 1 e 11 são duplicatas uma da outra.

Vamos primeiro usar o operador EXCEPT para filtrar todos os registros da tabela Cars1 que estão presentes na tabela Cars2.
USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

O resultado fica assim:



Você pode ver que, embora as linhas 1 e 11 fossem duplicadas na tabela Cars1 e não estivessem presentes na tabela Cars2, o operador EXCEPT não retornou ambas as linhas. Ele retornou apenas linhas distintas.

Agora vamos usar o operador NOT IN para a mesma tarefa:
USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

A saída da consulta acima é assim:



Você pode ver que NOT IN retorna linhas duplicadas, ou seja, linha 1 e linha 6.

2- EXCEPT compara colunas enquanto NOT IN compara um único valor

O operador EXCEPT compara valores em uma ou mais colunas. Isso significa que o número de colunas deve ser o mesmo. Por outro lado, o operador NOT IN compara valores em uma única coluna.

Por exemplo, você não pode ter um número desigual de colunas para as consultas à esquerda e à direita de um operador EXCEPT, conforme mostrado no exemplo a seguir:
USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name,power FROM Cars2

A consulta acima retorna o seguinte erro:



Para o operador NOT IN, você não pode ter mais de uma coluna na subconsulta. Isso significa que a consulta a seguir retornará um erro:
USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id, name from Cars2)

No script acima, a subconsulta tem duas colunas, ou seja, id e name. Portanto, um erro será lançado:



Leituras adicionais:
  • Escolas W3:Exemplos IN e NOT IN
  • TechontheNet:O operador EXCETO
  • YouTube:o operador EXCEPT