Published on

May 29, 2020

Compreendendo a diferença entre NOT IN e IS NULL no SQL Server

É hora de mais um desafio! Hoje, vamos explorar um quebra-cabeça simples que envolve o uso dos operadores NOT IN e IS NULL em uma consulta T-SQL. Vamos lá!

Considere as duas consultas a seguir:

Consulta 1: IN e IS NOT NULL

SELECT *
FROM [WideWorldImporters].[Sales].[Orders]
WHERE PickedByPersonID IN (
	SELECT PickedByPersonID 
	FROM [WideWorldImporters].[Sales].[Orders]
	WHERE PickedByPersonID IS NOT NULL)

Consulta 2: NOT IN e IS NULL

SELECT *
FROM [WideWorldImporters].[Sales].[Orders]
WHERE PickedByPersonID NOT IN (
	SELECT PickedByPersonID 
	FROM [WideWorldImporters].[Sales].[Orders]
	WHERE PickedByPersonID IS NULL)

Ambas as consultas são executadas no banco de dados de exemplo WideWorldImporters. Você pode baixar este banco de dados de exemplo no link fornecido.

Agora, aqui está a parte interessante. A Consulta 1 retorna 62.972 linhas, enquanto a Consulta 2 retorna 0 linhas. Por que há uma diferença tão significativa no resultado?

Logicamente, ambas as consultas parecem ser iguais. Se você substituir qualquer número na consulta externa ou na subconsulta interna, o resultado deve ser o mesmo. No entanto, há uma diferença crucial que causa essa disparidade.

A resposta para esse quebra-cabeça está na posição da palavra-chave NOT. Ao mover o NOT da subconsulta para a consulta externa, estamos alterando a lógica da consulta. Na Consulta 1, estamos selecionando todas as linhas em que o PickedByPersonID está presente no conjunto de resultados da subconsulta, o que exclui os valores NULL. Por outro lado, a Consulta 2 seleciona todas as linhas em que o PickedByPersonID não está presente no conjunto de resultados da subconsulta, o que inclui os valores NULL.

Portanto, a diferença no conjunto de resultados se deve ao tratamento dos valores NULL. Ao usar o operador NOT IN, os valores NULL são tratados como desconhecidos e a comparação retorna falso. Portanto, na Consulta 2, onde incluímos os valores NULL no conjunto de resultados da subconsulta, a comparação falha para todas as linhas, resultando em um conjunto de resultados vazio.

Agora que resolvemos esse quebra-cabeça, adoraria ouvir seus pensamentos! Deixe sua resposta na seção de comentários abaixo. Todas as respostas permanecerão não publicadas por uma semana, após o que serão publicadas. Como forma de agradecimento, selecionarei aleatoriamente três pessoas que comentaram nesta postagem do blog e fornecerei a elas acesso gratuito de um mês ao SQL Server Performance Tuning Practical Workshop – Recorded Classes.

Se você tiver algum quebra-cabeça ou desafio interessante relacionado ao SQL Server, sinta-se à vontade para enviá-los para mim. Ficarei mais do que feliz em publicá-los neste blog, dando-lhe o devido crédito.

Fique ligado para mais quebra-cabeças e desafios emocionantes!

Atualização (9 de julho de 2020): O vencedor do concurso é Mike Mohanty.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.