Voltar para a lista de artigos Artigos
6 minutos de leitura

Apresentando os operadores do SQL Set: Union, Union All, Minus, e Intersect

Já ouviu termos como união e interseção em SQL? São exemplos de operadores de conjunto, e são úteis quando você precisa combinar informações de várias tabelas ou consultas. Neste artigo, vamos dar uma olhada mais detalhada neles.

As consultas SQL nos permitem escolher as partes mais importantes a partir de grandes quantidades de informações. Naturalmente, não podemos esperar que todos os dados necessários sejam armazenados em uma única tabela. Digamos que queremos apresentar cada aspecto de algum grupo de dados-chave em uma tabela de resultados (por exemplo, fazer um relatório com os nomes de cada cliente atendido por cada departamento de uma grande empresa). Estes registros podem ser encontrados em muitas tabelas diferentes, portanto precisamos de operadores definidos, como união e interseção em SQL para fundi-los em uma única tabela ou para encontrar elementos comuns.

Durante tais operações, pegamos dois ou mais resultados de declarações SELECT e criamos uma nova tabela com os dados coletados. Fazemos isso utilizando um operador de conjunto SQL. Operadores como MINUS, UNION ou INTERSECT são amplamente utilizados em consultas SQL. Vamos ver como eles funcionam.

As Mesas de Amostra

Suponha que tenhamos um banco de dados muito simples que armazene informações sobre livros e filmes. Ele tem apenas duas tabelas, BOOKS e MOVIESque contêm títulos de livros e filmes (respectivamente) e um número de identificação. Ao olhar para estas tabelas, observe que um título aparece em ambos:

Table: BOOKS
ID Title
1 The Witcher
2 Harry Potter
3 Nineteen Eighty-Four
4 The Great Gatsby

Table: MOVIES
ID Title
1 Iron Man
2 Harry Potter
3 Dr Strange
4 Matrix

O Operador do Conjunto UNION

E se quiséssemos fazer uma tabela com todo o conteúdo do BOOKS e MOVIES tabelas? Este é um momento perfeito para usar UNION set operator.

UNION funde os resultados de duas declarações SELECT. Importante: UNION declarações somente retornam valores UNIQUE. Abaixo, você verá um diagrama Venn representando esta operação e o código que a fará acontecer:

SELECT * FROM BOOKS
UNION
SELECT * FROM MOVIES

Aqui está o resultado:

ID Title
1 The Witcher
2 Harry Potter
3 Nineteen Eighty-Four
4 The Great Gatsby
5 Iron Man
6 Dr Strange
7 Matrix

Todos os títulos de livros e filmes estão agora em uma única tabela. Note que "Harry Potter" - um item que aparece em ambas as tabelas - é mostrado apenas uma vez nos resultados. Como mencionamos anteriormente, o operador do conjunto UNION não retorna valores duplicados.

O operador do set UNION ALL

Você provavelmente adivinhou que UNION ALL é muito semelhante a UNION, mas com uma exceção: UNION ALL retorna todos os dados de todas as tabelas, não importa se é uma duplicata ou não. Vamos fazer a mesma operação como no exemplo da UNION e ver o que obtemos:

SELECT * FROM BOOKS
UNION ALL
SELECT * FROM MOVIES

Resultado:

ID Title
1 The Witcher
2 Harry Potter
3 Nineteen Eighty-Four
4 The Great Gatsby
5 Iron Man
6 Harry Potter
7 Dr Strange
8 Matrix

Desta vez, o pequeno feiticeiro aparece duas vezes na tabela de resultados.

Agora sabemos a principal diferença entre estes dois operadores. Mas quando devemos usar UNION e quando UNION ALL? Primeiramente, saiba que existe uma enorme diferença de eficiência entre eles. Digamos que precisamos fundir dois resultados de consulta que contenham 10.000 elementos cada um. UNION eliminará quaisquer duplicatas e classificará todos os elementos da tabela de resultados. Este processo de classificação leva muito tempo e funciona com um grande número de elementos.

Em resumo, UNION pode ser quatro vezes mais lento que UNION ALL, o que não elimina duplicatas e não classifica os dados. Se não nos importamos com as duplicatas e queremos trabalhar rapidamente, UNION ALL será a solução perfeita. Mas se soubermos que ter elementos únicos é nosso principal objetivo, então UNION será muito mais útil.

O operador do conjunto MINUS

O MINUS é um pouco diferente. Digamos que queremos ver apenas títulos de livros que não sejam também títulos de filmes. Precisamos "menos" tudo do BOOKS tabela que também está na MOVIES mesa. O operador do conjunto MINUS é projetado para este tipo de tarefa.

SELECT * FROM BOOKS
MINUS
SELECT * FROM MOVIES

O resultado:

ID Title
1 The Witcher
2 Nineteen Eighty-Four
3 The Great Gatsby

Agora "Harry Potter" não aparece na tabela de resultados; é o título de um livro e de um filme. Graças ao operador do set MINUS podemos ver apenas os títulos que ocorrem na primeira tabela e que não estão presentes na segunda.

A propósito, alguns bancos de dados usam a palavra-chave EXCEPT ao invés de MINUS. Não se preocupe - a função e os resultados são exatamente os mesmos.

O conjunto INTERSECT Operador

OK, então sabemos como adicionar e subtrair alguns elementos usando os operadores UNION e MINUS. Mas o que devemos fazer se precisarmos saber o que duas perguntas têm em comum?

Este é o papel principal do operador INTERSECT. Vamos ver como funciona.

SELECT * FROM BOOKS
INTERSECT
SELECT * FROM MOVIES

E o resultado:

ID Title
1 Harry Potter

Você já sabe que "Harry Potter" (e somente "Harry Potter") está presente em ambas as tabelas. Portanto, ele é o único elemento na tabela de resultados.

Menos, União, Intersecção em SQL: Dicas Práticas

Há algumas coisas a lembrar sobre menos, união e interseção em SQL:

  1. Se os nomes das colunas ou pseudônimos sendo comparados forem diferentes, a coluna de resultados será chamada após a coluna na primeira consulta SELECT.
  2. Você pode usar os resultados da consulta ou tabelas com operadores definidos.
  3. As colunas que estão sendo comparadas devem ser do mesmo tipo e de igual número.
  4. A tabela de resultados sempre terá colunas de maior precisão.

Os operadores MINUS, UNION e INTERSECT sempre ordenarão os resultados retornados; UNION ALL não o fará. Se quisermos uma determinada ordem ou tipo de ordenação, podemos sempre usar um ORDER BY no final da consulta. Mas tenha em mente que isto irá ordenar toda a consulta! Não podemos usar ORDER BY antes de um operador de SQL set ou tentar ordenar cada SELECT separadamente.

Devemos também mencionar que podemos usar operadores de conjunto como menos, união e interseção em SQL em todos os tipos de consultas. Não precisamos selecionar todos os registros de ambas as tabelas; podemos trabalhar com os resultados das consultas existentes.

É incrível o que podemos fazer com operadores de conjunto como menos, união e interseção em SQL. Graças a eles, podemos facilmente encontrar e apresentar dados interessantes. Obtenha alguma experiência prática no trabalho com operadores de conjuntos SQL e outras funções com LearnSQL.com.br's SQL para Iniciantes curso. Comece uma nova e excitante jornada de dados da maneira correta!