Voltar para a lista de artigos Artigos
9 minutos de leitura

O que as cláusulas SQL INTERSECT e MINUS fazem?

Você sabe a diferença entre as cláusulas INTERSECT e MINUS do SQL e como utilizá-las? Você encontrará exemplos e explicações neste artigo.

SQL INTERSECT e MINUS são cláusulas úteis para encontrar rapidamente a diferença entre duas tabelas e encontrar as linhas que elas compartilham.

INTERSECT compara os dados entre tabelas e retorna apenas as linhas de dados que existem em ambas as tabelas.

MINUS compara os dados entre tabelas e retorna as linhas de dados que existem somente na primeira tabela que você especificar.

Tanto SQL INTERSECT quanto MINUS (ou EXCEPT, dependendo do seu dialeto SQL) fazem parte do curso SQL Basics do LearnSQL.com.br.

SQL INTERSECT

O operador SQL INTERSECT é usado para retornar os resultados de duas ou mais declarações SELECT. Entretanto, ele retorna apenas as linhas selecionadas por todas as consultas ou conjuntos de dados. Se existir um registro em uma consulta e não na outra, ele será omitido dos resultados do INTERSECT.

O número e a ordem das colunas devem ser os mesmos em todas as consultas SELECT.

Os tipos de dados das colunas devem ser os mesmos, ou pelo menos compatíveis entre si. INTERSECT filtra as duplicatas e retorna apenas linhas distintas que são comuns entre todas as consultas.

Aqui está a sintaxe para o operador do 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]

Qualquer coisa dentro dos colchetes é inteiramente opcional. O conceito de um INTERSECT é explicado com mais detalhes pelo diagrama a seguir:

INTERSECT

A consulta INTERSECT retornará os registros na área sombreada. Estes são os registros que existem em ambos os conjuntos de dados

INTERSECT é apenas uma forma de fundir os resultados de diferentes consultas SQL. Se você estiver interessado em aprender mais, este artigo cobre os diferentes métodos para combinar os resultados das consultas SQL.

SQL MINUS

A cláusula SQL MINUS é usada para combinar duas declarações SELECT, mas retorna linhas da primeira declaração SELECT que não são retornadas pela segunda declaração SELECT. A SQL MINUS só retorna linhas que não estão disponíveis na segunda instrução SELECT.

Cada instrução SELECT dentro de uma consulta MINUS deve conter o mesmo número de campos nos conjuntos de resultados juntamente com tipos de dados similares.

O operador MINUS não é suportado em todos os bancos de dados SQL. Ele pode ser utilizado em bancos de dados como MySQL e Oracle. Para bancos de dados como SQL Server, PostgreSQL e SQLite, use o 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]

O código SQL mostrado entre parênteses rectos é inteiramente opcional. O conceito de SQL MINUS é explicado mais detalhadamente por este diagrama:

MINUS

A consulta MINUS retornará os registros na área vermelha. Estes são os registros que existem no primeiro conjunto de dados e não no segundo.

MINUS vs. INTERSECT: Exemplos

Vamos aplicar as cláusulas INTERSECT e MINUS a um exemplo prático. Imagine que temos as seguintes tabelas.

customers - Contém detalhes sobre nossos clientes

idcustomer_namecountry
1Infotech SolutionsGermany
2Corpway IndustriesIreland
3Fenway IncEngland
4Fairview LtdFrance

suppliers - Contém detalhes sobre nossos fornecedores.

idcustomer_namecountry
1Carbon Way SuppliersSpain
2Alloy IncFrance
3Materials Delivered LtdIreland
4Concrete CrewPoland
5Conglorito SystemsItaly

Agora vamos escrever uma consulta em INTERSECT. Queremos encontrar os países que nossos fornecedores e clientes têm em comum.

SELECT country
FROM customers
INTERSECT
SELECT country
FROM suppliers

Especificamos a coluna do país em cada cláusula SELECT. A execução desta consulta resulta no conjunto de dados a seguir:

country
France
Ireland

Olhando para trás, o customers e suppliers tabelas, podemos ver que este resultado é correto. Apenas os países da França e da Irlanda são compartilhados entre as tabelas.

Agora vamos aplicar o operador MINUS às mesmas tabelas. Isto nos permitirá colocar os países em nossa customers tabela que não estão em nossa suppliers mesa:

SELECT country
FROM customers
MINUS
SELECT country
FROM suppliers

A execução desta consulta produz o resultado:

country
England
Germany

Aí a temos: os países que são exclusivos de nosso customers mesa. A ordem de suas cláusulas SELECT é muito importante aqui, e é algo que você deve estar atento ao utilizar o operador MINUS. Vamos inverter a ordem de nossas cláusulas SELECT e ver o que acontece.

SELECT country
FROM suppliers
EXCEPT
SELECT country
FROM customers

A execução desta consulta retorna os seguintes dados:

country
Italy
Poland
Spain

Como você pode ver, nosso conjunto de resultados foi muito diferente. SQL começa com nosso suppliers tabela e depois remove quaisquer países que existam na customers mesa.

Se você se sentir sobrecarregado, considere tentar a trilha Fundamentos de SQL da LearnSQL.com, que lhe fornecerá uma base SQL sólida. Ele lhe ensinará instruções SQL básicas como WHERE, GROUP BY, ORDER BY, e HAVING. Você também aprenderá a JOIN tabelas e a adicionar, modificar ou remover dados de um banco de dados.

Este foi um exemplo simples mostrando como os operadores INTERSECT e MINUS podem ser usados para recuperar rapidamente conjuntos de dados distintos. Vejamos mais alguns exemplos que mostram como esses operadores agirão em três cenários diferentes:

  • Uma tabela é o subconjunto dos dados da outra tabela.
  • Ambas as tabelas têm os mesmos dados.
  • Uma tabela em sua consulta não contém dados.

