Entendendo EXCEPT, INTERSECT e UNION do SQL

Olá pessoas!

Não é de hoje que vejo o pessoal que está iniciando com SQL tendo problemas como EXCEPT, INTERSECT e UNION, ou não sabendo que eles existem. Desta forma, vamos à explicação!

A principal ideia destas cláusulas é ‘somar’ e ‘subtrair’ os registros de duas ou mais consultas.

___

UNION ALL e UNION

Iniciando com o UNION ALL, ele permite unir os registros de duas consultas. No exemplo abaixo, temos a tabela @A com os registros José, Maria e João, e a tabela @B com os registros Maria, Guilherme e Vitória.

Como no caso o registro Maria com ID 2 está presente nas duas tabelas, com UNION ALL, o registro irá se repetir. Caso queira que os registros iguais não se repitam, basta usar UNION, conforme o exemplo abaixo.

Internamente no SQL Server, o que o UNION faz é um UNION ALL seguindo de um DISTINCT, ou seja, as duas consultas abaixo tem o mesmo plano de execução no SQL Server e funcionam da mesma forma.

SELECT ID, NOME FROM @A
UNION
SELECT ID, NOME FROM @B
SELECT DISTINCT ID, NOME
FROM (
	SELECT ID, NOME FROM @A
	UNION ALL
	SELECT ID, NOME FROM @B
) AS C

Plano de execução:

Desta forma, evite usar UNION quando UNION ALL já é o suficiente.

___

EXCEPT

Quando se quer que apareçam os registros da tabela A que não são iguais aos da tabela B, temos a opção de ‘subtrair’ os registros utilizando EXCEPT.

___

INTERSECT

Por fim, o uso de INTERSECT permite uma intersecção entre as consultas. Que diabos é intersecção? Então, seria como exibir somente os registros que as duas consultas têm em comum.

___

Considerações finais

Abaixo a consulta completa deste post:

DECLARE @A TABLE (
	ID INT NOT NULL,
	NOME VARCHAR(10) NOT NULL
)

DECLARE @B TABLE (
	ID INT NOT NULL,
	NOME VARCHAR(10) NOT NULL
)

INSERT @A
VALUES (1, 'José'), (2, 'Maria'), (3, 'João')

INSERT @B
VALUES (2, 'Maria'), (3, 'Guilherme'), (4, 'Vitória')

SELECT Título = 'UNION ALL'

SELECT ID, NOME FROM @A
UNION ALL
SELECT ID, NOME FROM @B

SELECT Título = 'UNION'

SELECT ID, NOME FROM @A
UNION
SELECT ID, NOME FROM @B

SELECT Título = 'EXCEPT'

SELECT ID, NOME FROM @A
EXCEPT
SELECT ID, NOME FROM @B

SELECT Título = 'INTERSECT'

SELECT ID, NOME FROM @A
INTERSECT
SELECT ID, NOME FROM @B

___

Artigos relacionados:

Entendendo os ‘JOIN’s do SQL

Anúncios

13 pensamentos sobre “Entendendo EXCEPT, INTERSECT e UNION do SQL

  1. Simples e direto, assim que é uma boa explicação, sem enrolação pra quem precisa realmente aprender!!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s