SQL - SQL UNION e UNION ALL - Conceitos


O objetivo do comando SQL UNION é combinar os resultados de duas consultas.

Você usa uma consulta UNION quando você quer combinar duas colunas similares a partir tabelas que não estão relacionadas - que não são unidas diretamente.

Em uma consulta UNION todas as colunas correspondentes devem possuir o mesmo tipo de dados.

Assim para utilizar o operador UNION, o número e a ordem das colunas precisam ser idênticos em todas as consultas e os tipos de dados (data types) precisam ser compatíveis.

Quando você usa uma consulta UNION apenas são selecionados os valores diferentes. (Igual a um SELECT DISTINCT).

Veja este exemplo que estamos executando no ambiente do Visual Basic 2010 Express Edition usando a janela Database Explorer;

Temos uma conexão com o banco de dados Cadastro.mdf e duas tabelas: Contratados e Funcionarios com estruturas diferentes.

1- Estrutura da tabela Contratados:

2- Estrutura da tabela Funcionarios:

A tabela Contratados possui os seguintes dados:

A tabela Funcionarios possui os seguintes dados:

Na consulta UNION :

SELECT id, nome, salario
FROM Contratados
UNION
SELECT id, nome, salario
FROM Funcionarios

Estamos combinando o resultado de duas consultas SELECT usando o operador UNION.

Note que nos dois SELECTs estamos usando as colunas que possuem o mesmo tipo de dados:

O resultado obtido mostra a combinação dos dois comandos SELECTs onde a coluna id é ordenada em ordem ascendente.

Veja o resultado da consulta UNION usando apenas as colunas nome e salario:

Note que a ordenação ocorre pela primeira coluna de forma automática.

Podemos usar a mesma tabela para realizar uma consulta UNION e efetuar cálculos usando as funções Agregadas:

Na consulta UNION a seguir:

SELECT nome, salario
FROM Funcionarios
UNION
SELECT 'z_SalarioTotal:', SUM(salario)
FROM Funcionarios

Estamos calculando o valor total dos salários da tabela Funcionarios.

Observe que eu tive que usar um artifício para que o nome da coluna calculada fosse exibida no final do resultado devido à ordenação automática que ocorre:

Existem também o operador UNION ALL.

O objetivo do comando SQL UNION ALL também é combinar os resultados de duas consultas.

O operador UNION ALL tem a mesma funcionalidade do UNION, porém, não executa o SELECT DISTINCT no result set final e apresenta todas as linhas, inclusive as linhas duplicadas.

Para mostrar essa funcionalidade vamos alterar o valor coluna nome da tabela Contratados cujo código é 4 de Marcos Bueno para Miriam. Ficaremos então com os seguintes dados:

Dessa forma teremos o mesmo id e o mesmo nome tanto na tabela Funcionarios como na tabela Contratados:

Veja agora o resultado usando UNION:

Os registros duplicados não são retornados.

Vejamos agora mesma consulta usando UNION ALL:

São retornados TODOS os registros mesmo os duplicados.

Mat 4:12 Ora, ouvindo Jesus que João fora entregue, retirou-se para a Galiléia;

Mat 4:13 e, deixando Nazaré, foi habitar em Cafarnaum, cidade marítima, nos confins de Zabulom e Naftali;

Mat 4:14 para que se cumprisse o que fora dito pelo profeta Isaías:

Mat 4:15 A terra de Zabulom e a terra de Naftali, o caminho do mar, além do Jordão, a Galiléia dos gentios,

Mat 4:16 o povo que estava sentado em trevas viu uma grande luz; sim, aos que estavam sentados na região da sombra da morte, a estes a luz raiou.

Mat 4:17 Desde então começou Jesus a pregar, e a dizer: Arrependei- vos, porque é chegado o reino dos céus.

Referências:


José Carlos Macoratti