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