UNION, INTERSECT, EXCEPT) #Os resultados de duas consultas podem ser combinados usando as operações de conjunto, união, interseção e diferença. A sintaxe é
consulta1UNION [ALL]consulta2consulta1INTERSECT [ALL]consulta2consulta1EXCEPT [ALL]consulta2
onde consulta1 e
consulta2 são consultas que podem usar
qualquer um dos recursos discutidos até esse ponto.
Efetivamente, UNION anexa o resultado da
consulta2 ao resultado da
consulta1 (embora não haja garantia de que
esta seja a ordem em que as linhas realmente retornam). Além disto,
são eliminadas do resultado as linhas duplicadas, do mesmo modo que
em DISTINCT, a não ser que seja usado
UNION ALL.
INTERSECT retorna todas as linhas presentes tanto
no resultado da consulta1 quanto no
resultado da consulta2. As linhas duplicadas
são eliminadas, a não ser que seja usado INTERSECT ALL.
EXCEPT retorna todas as linhas presentes no
resultado da consulta1, mas que não estão
presentes no resultado da consulta2
(às vezes isto é chamado de diferença entre duas consultas).
Novamente, as linhas duplicadas são eliminadas, a não ser que seja
usado EXCEPT ALL.
Para ser possível calcular a união, a interseção ou a diferença entre duas consultas, as duas consultas devem ser “compatíveis para união”, significando que ambas devem retornar o mesmo número de colunas e que as colunas correspondentes devem possuir tipos de dados compatíveis, conforme descrito na Seção 10.5.
As operações de conjunto podem ser combinadas, como, por exemplo:
consulta1UNIONconsulta2EXCEPTconsulta3
sendo equivalente a:
(consulta1UNIONconsulta2) EXCEPTconsulta3
Conforme mostrado aqui, podem ser usados parênteses para controlar
a ordem de avaliação. Sem parênteses, UNION e
EXCEPT associam da esquerda para a direita, mas
INTERSECT vincula mais firmemente do que esses
dois operadores. Desta forma:
consulta1UNIONconsulta2INTERSECTconsulta3
significa:
consulta1UNION (consulta2INTERSECTconsulta3)
Também pode ser colocada uma consulta
individual entre parênteses.
Isto será importante se a consulta precisar
usar qualquer uma das cláusulas discutidas nas próximas seções, como
LIMIT. Sem parênteses, vai ocorrer um erro de
sintaxe, ou, então, a cláusula será entendida como aplicada à saída
da operação de conjunto, em vez de a uma de suas entradas. Por exemplo:
SELECT a FROM b UNION SELECT x FROM y LIMIT 10
é aceito, mas significa:
(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10
e não:
SELECT a FROM b UNION (SELECT x FROM y LIMIT 10)