7.4. Combinação de consultas (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 é

consulta1 UNION [ALL] consulta2
consulta1 INTERSECT [ALL] consulta2
consulta1 EXCEPT [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:

consulta1 UNION consulta2 EXCEPT consulta3

sendo equivalente a:

(consulta1 UNION consulta2) EXCEPT consulta3

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:

consulta1 UNION consulta2 INTERSECT consulta3

significa:

consulta1 UNION (consulta2 INTERSECT consulta3)

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)