Mais exemplos de SQL INTERSECT e MINUS

Uma tabela é um subconjunto dos dados da outra tabela

Para este cenário, imagine que temos duas mesas chamadas employees e planning_committee. Como você pode ver o planning_committee tabela é um subconjunto de employees, o que significa que todos os seus dados também estão contidos em employees.

employees - Todos os funcionários empregados em nossa empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

planning_committee - Todos os funcionários do comitê de planejamento da nossa empresa.

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Vamos ver como a cláusula INTERSECT se comporta neste cenário.

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM planning_committee

O seguinte conjunto de dados é retornado:

employee_idfirst_namelast_name
415938JaneRamsey
783273AndrewJohnson

Como você pode ver, apenas o subconjunto é devolvido. Isto se deve ao fato de que o planning_committee tabela é um subconjunto do employees tabela; assim, o resultado será simplesmente o planning_committee mesa.

O que acontece se usarmos a cláusula MINUS em seu lugar? Imagine que quiséssemos encontrar todos os funcionários que não faziam parte do comitê de planejamento. Isto pode ser conseguido escrevendo a consulta abaixo:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM planning_committee

A execução desta consulta produz o seguinte resultado:

employee_idfirst_namelast_name
321873JohnSmith
832923ChristinaGrey

Você pode ver que estes funcionários não estão na planning_committee tabela; este é o resultado desejado! Mais uma vez, a ordenação das mesas aqui é importante. Se invertermos a ordem das cláusulas SELECT como esta ...

SELECT employee_id, first_name, last_name
FROM planning_committee
EXCEPT
SELECT employee_id, first_name, last_name
FROM employees

... a execução desta consulta produziria um resultado muito diferente:

employee_idfirst_namelast_name

Uma vez que todos os dados na tabela planning_committee está contida na tabela de employees mesa, nada é devolvido. SQL MINUS retorna apenas dados distintos.

É hora de olhar para nosso próximo cenário.

Ambas as tabelas têm os mesmos dados

Pode haver uma situação em que duas tabelas SQL tenham dados idênticos. Como as cláusulas INTERSECT e MINUS lidam com esta situação, e que resultados você deve esperar? Vamos descobrir!

Para este cenário, utilizaremos as seguintes tabelas:

payroll - Todos os funcionários atualmente na folha de pagamento de nossa empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

employees - Todos os funcionários de nossa empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Você pode ver que todos os funcionários de nossa empresa estão atualmente na folha de pagamento e estão sendo pagos como deveriam. Isto resulta nestas tabelas contendo dados idênticos.

Vejamos como a cláusula INTERSECT lida com este caso:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM payroll

A execução desta consulta retorna este resultado:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

Como todos os dados foram compartilhados entre as duas tabelas, tudo é devolvido!

É hora de ver como a cláusula MINUS lida com tabelas que compartilham dados idênticos:

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM payroll

A execução desta consulta mostra o seguinte resultado:

employee_idfirst_namelast_name

Nenhum dado é devolvido! SQL começa selecionando os dados em nossa employees e depois subtrai os dados que existem na tabela payroll mesa. Neste caso, tudo é retirado.

Isto leva ao nosso cenário final. E se uma das tabelas que faz parte de uma cláusula INTERSECT ou MINUS não contiver dados?

Uma tabela não contém dados

Para este cenário, utilizaremos as seguintes tabelas:

employees - Todos os funcionários empregados em nossa empresa.

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

on_vacation - Todos os funcionários de nossa empresa atualmente em férias.

employee_idfirst_namelast_name

Vamos descobrir como a cláusula INTERSECT lida com uma tabela vazia:

SELECT employee_id, first_name, last_name
FROM employees
INTERSECT
SELECT employee_id, first_name, last_name
FROM on_vacation

O seguinte resultado nos é dado após a execução desta consulta:

employee_idfirst_namelast_name

Nenhum resultado! Quando utilizamos uma tabela vazia como parte da cláusula INTERSECT, obteremos um conjunto de dados vazio. Isto é porque não foi possível encontrar correspondências entre as duas tabelas.

O modo como a cláusula MINUS é afetada pela inclusão de uma tabela vazia depende inteiramente da ordem que você especificar. Por exemplo, esta consulta ...

SELECT employee_id, first_name, last_name
FROM employees
MINUS
SELECT employee_id, first_name, last_name
FROM on_vacation

... produz o seguinte resultado:

employee_idfirst_namelast_name
321873JohnSmith
415938JaneRamsey
783273AndrewJohnson
832923ChristinaGrey

A cláusula MINUS aqui tem muito pouco efeito, pois você essencialmente não está retirando nada (um conjunto de dados vazio) do employees mesa.

Entretanto, se invertermos a ordem das cláusulas SELECT, assim ... ...

SELECT employee_id, first_name, last_name
FROM on_vacation
MINUS
SELECT employee_id, first_name, last_name
FROM employees

.... estamos diante de um resultado muito diferente:

employee_idfirst_namelast_name
Smith

Outro conjunto de dados vazio! Isto ocorre porque a primeira cláusula SELECT recupera os dados da tabela de on_vacation mesa, o que neste caso não é nada. Em seguida, instruímos o SQL para tirar a employees dados de nosso conjunto de dados vazio. Isto não tem efeito, pois o conjunto de dados já está vazio!

INTERSECT, MINUS e Mais Operadores do Conjunto SQL

Neste artigo, cobrimos SQL INTERSECT e MINUS em grandes detalhes. Estes são conhecidos como operadores do conjunto SQL, que também incluem UNION e UNION ALL. Você pode ler uma introdução aos operadores do conjunto SQL aqui, juntamente com como refinar ainda mais os resultados com os operadores do conjunto.