Operações SET (SQL)
Operações SET, em SQL, são um conjunto de operações realizadas sobre tabelas que se assemelham às operações realizadas sobre conjuntos na teoria dos conjuntos. Entre essas operações estão a união e interseção, que quando aplicadas às tabelas, através dos operadores padrões da SQL, resultam em novas tabelas.
No contexto da SQL, estes operadores combinam dois ou mais comandos SELECT
onde o retorno depende operador utilizado.[1]
Operador UNION
[editar | editar código-fonte]Em SQL a cláusula UNION
[2] combina os resultados de duas consultas SQL em uma única tabela para todas as linhas correspondentes. As duas consultas devem resultar no mesmo número de colunas e em tipos de dados compatíveis com o objetivo de unirem-se. Quaisquer registros duplicados são automaticamente removidos a menos que UNION ALL
seja usado.
UNION
pode ser útil em aplicações de data warehouse onde tabelas não são perfeitamente normalizadas. Um simples exemplo poderia ser um banco de dados com as tabelas vendas2005
e vendas2006
que possuem estruturas idênticas mas são separadas devido às considerações de desempenho. Uma consulta UNION
poderia combinar resultados das duas tabelas.
Observe que UNION
não garante a ordem das linhas. As linhas do segundo operando pode aparecer antes, depois ou misturadas com as linhas do primeiro operando. Em situações onde uma ordem específica é desejada, ORDER BY
deve ser usada.
Observe que UNION ALL
pode ser muito mais rápido que UNION
.
Exemplos
[editar | editar código-fonte]Dadas estas duas tabelas:
pessoa | quantia |
---|---|
João | 1000 |
Alex | 2000 |
Roberto | 5000 |
person | amount |
---|---|
João | 2000 |
Alex | 2000 |
Isaque | 35000 |
Executando esta declaração:
SELECT * FROM vendas2005
UNION
SELECT * FROM vendas2006;
produz este conjunto de resultados, embora a ordem das linhas podem variar devido a cláusula ORDER BY
não ter sido fornecida:
pessoa | quantia |
---|---|
João | 1000 |
Alex | 2000 |
Roberto | 5000 |
João | 2000 |
Isaque | 35000 |
Observe que há duas linhas para João devido estas linhas serem distintas através de suas colunas. Há apenas uma linha para Alex porque estas linhas não são distintas para as duas colunas.
UNION ALL
fornece resultados diferentes, devido ele não eliminar duplicações. Executando esta declaração:
SELECT * FROM vendas2005
UNION ALL
SELECT * FROM vendas2006;
forneceria estes resultados, novamente permitindo variância para a falta de uma declaração ORDER BY
:
pessoa | quantia |
---|---|
João | 1000 |
João | 2000 |
Alex | 2000 |
Alex | 2000 |
Roberto | 5000 |
Isaque | 35000 |
A discussão de full outer join também possui um exemplo que usa UNION
.
Operador INTERSECT
[editar | editar código-fonte]O operador SQL INTERSECT
pega o resultado de duas consultas e retorna apenas as linhas que aparecem em ambos os conjuntos resultantes. Para propósitos de remoção de duplicação o operador INTERSECT
não faz distinção entre NULLs. O operador INTERSECT
remove linhas duplicadas do conjunto resultante final.
Exemplo
[editar | editar código-fonte]O exemplo a seguir de consulta INTERSECT
retorna todas as linhas da tabela Ordens onde Quantidade está entre 50 e 100.
SELECT *
FROM Ordens
WHERE Quantidade BETWEEN 1 AND 100
INTERSECT
SELECT *
FROM Ordens
WHERE Quantidade BETWEEN 50 AND 200;
Operador EXCEPT
[editar | editar código-fonte]O operador SQL EXCEPT
pegas as linhas distintas de uma consulta e retorna as linhas que não aparecem em um segundo conjunto resultante. O operador EXCEPT ALL
(não suportado em MSSQL) não remove duplicações. Para propósitos de eliminação de linha e remoção de duplicação, o operador EXCEPT
não faz distinção entre NULLs.
Notavelmente, a plataforma Oracle fornece um operador MINUS
que é equivalente em funcionalidade ao operador EXCEPT DISTINCT
do Padrão SQL.[1]
Exemplo
[editar | editar código-fonte]No exemplo a seguir a consulta EXCEPT
retorna todas as linhas da tabela Ordens onde Quantidade está entre 1 e 49 e aquelas com uma Quantidade entre 76 e 100.
Formulada de outra maneira, a consulta retorna todas as linhas onde a Quantidade está entre 1 e 100, além de linhas onde a quantidade está entre 50 e 75.
SELECT *
FROM Ordens
WHERE Quantidade BETWEEN 1 AND 100
EXCEPT
SELECT *
FROM Ordens
WHERE Quantidade BETWEEN 50 AND 75;
Alternativamente, em implementações da linguagem SQL sem o operador EXCEPT
, a forma equivalente de um LEFT JOIN
onde os valores do lado direito são NULL
pode ser usado em vez daquele.
Exemplo
[editar | editar código-fonte]T/O seguinte exemplo é equivalente ao exemplo acima mas sem utilização do operador EXCEPT
.
SELECT o1.*
FROM (
SELECT *
FROM Ordens
WHERE Quantidade BETWEEN 1 AND 100) o1
LEFT JOIN (
SELECT *
FROM Ordens
WHERE Quantidade BETWEEN 50 AND 75) o2
ON o1.id = o2.id
WHERE o2.id IS NULL