1. Home
  2. VPS Locaweb
  3. Not In em SQL: o que é e quando usar?

Not In em SQL: o que é e quando usar?

A linguagem SQL é uma ferramenta vital para a manipulação e consulta de dados no vasto mundo dos bancos de dados.

O NOT IN, entre suas várias cláusulas e operadores, é um comando poderoso que permite aos desenvolvedores filtrar resultados de forma precisa.

Este artigo examina o conceito de NOT IN em SQL, examinando sua sintaxe, funcionamento e casos em que seu uso é mais adequado.

Os especialistas em banco de dados podem evitar armadilhas comuns e otimizar suas consultas para obter resultados mais rápidos e precisos ao entender o NOT IN.

O que é o operador “Not IN”

O operador “NOT IN” é uma construção lógica utilizada em linguagens de consulta de bancos de dados, como SQL, para filtrar resultados com base em critérios específicos. Ele permite selecionar registros que não correspondem a determinados valores em uma coluna ou conjunto de valores definidos. 

Quando aplicado em uma consulta, o operador “NOT IN” atua como um filtro negativo, excluindo registros que atendem a certas condições. Ele é especialmente útil quando se deseja realizar consultas que envolvem a exclusão de resultados associados a um conjunto específico de valores. 

Ao utilizar o operador “NOT IN”, é possível especificar uma lista de valores que não devem estar presentes em uma determinada coluna. Isso permite uma flexibilidade significativa na criação de consultas complexas, possibilitando a exclusão precisa de dados indesejados.  

Qual a sua sintaxe?  

A estrutura básica do operador “NOT IN” em uma consulta SQL é a seguinte:

```sql

SELECT coluna1 

FROM tabela1 

WHERE coluna1 NOT IN (valor1, valor2, valor3, ...); 

```

Nesta construção:

– “coluna1” representa a coluna na qual a condição “NOT IN” será aplicada.

– “tabela1” é a tabela da qual os dados estão sendo selecionados.

– “(valor1, valor2, valor3, …)” é uma enumeração de valores que serão excluídos da seleção. Esses valores podem ser constantes, expressões ou até mesmo resultados de subconsultas.

O operador “NOT IN” retorna todas as linhas da tabela “tabela1” onde os valores na coluna “coluna1” não correspondem a nenhum dos valores especificados na lista.

É fundamental notar que os valores entre parênteses após o operador “NOT IN” podem ser uma lista de valores separados por vírgulas, uma subconsulta que retorna uma lista de valores ou até mesmo uma expressão que gera uma lista de valores.

Diferença para o “Not EXISTS”

Quando falamos em consultas em bancos de dados relacionais, é crucial discernir entre os operadores “NOT IN” e “NOT EXISTS”. Embora ambos filtrem resultados com base em condições específicas, suas abordagens são distintas e podem influenciar o desempenho e os resultados das consultas de maneiras diversas.

O operador “NOT IN” exclui resultados que correspondem a valores específicos em uma coluna, comparando os valores da coluna com uma lista fornecida. Os registros com valores correspondentes na lista são eliminados do resultado da consulta. 

Por exemplo, podemos utilizar “NOT IN” para selecionar clientes não associados a determinados códigos de produto:

```

SELECT * 

FROM clientes 

WHERE cliente_id NOT IN (SELECT cliente_id FROM pedidos WHERE codigo_produto IN ('001', '002', '003')); 

```

Por outro lado, o operador “NOT EXISTS” verifica a inexistência de registros em uma subconsulta correlacionada. Em vez de comparar valores diretamente, ele avalia se a subconsulta retorna algum resultado. Se a subconsulta não retornar nenhum resultado, o registro na consulta principal é incluído no resultado final. 

Um exemplo comum é selecionar funcionários sem registros em uma tabela de histórico de avaliações:

```

SELECT * 

FROM funcionarios f 

WHERE NOT EXISTS (SELECT 1 FROM historico_avaliacoes ha WHERE ha.funcionario_id = f.funcionario_id); 

```
  • Quanto ao desempenho, o operador “NOT EXISTS” tende a ser mais eficiente em algumas circunstâncias, especialmente quando a subconsulta retorna um grande volume de registros. Isso ocorre porque o SQL pode otimizar a consulta para parar a execução assim que encontrar um resultado na subconsulta. Por outro lado, o “NOT IN” pode ser menos eficaz, especialmente com listas longas na cláusula, ou na presença de valores nulos, pois cada valor precisa ser comparado individualmente.
  • Em relação ao tratamento de valores nulos, o “NOT IN” pode produzir resultados inesperados, pois o resultado será sempre desconhecido (nulo) se houver um valor nulo na lista, resultando na exclusão de todos os registros, mesmo que haja correspondências válidas. Já o “NOT EXISTS” lida melhor com valores nulos, avaliando a existência de registros na subconsulta sem depender de comparações diretas.
  • Do ponto de vista semântico, enquanto o “NOT IN” compara valores diretamente, o “NOT EXISTS” verifica a existência de registros em uma subconsulta correlacionada, tornando as consultas com este último mais orientadas ao conjunto de dados e menos dependentes de valores específicos.

