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
, INTERSECT
e EXCEPT
.
Operador UNION
No SQL, a UNION
clá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 ALL
sejam usados.
UNION
pode 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 sales2005
e sales2006
estruturas idênticas, mas separados devido a considerações de desempenho. Uma UNION
consulta pode combinar resultados de ambas as tabelas.
Observe que UNION ALL
nã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 BY
deve ser usado.
Observe que UNION ALL
pode ser muito mais rápido do que simples UNION
.
Exemplos
Dadas essas duas tabelas:
pessoa | resultar |
---|---|
Joe | 1000 |
Alex | 2000 |
Prumo | 5000 |
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 BY
clá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 ALL
fornece 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 BY
declaraçã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 INTERSECT
operador 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 INTERSECT
operador não faz distinção entre elas NULLs
. O INTERSECT
operador remove linhas duplicadas do conjunto de resultados final. O INTERSECT ALL
operador 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 INTERSECT
consulta 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 EXCEPT
operador 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 EXCEPT
operador não faz distinção entre elas NULLs
. O EXCEPT ALL
operador 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 MINUS
operador que é funcionalmente equivalente ao operador padrão SQL [1] .
EXCEPT DISTINCT
Exemplo
O exemplo de EXCEPT
consulta 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 EXCEPT
operador.
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
- Documentação do MSDN sobre UNION em Transact-SQL para SQL Server
- Nomenclatura de itens da lista de seleção em operações definidas
- UNION no MySQL com exemplos
- UNION no MySQL
- Cláusula UNION no PostgreSQL
- SQL UNION e UNION ALL
- Ordem de classificação dentro da instrução UNION
- Projetar um fluxo de dados que carregue uma tabela de warehouse
- Documentação do Oracle 11g para UNION (ALL), INTERSECT e MINUS
- Operadores de conjunto de SQL