Ao trabalhar com bases de dados Oracle, é comum a necessidade de combinar os resultados de múltiplas consultas SQL. Os operadores SET são ferramnetas poderosas que permitem realizar essa combinação de forma eficiente, seja para obter uniões, interseções ou diferenças entre conjuntos de dados.
Operadores SET
UNION
O operador UNION combina os resultados de duas ou mais consultas SELECT e remove automaticamente quaisquer linhas duplicadas. As colunas selecionadas em cada consulta devem ter o mesmo número e tipos de dados compatíveis.
Exemplo UNION
```
SELECT cod_funcionario, cod_cargo FROM funcionarios UNION SELECT cod_funcionario, cod_cargo FROM historico_cargos;
### UNION ALL
Semelhante ao `UNION`, o operador `UNION ALL` também combina os resultados de consultas `SELECT`. A principal diferença é que `UNION ALL` não remove linhas duplicadas; ele retorna todas as linhas de todas as consultas, incluindo as repetidas.
#### Exemplo UNION ALL
```
SELECT cod_funcionario, cod_cargo, cod_departamento
FROM funcionarios
UNION ALL
SELECT cod_funcionario, cod_cargo, cod_departamento
FROM historico_cargos
ORDER BY cod_funcionario;
INTERSECT
O operador INTERSECT retorna apenas as linhas que são comuns a ambas as consultas SELECT. Ou seja, ele encontra a interseção entre os conjuntos de resultados.
Exemplo INTERSECT
```
SELECT cod_funcionario, cod_cargo FROM funcionarios INTERSECT SELECT cod_funcionario, cod_cargo FROM historico_cargos;
### MINUS
O operador `MINUS` retorna as linhas que estão na primeira consulta `SELECT`, mas não na segunda consulta `SELECT`. Ele calcula a diferença entre os dois conjuntos de resultados.
Por exemplo, se tivermos um conjunto A e um conjunto B, `A MINUS B` retornará todos os elementos que pertencem a A, mas não a B.
#### Exemplo MINUS
```
SELECT cod_funcionario, cod_cargo
FROM funcionarios
MINUS
SELECT cod_funcionario, cod_cargo
FROM historico_cargos;
Considerações sobre Operadores SET
- O número e os tipos de dados das colunas em cada
SELECTdevem ser compatíveis. - Parênteses podem ser usados para controlar a ordem de execução das operações.
- A cláusula
ORDER BYsó pode aparecer uma vez, no final da instrução completa. Ela pode referenciar colunas pelo nome, alias ou posição ordinal da primeira consulta. - Todos os operadores SET, exceto
UNION ALL, removem duplicatas automaticamente. - Os nomes das colunas da saída são determinados pela primeira consulta
SELECT. - Por padrão, os resultados são ordenados pela primeira coluna da primeira consulta em ordem ascendente, exceto para
UNION ALL.
Exemplos Adicionais
Combinação de dados de tabelas diferentes, tratando colunas nulas:
```
SELECT cod_departamento, TO_NUMBER(NULL) AS localizacao, data_contratacao FROM funcionarios UNION SELECT cod_departamento, cod_localizacao, TO_DATE(NULL) FROM departamentos;
Combinando dados numéricos com tratamento de nulos:
```
SELECT cod_funcionario, cod_cargo, salario
FROM funcionarios
UNION
SELECT cod_funcionario, cod_cargo, 0
FROM historico_cargos;
Ordenando resultados usando posição ordinal:
```
SELECT 'sonho' AS "Meu Sonho", 3 AS ordem_interna FROM dual UNION SELECT 'Eu gostaria de ensinar', 1 FROM dual UNION SELECT 'o mundo a', 2 FROM dual ORDER BY 2;