Por fim, “NOT IN” é útil para comparar diretamente valores, enquanto “NOT EXISTS” é melhor para verificar a existência de registros em subconsultas relacionadas, fornecendo flexibilidade e melhor desempenho em alguns cenários de consulta.

Ao contrário de outras operações comuns em consultas SQL, como “NOT LIKE”, “NOT BETWEEN”, “NOT Less Than” e “NOT GREATER THAN”, elas excluem os resultados com base em critérios específicos, como valores, padrões de texto ou intervalos. Os requisitos da consulta e os critérios de exclusão determinam a escolha entre eles.

Como usar o Not IN em SQL? 

Para usar o operador “NOT IN” em uma consulta SQL, você precisa seguir a seguinte estrutura: 

  1. Selecione a coluna ou colunas desejadas: Comece a consulta indicando quais colunas você deseja selecionar. 
  2. Especifique a tabela: Indique a tabela da qual você está selecionando os dados. 
  3. Aplique a condição “NOT IN”: Utilize a cláusula “WHERE” para aplicar a condição “NOT IN”. Dentro desta cláusula, indique a coluna que você deseja filtrar, seguida do operador “NOT IN”, e uma lista de valores entre parênteses. Esta lista representa os valores que você deseja excluir da seleção. 
  4. Finalize a consulta: Encerre a consulta como de costume. 

Ao usar o operador “NOT IN”, é importante garantir que a lista de valores fornecida seja adequada para a exclusão dos resultados desejados. Esta lista pode conter valores explícitos, expressões ou subconsultas que retornam uma lista de valores. 

Exemplo

alguns exemplos de uso do operador “NOT IN” em consultas SQL: 

Selecionar todos os alunos que não estão matriculados em nenhum dos cursos de matemática: 

SELECT * 
FROM alunos 
WHERE id_aluno NOT IN (SELECT id_aluno FROM matriculas WHERE id_curso = 'Matemática'); 
 

Selecionar todos os funcionários que não estão nos departamentos de vendas ou marketing: 

SELECT * 
FROM funcionarios 
WHERE departamento NOT IN ('Vendas', 'Marketing')

Selecionar todos os produtos que não estão nas categorias de eletrônicos ou vestuário: 

SELECT * 
FROM produtos 
WHERE categoria NOT IN ('Eletrônicos', 'Vestuário')

Selecionar todos os pedidos que não foram feitos por clientes VIP: 

SELECT * 
FROM pedidos 
WHERE id_cliente NOT IN (SELECT id_cliente FROM clientes WHERE status = 'VIP')

Selecionar todos os registros de vendas que não foram feitos em países listados em uma tabela de países restritos: 

SELECT * 
FROM vendas 
WHERE pais_venda NOT IN (SELECT pais FROM paises_restritos)

Esses exemplos demonstram como o operador “NOT IN” pode ser usado para filtrar resultados com base em valores específicos que devem ser excluídos da seleção. Isso proporciona flexibilidade ao criar consultas SQL que atendem a critérios de exclusão específicos.  

Com strings

Em SQL, é comum usar o operador “NOT IN” para filtrar os resultados com base em valores específicos em colunas com strings. Essa operação se torna particularmente relevante quando os dados são armazenados como strings, pois permite a exclusão de resultados com base em padrões de texto específicos.

A sensibilidade a maiúsculas e minúsculas (case-sensitivity) e os caracteres especiais que podem estar presentes nos valores de string devem ser levados em consideração ao usar o operador “NOT IN” com strings. O SGBD (Sistema de Gerenciamento de Banco de Dados) pode ser sensível ou insensível a strings maiúsculas e minúsculas.

O operador “NOT IN” funciona de forma semelhante às colunas numéricas quando usado em colunas de strings. 

Exemplo

Esses exemplos mostram como o operador “NOT IN” pode ser usado em consultas SQL com strings para filtrar resultados de acordo com valores específicos que devem ser excluídos da seleção. Isso permite que você crie consultas que atendem a requisitos de exclusão específicos de dados textuais. 

