Abrir menu principal

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 UNIONEditar

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.

ExemplosEditar

Dadas estas duas tabelas:

vendas2005
pessoa quantia
João 1000
Alex 2000
Roberto 5000
vendas2006
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 INTERSECTEditar

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.

ExemploEditar

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 EXCEPTEditar

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]

ExemploEditar

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.

ExemploEditar

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

Ver tambémEditar

Referências

Ligações externasEditar