21st Jul 2022 9 minutos de leitura O que as cláusulas SQL INTERSECT e MINUS fazem? Andrew Bone sql aprender sql intersect minus Índice SQL INTERSECT SQL MINUS MINUS vs. INTERSECT: Exemplos Mais exemplos de SQL INTERSECT e MINUS Uma tabela é um subconjunto dos dados da outra tabela Ambas as tabelas têm os mesmos dados Uma tabela não contém dados INTERSECT, MINUS e Mais Operadores do Conjunto SQL 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: 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: 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. Tags: sql aprender sql intersect minus