Selecionar todos os produtos que não são de uma determinada marca: 

SELECT * 
FROM produtos 
WHERE marca NOT IN ('Samsung', 'Apple', 'LG')

Selecionar todos os clientes que não estão em uma lista específica de países: 

SELECT * 
FROM clientes 
WHERE pais NOT IN ('Brasil', 'Estados Unidos', 'Canadá');

Selecionar todos os funcionários que não têm um cargo específico: 

SELECT * 
FROM funcionarios 
WHERE cargo NOT IN ('Gerente', 'Assistente', 'Analista')

Selecionar todos os pedidos que não estão em um estado específico: 

SELECT * 
FROM pedidos 
WHERE estado_pedido NOT IN ('Pendente', 'Em andamento')

Selecionar todos os produtos que não contêm uma palavra-chave específica em seu nome: 

SELECT * 
FROM produtos 
WHERE nome_produto NOT LIKE '%Smartphone%'; 

Com subqueries  

As subconsultas, também conhecidas como subqueries, são consultas que são inseridas dentro de consultas maiores. Isso dá ao SQL uma ferramenta poderosa para realizar operações adaptáveis e complexas em bancos de dados relacionais. Podem ser usados em várias partes de uma consulta SQL, incluindo as cláusulas SELECT, FROM, WHERE, HAVING e até mesmo nas instruções INSERT, UPDATE e DELETE.

É possível realizar operações de negação com precisão e eficiência usando subconsultas e o operador “NOT IN”. Uma cláusula “NOT IN” pode conter subconsultas que fornecem um conjunto de valores que não estão na seleção principal da consulta. Esse recurso é particularmente útil quando se trata de filtrar resultados baseados em critérios específicos que não são facilmente expressos com outras cláusulas SQL.

Exemplo

SELECT * 
FROM clientes 
WHERE id_cliente NOT IN (SELECT id_cliente FROM pedidos)

Selecionar todos os produtos que nunca foram vendidos: 

SELECT * 
FROM produtos 
WHERE id_produto NOT IN (SELECT id_produto FROM vendas)

Selecionar todos os funcionários que não têm avaliações de desempenho: 

SELECT * 
FROM funcionarios 
WHERE id_funcionario NOT IN (SELECT id_funcionario FROM avaliacoes_desempenho)

Esses exemplos demonstram como subconsultas podem ser usadas em conjunto com o operador “NOT IN” para realizar consultas complexas e filtrar resultados com base em critérios específicos de exclusão em bancos de dados relacionais. 

Com números  

Uma prática importante para filtrar resultados com base em critérios específicos é o uso frequente do operador “NOT IN” com números, que é bastante comum em consultas SQL. Ao trabalhar com números em SQL, é fundamental ter em mente o tipo de dados das colunas envolvidas e a maneira como os valores numéricos são comparados.

Pode-se usar o “NOT IN” para colunas que armazenam números, como inteiros ou decimais, bem como para valores numéricos específicos que são apresentados na lista. Ele oferece uma maneira eficaz de filtrar resultados baseados em critérios numéricos, excluindo os resultados que correspondem a esses valores da seleção final da consulta.

Ao aprender os princípios básicos de como o “NOT IN” funciona com números em SQL, desenvolvedores e analistas de dados podem criar consultas mais precisas e eficientes para atender às necessidades de análise e manipulação de dados numéricos em bancos de dados relacionais.

Exemplo

Selecionar todos os produtos que não estão na faixa de preço entre 10 e 100: 

SELECT * 
FROM produtos 
WHERE preco_produto NOT IN (SELECT preco FROM faixa_preco WHERE preco BETWEEN 10 AND 100);

Selecionar todos os clientes que não têm idade entre 18 e 30 anos: 

SELECT * 
FROM clientes 
WHERE idade_cliente NOT IN (18, 19, 20, ..., 30)

Selecionar todos os pedidos que não têm um valor total específico: 

SELECT * 
FROM pedidos 
WHERE valor_total_pedido NOT IN (SELECT valor_total FROM pedidos_anulados)

Esses exemplos ilustram como o operador “NOT IN” pode ser aplicado a valores numéricos em consultas SQL para realizar filtragens precisas com base em critérios específicos de exclusão. 

Com datas  

Operações com datas são comuns em consultas SQL, especialmente quando os resultados devem ser filtrados por critérios temporais. Para análise de dados históricos, agendamento de eventos e gerenciamento de prazos, o uso do operador “NOT IN” permite excluir os resultados correspondentes a datas ou intervalos específicos da seleção final da consulta.

