Definir operações (SQL) - Set operations (SQL)

As operações de conjunto permitem que os resultados de várias consultas sejam combinados em um único conjunto de resultados . Operadores de conjunto incluem UNION, INTERSECTe EXCEPT.

Operador UNION

No SQL, a UNIONcláusula combina os resultados de duas consultas SQL em uma única tabela de todas as linhas correspondentes . As duas consultas devem resultar no mesmo número de colunas e tipos de dados compatíveis para se unirem. Todos os registros duplicados são removidos automaticamente, a menos que UNION ALLsejam usados.

UNIONpode ser útil em aplicativos de data warehouse onde as tabelas não são perfeitamente normalizadas . Um exemplo simples seria um banco de dados com tabelas sales2005e sales2006estruturas idênticas, mas separados devido a considerações de desempenho. Uma UNIONconsulta pode combinar resultados de ambas as tabelas.

Observe que UNION ALLnão garante a ordem das linhas. As linhas do segundo operando podem aparecer antes, depois ou misturadas com as linhas do primeiro operando. Em situações onde um pedido específico é desejado, ORDER BYdeve ser usado.

Observe que UNION ALLpode ser muito mais rápido do que simples UNION.

Exemplos

Dadas essas duas tabelas:

vendas 2005
pessoa resultar
Joe 1000
Alex 2000
Prumo 5000
vendas 2006
pessoa resultar
Joe 2000
Alex 2000
Zach 35000

Executando esta declaração:

SELECT * FROM sales2005
UNION
SELECT * FROM sales2006;

produz este conjunto de resultados, embora a ordem das linhas possa variar porque nenhuma ORDER BYcláusula foi fornecida:

pessoa resultar
Joe 1000
Alex 2000
Prumo 5000
Joe 2000
Zach 35000

Observe que há duas linhas para Joe porque essas linhas são distintas em suas colunas. Há apenas uma linha para Alex porque essas linhas não são distintas para ambas as colunas.

UNION ALLfornece resultados diferentes, porque não eliminará duplicatas. Executando esta declaração:

SELECT * FROM sales2005
UNION ALL
SELECT * FROM sales2006;

daria esses resultados, novamente permitindo variação pela falta de uma ORDER BYdeclaração:

pessoa resultar
Joe 1000
Joe 2000
Alex 2000
Alex 2000
Prumo 5000
Zach 35000

A discussão de junções externas completas também tem um exemplo que usa UNION.

Operador INTERSECT

O INTERSECToperador SQL obtém os resultados de duas consultas e retorna apenas as linhas que aparecem em ambos os conjuntos de resultados. Para fins de remoção de duplicatas, o INTERSECToperador não faz distinção entre elas NULLs. O INTERSECToperador remove linhas duplicadas do conjunto de resultados final. O INTERSECT ALLoperador não remove linhas duplicadas do conjunto de resultados final, mas se uma linha aparecer X vezes na primeira consulta e Y vezes na segunda, ela aparecerá min (X, Y) vezes no conjunto de resultados.

Exemplo

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

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 1 AND 100

INTERSECT

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 50 AND 200;

EXCETO operador

O EXCEPToperador SQL pega as linhas distintas de uma consulta e retorna as linhas que não aparecem em um segundo conjunto de resultados. Para fins de eliminação de linhas e remoção de duplicatas, o EXCEPToperador não faz distinção entre elas NULLs. O EXCEPT ALLoperador não remove duplicatas, mas se uma linha aparecer X vezes na primeira consulta e Y vezes na segunda, ela aparecerá no máximo (X - Y, 0) vezes no conjunto de resultados.

Notavelmente, a plataforma Oracle fornece um MINUSoperador que é funcionalmente equivalente ao operador padrão SQL [1] . EXCEPT DISTINCT

Exemplo

O exemplo de EXCEPTconsulta a seguir retorna todas as linhas da tabela Pedidos em que Quantidade está entre 1 e 49 e aquelas com uma Quantidade entre 76 e 100.

Escrito de outra maneira; a consulta retorna todas as linhas em que Quantidade está entre 1 e 100, exceto as linhas em que a quantidade está entre 50 e 75.

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 1 AND 100

EXCEPT

SELECT *
FROM   Orders
WHERE  Quantity BETWEEN 50 AND 75;

Exemplo

O exemplo a seguir é equivalente ao exemplo acima, mas sem usar o EXCEPToperador.

SELECT o1.*
FROM (
    SELECT *
    FROM Orders
    WHERE Quantity BETWEEN 1 AND 100) o1
LEFT JOIN (
    SELECT *
    FROM Orders
    WHERE Quantity BETWEEN 50 AND 75) o2
ON o1.id = o2.id
WHERE o2.id IS NULL

Veja também

Referências

links externos