Trabalhar com conjuntos de linhas
Até agora cada consulta produzia um resultado. Os operadores de
conjuntos combinam os resultados de duas instruções SELECT como se
fossem conjuntos matemáticos. Eles são escritos entre as duas consultas:
SELECT nome FROM produtos
UNION
SELECT nome FROM liquidacao;
Regras comuns a todos
Para combinar duas consultas, ambas devem ter:
- o mesmo número de colunas, e
- tipos compatíveis em cada posição (são pareadas por posição, não por nome).
Os nomes das colunas do resultado vêm da primeira consulta.
UNION vs UNION ALL
UNIONcombina as linhas de ambas e remove os duplicados. Para isso ele precisa comparar e ordenar internamente, então tem um custo extra.UNION ALLcombina e mantém todas as linhas, duplicados incluídos. É mais rápido e é o que você deve usar quando sabe que não há duplicados (ou quando quer contá-los).
SELECT categoria FROM produtos
UNION ALL
SELECT categoria FROM liquidacao;
INTERSECT e EXCEPT
INTERSECTretorna as linhas que aparecem em ambas as consultas (a interseção).EXCEPTretorna as linhas da primeira consulta que não estão na segunda (a subtração de conjuntos). A ordem importa:A EXCEPT Bnão éB EXCEPT A.
SELECT nome FROM produtos
INTERSECT
SELECT nome FROM liquidacao; -- produtos que também estão em liquidação
Como o
UNION, os operadoresINTERSECTeEXCEPTtambém removem duplicados por padrão.
ORDER BY em combinações
Um ORDER BY se aplica ao resultado completo da combinação, por isso ele
vai no final, depois da última consulta (não dentro de cada SELECT):
SELECT nome FROM produtos
UNION
SELECT nome FROM liquidacao
ORDER BY nome; -- ordena TODO o resultado combinado
Exemplos
UNION remove duplicados; UNION ALL os mantém
SELECT categoria FROM produtos
UNION
SELECT categoria FROM liquidacao
ORDER BY categoria;