Ao trabalhar com datas em SQL, é fundamental ter em mente o formato adequado para o banco de dados utilizado, bem como a maneira como são comparadas e armazenadas. Isso varia entre vários sistemas de gerenciamento de banco de dados (SGBDs), incluindo MySQL, PostgreSQL e SQL Server. Pode-se usar o operador “NOT IN” para colunas que armazenam datas e valores de datas específicos na lista; isso permite excluir os resultados relacionados a essas datas.

Exemplo 

Selecionar todos os eventos que não ocorreram em uma determinada data: 

SELECT * 
FROM eventos 
WHERE data_evento NOT IN ('2024-04-01', '2024-04-02', '2024-04-03')

Selecionar todos os registros de vendas que não foram realizados no mês passado: 

SELECT * 
FROM vendas 
WHERE data_venda NOT IN (SELECT DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH))

Selecionar todos os compromissos agendados que não estão no próximo mês: 

SELECT * 
FROM compromissos 
WHERE data_compromisso NOT IN (SELECT DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH));

Esses exemplos ilustram como o operador “NOT IN” pode ser aplicado a valores de data em consultas SQL para realizar filtragens precisas com base em critérios temporais específicos de exclusão. 

Regras e boas práticas 

Aqui estão algumas regras e boas práticas a serem seguidas: 

1. Entenda a Estrutura da Consulta

Antes de empregar o operador “NOT IN”, é crucial entender a estrutura da consulta na qual ele será utilizado. Isso inclui identificar as colunas envolvidas na consulta e os critérios de exclusão que serão aplicados. Uma compreensão clara da estrutura da consulta ajuda a garantir a precisão dos resultados. 

2. Verifique a Correlação das Subconsultas

Ao utilizar subconsultas com o operador “NOT IN”, é importante verificar se há correlação adequada entre a subconsulta e a consulta principal. Subconsultas correlacionadas dependem dos valores da consulta principal para fornecer resultados precisos. Isso garante que a lógica da consulta esteja correta e os resultados sejam consistentes. 

3. Considere a Sensibilidade a Maiúsculas e Minúsculas

Em consultas que envolvem strings, é essencial considerar a sensibilidade a maiúsculas e minúsculas. Dependendo do Sistema de Gerenciamento de Banco de Dados (SGBD) utilizado, as comparações de strings podem ser sensíveis ou insensíveis a maiúsculas e minúsculas. Isso pode afetar os resultados da consulta, portanto, verifique e ajuste conforme necessário. 

4. Garanta a Consistência dos Tipos de Dados

Ao aplicar o operador “NOT IN” a valores numéricos, de datas ou de strings, certifique-se de que os tipos de dados são consistentes. Os valores fornecidos na lista após o operador “NOT IN” devem corresponder ao tipo de dados da coluna sendo comparada. Isso evita erros de comparação e garante a precisão dos resultados. 

5. Otimize o Desempenho da Consulta

Para consultas que envolvem grandes conjuntos de dados, é crucial otimizar o desempenho. Considere estratégias alternativas ao operador “NOT IN”, como junções ou subconsultas correlacionadas, dependendo da complexidade da consulta e da estrutura do banco de dados. Isso ajuda a garantir que suas consultas sejam executadas de forma eficiente e rápida. 

Ao adotar as regras e boas práticas para o uso do operador “NOT IN” em consultas SQL, os profissionais de banco de dados e desenvolvedores podem otimizar suas consultas, garantindo resultados precisos e eficientes. Compreender a estrutura da consulta, verificar a correlação das subconsultas e garantir a consistência dos tipos de dados são passos essenciais para garantir a eficácia das consultas. 

Além disso, ao considerar a sensibilidade a maiúsculas e minúsculas e otimizar o desempenho da consulta, os profissionais podem garantir que suas consultas atendam às necessidades de análise de dados de forma eficiente. Ao seguir estas práticas, os usuários podem extrair insights valiosos de seus bancos de dados de forma mais eficaz. 

Se você está buscando opções de hospedagem dedicada para seu banco de dados, a Locaweb – Hospedagem Dedicada oferece soluções robustas e confiáveis. Da mesma forma, se estiver considerando a escalabilidade e flexibilidade de uma Cloud VPS para suas operações de banco de dados, confira a Locaweb – Cloud VPS, que oferece recursos avançados para atender às demandas do seu negócio. 

Combinando as melhores práticas em consultas SQL com uma infraestrutura de hospedagem confiável, você estará preparado para enfrentar os desafios de gerenciamento de dados de forma eficaz e eficiente.

Este artigo foi útil ?

Artigos relacionados