# Operações SET (SQL)

Operações SET, em SQL, são um conjunto de operações realizadas sobre tabelas que se assemelham às operações realizadas sobre conjuntos na teoria dos conjuntos. Entre essas operações estão a união e interseção, que quando aplicadas às tabelas, através dos operadores padrões da SQL, resultam em novas tabelas.
No contexto da SQL, estes operadores combinam dois ou mais comandos SELECT onde o retorno depende operador utilizado.

## Operador UNION

Em SQL a cláusula UNION combina os resultados de duas consultas SQL em uma única tabela para todas as linhas correspondentes. As duas consultas devem resultar no mesmo número de colunas e em tipos de dados compatíveis com o objetivo de unirem-se. Quaisquer registros duplicados são automaticamente removidos a menos que UNION ALL seja usado.
UNION pode ser útil em aplicações de data warehouse onde tabelas não são perfeitamente normalizadas. Um simples exemplo poderia ser um banco de dados com as tabelas vendas2005 e vendas2006 que possuem estruturas idênticas mas são separadas devido às considerações de desempenho. Uma consulta UNION poderia combinar resultados das duas tabelas.
Observe que UNION não garante a ordem das linhas. As linhas do segundo operando pode aparecer antes, depois ou misturadas com as linhas do primeiro operando. Em situações onde uma ordem específica é desejada, ORDER BY deve ser usada.
Observe que UNION ALL pode ser muito mais rápido que UNION.

### Exemplos

Dadas estas duas tabelas:
vendas2005 :
| pessoa | quantia |
| João | 1000 |
| Alex | 2000 |
| Roberto | 5000 |
vendas2006 :
| person | amount |
| João | 2000 |
| Alex | 2000 |
| Isaque | 35000 |
Executando esta declaração:
produz este conjunto de resultados, embora a ordem das linhas podem variar devido a cláusula ORDER BY não ter sido fornecida:
| pessoa | quantia |
| João | 1000 |
| Alex | 2000 |
| Roberto | 5000 |
| João | 2000 |
| Isaque | 35000 |
Observe que há duas linhas para João devido estas linhas serem distintas através de suas colunas. Há apenas uma linha para Alex porque estas linhas não são distintas para as duas colunas.
UNION ALL fornece resultados diferentes, devido ele não eliminar duplicações. Executando esta declaração:
forneceria estes resultados, novamente permitindo variância para a falta de uma declaração ORDER BY:
| pessoa | quantia |
| João | 1000 |
| João | 2000 |
| Alex | 2000 |
| Alex | 2000 |
| Roberto | 5000 |
| Isaque | 35000 |
A discussão de full outer join também possui um exemplo que usa UNION.

## Operador INTERSECT

O operador SQL INTERSECT pega o resultado de duas consultas e retorna apenas as linhas que aparecem em ambos os conjuntos resultantes. Para propósitos de remoção de duplicação o operador INTERSECT não faz distinção entre NULLs. O operador INTERSECT remove linhas duplicadas do conjunto resultante final.

### Exemplo

O exemplo a seguir de consulta INTERSECT retorna todas as linhas da tabela Ordens onde Quantidade está entre 50 e 100.

## Operador EXCEPT

O operador SQL EXCEPT pegas as linhas distintas de uma consulta e retorna as linhas que não aparecem em um segundo conjunto resultante. O operador EXCEPT ALL (não suportado em MSSQL) não remove duplicações. Para propósitos de eliminação de linha e remoção de duplicação, o operador EXCEPT não faz distinção entre NULLs.
Notavelmente, a plataforma Oracle fornece um operador MINUS que é equivalente em funcionalidade ao operador EXCEPT DISTINCT do Padrão SQL.

### Exemplo

No exemplo a seguir a consulta EXCEPT retorna todas as linhas da tabela Ordens onde Quantidade está entre 1 e 49 e aquelas com uma Quantidade entre 76 e 100.
Formulada de outra maneira, a consulta retorna todas as linhas onde a Quantidade está entre 1 e 100, além de linhas onde a quantidade está entre 50 e 75.
Alternativamente, em implementações da linguagem SQL sem o operador EXCEPT, a forma equivalente de um LEFT JOIN onde os valores do lado direito são NULL pode ser usado em vez daquele.

### Exemplo

T/O seguinte exemplo é equivalente ao exemplo acima mas sem utilização do operador EXCEPT.