Published on

February 1, 2020

Compreendendo o Operador NOT IN do SQL Server

Você é novo no T-SQL e está se perguntando sobre o operador NOT IN no Microsoft SQL Server? Neste artigo, exploraremos em detalhes a funcionalidade e os casos de uso do operador NOT IN.

O que é o Operador NOT IN?

O operador NOT IN do SQL Server é um operador lógico usado para substituir um grupo de argumentos combinados com o operador <> (ou !=). É comumente usado em comandos SQL SELECT, UPDATE ou DELETE para tornar o código mais legível e compreensível.

Vamos considerar um exemplo:

SELECT * 
FROM Sales.Invoices 
WHERE LastEditedBy <> 11
  AND LastEditedBy <> 17
  AND LastEditedBy <> 13;

Embora essa consulta seja compreensível, ela pode se tornar longa e complicada ao lidar com vários argumentos. É aqui que o operador NOT IN se torna útil.

Usando o Operador NOT IN

O operador NOT IN funciona comparando um valor, geralmente uma coluna, com uma lista separada por vírgulas de valores de correspondência potenciais contidos em um conjunto de parênteses. O valor à esquerda do operador NOT IN é então comparado, um de cada vez, com a lista inteira. Se houver uma correspondência exata com qualquer membro da lista, o argumento é avaliado como falso.

Vamos reescrever a consulta anterior usando o operador NOT IN:

SELECT * 
FROM Sales.Invoices 
WHERE LastEditedBy NOT IN (11, 17, 13);

Essa consulta é funcionalmente equivalente à anterior, mas é mais curta e fácil de ler.

Regras e Melhores Práticas para o NOT IN

Aqui estão algumas regras e melhores práticas importantes a serem lembradas ao usar o operador NOT IN:

  • O operador NOT IN só pode substituir os operadores <> ou !=. Ele não pode substituir =, <, >, <=, >=, BETWEEN ou LIKE.
  • O operador NOT IN encontra e exclui apenas correspondências exatas. Valores duplicados na lista são ignorados.
  • A palavra-chave NOT pode ser colocada no início do argumento ou no operador. Ambas as opções são funcionalmente equivalentes.
  • O operador NOT IN pode ser usado em qualquer lugar em que qualquer outro operador seja usado, incluindo cláusulas WHERE, cláusulas HAVING, declarações IF ou predicados de junção.
  • A lista de valores pode ser definida por uma consulta, abrindo a possibilidade de ter zero valores na lista.
  • Considere usar um OUTER JOIN em vez de uma declaração NOT IN com um grande número de valores para obter melhor desempenho.

Usando NOT IN com Strings, Números e Datas

O operador NOT IN pode ser usado com vários tipos de dados, incluindo strings, números e datas. Aqui estão alguns exemplos:

Usando NOT IN com Strings:

-- Ignorar usuários de teste (Versão AND)
IF @UserName <> 'TrainingUser' AND @UserName <> 'TestUser'
BEGIN
  -- Seu código aqui
END

-- Ignorar usuários de teste (Versão IN)
IF @UserName NOT IN ('TrainingUser', 'TestUser')
BEGIN
  -- Seu código aqui
END

Usando NOT IN com Números:

-- Encontrar pessoas de contas com 6, 8 ou 9 vendas (Versão AND)
SELECT AccountsPersonID, COUNT(*) TotalInvoices
FROM Sales.Invoices 
GROUP BY AccountsPersonID 
HAVING COUNT(*) != 6
  AND COUNT(*) != 8
  AND COUNT(*) != 9;

-- Encontrar pessoas de contas com 6, 8 ou 9 vendas (Versão IN)
SELECT AccountsPersonID, COUNT(*) TotalInvoices
FROM Sales.Invoices 
GROUP BY AccountsPersonID 
HAVING COUNT(*) NOT IN (6, 8, 9);

Usando NOT IN com Datas:

-- Obter número médio de itens pedidos diariamente por cliente para o ano de 2013, excluindo feriados (Versão AND)
SELECT CustomerID, AVG(ItemsPurchased) AverageDay
FROM (
   SELECT CustomerID, InvoiceDate, COUNT(*) ItemsPurchased
   FROM Sales.Invoices
     INNER JOIN Sales.InvoiceLines ON Invoices.InvoiceID = InvoiceLines.InvoiceID
   WHERE InvoiceDate != '25-Dec-2013' 
     AND InvoiceDate != '4-Jul-2013' 
     AND InvoiceDate != '28-Nov-2013'
   GROUP BY CustomerID, InvoiceDate) SubQuery
GROUP BY CustomerID;

-- Obter número médio de itens pedidos diariamente por cliente para o ano de 2013, excluindo feriados (Versão IN)
SELECT CustomerID, AVG(ItemsPurchased) AverageDay
FROM (
   SELECT CustomerID, InvoiceDate, COUNT(*) ItemsPurchased
   FROM Sales.Invoices
     INNER JOIN Sales.InvoiceLines ON Invoices.InvoiceID = InvoiceLines.InvoiceID
   WHERE InvoiceDate NOT IN ('25-Dec-2013', '4-Jul-2013', '28-Nov-2013')
   GROUP BY CustomerID, InvoiceDate) SubQuery
GROUP BY CustomerID;

Considerações de Desempenho

É importante observar que argumentos criados com o operador NOT IN não são propícios a operações de busca de índice e podem resultar em operações de varredura mais lentas. Para otimizar o desempenho, é recomendado usar argumentos NOT IN em conjunto com argumentos adicionais que possam usar índices para reduzir o número de linhas a serem processadas.

Sempre verifique o plano de execução de suas consultas SQL para garantir um desempenho ideal.

Conclusão

O operador NOT IN do SQL Server é uma ferramenta poderosa para substituir vários argumentos combinados com o operador <> ou !=. Ao usar o operador NOT IN, você pode tornar seu código mais legível e conciso. Lembre-se das regras e melhores práticas mencionadas neste artigo para usar efetivamente o operador NOT IN em suas consultas T-SQL.

Artigo Atualizado em: 2023-10-25

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.