INTRODUÇÃO

Hoje vamos falar sobre os operadores de conjunto que podemos usar na estrutura de sintaxe do SQL. Esses conjuntos são baseados na teoria de conjuntos da Matemática e retornam um grupo de resultados baseado no operador utilizado.

Os operadores podem ser: Union, Union All, Intersect e Except.

CONCEITUANDO

Operadores de conjunto são usados como forma de agrupar o resultado de duas ou mais tabelas sem usar as operações de joins. 

Quando utilizamos os operadores para criar um resultado, este pode ser único ou múltiplo e dependendo da forma como o operador for declarado, há a exclusão de valores duplicados. Se houver a exclusão de valores duplicados o resultado da query irá retornar apenas um único conjunto .

A forma como os resultados serão comparados e retornados irá depender do tipo de operador utilizado.

Antes de abordamos cada um dos operadores, vamos entender quais são as suas restrições:

  • O ORDER BY  como ordenamento de resultado somente pode ser utilizado na última query, pro resultado final;
  • Cada query possui seu processamento lógico, logo, a ordem das consultas é importante;
  • As queries envolvidas neste tipo de operação devem ter data type igual ou equivalente. Não é possível utilizar uma coluna do tipo Date e comparar com outra do tipo Varchar;
  • Se por um acaso for atribuir novos nomes das colunas para resultado final, este deverá ser atribuído para colunas da primeira query;
  • O número de colunas entre as queries envolvidas devem ser exatamente iguais

NOTA: Cada operador possui dois tipos de atributos que são: DISTINCT & ALL. E podem ser declarados ou operam de forma implícita.

Operadores de união OU Union Operator

A linguagem T-SQL permite que utilizemos o Union para unir duas ou mais tabelas para um ou mais conjuntos de resultados. Esse conjunto irá variar da opção que utilizaremos para este. 

Como dito antes, as opções podem ser o DISTINCT & ALL  e para cada uma delas, o engine do banco opera de acordo retornando o resultado.

Union All

Este operador retorna um multiconjunto de resultados uma vez que não elimina valores duplicados e deve ser declarado ao utilizarmos o comando Union.

Veja um exemplo abaixo onde duas queries são executadas de forma distintas e com resultados separados sendo a query 02 com maior quantidade de linhas retornadas.

Agora veja no próximo exemplo o resultado desta mesma query utilizando o Union All.

Como podemos ver, o resultado da query foi concatenado retornando um múltiplo conjunto

Union distinct

Com o Union distinct  a questão é um pouco diferente a começar que a própria query aplica  o distinct de forma implícita.

Quando utilizamos o distinct, todos os valores duplicados são eliminados do resultado ficando apenas os que aparecem apenas nas duas tabelas.

Desta vez, a query retornou apenas 71 linhas, excluindo todas as duplicatas e vale ressaltar que quando utilizamos o distinct, o resultado passa a ser único e não um multiconjunto.

O próximo exemplo é com o uso do Order by  no ordenamento do resultado final da query. Reparem que ele só pode aparecer na query 02.

Um adendo importante: veja abaixo o plano de execução desta query e como o banco trabalha com as operações de Union. 

Como dito, cada query é executada separadamente e quando a operação é finalizada, o engine do banco realiza uma operação de concatenação de resultado.

E se vocês repararem, a  execução do Order by,  ‘custou’ 60% da query!!!

Um exemplo de como podemos usar o operador Union. No exemplo abaixo, vamos realizar uma operação de select into, utilizando o Union. Veja

Executando o SELECT para conferir o resultado, veja abaixo:

E quando devo usar Union ou Union ALL? 

A recomendação é que seja avaliado caso a caso, por exemplo: Se ao executar a operação de UNION entre duas tabelas e entre essas tabelas você tem certeza que não há valores duplicados, pode executar o Union ALL, do contrário, executar o UNION. Isso é claro, considerando que os valores duplicados não são desejados.

Caso não haja problemas com valores duplicados, mesmo sabendo que eles existirão, o melhor é executar o UNION ALL. Por não ter que realizar um distinct na operação, este se torna mais rápido e menos custoso em questão de recursos para o banco.

Com isso, para o post não ficar grande demais, encerro esta primeira parte abordando apenas a operação de união e suas diferenças e no próximo, irei finalizar abordando as operações de Except e Intersect.