0Pricing
SQL Academy · Aula

IN e NOT IN para conjuntos

Filtre por listas de valores com IN e NOT IN, aprenda a armadilha de NULL em NOT IN e converta para EXISTS para obter uma semântica segura.

IN e NOT IN para conjuntos é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

IN: faça correspondência com uma lista

IN é um atalho para vários ORs:

SELECT * FROM users WHERE country IN ('US', 'CA', 'GB');

-- Equivalent to:
SELECT * FROM users
WHERE country = 'US' OR country = 'CA' OR country = 'GB';

IN com uma subconsulta

Você pode usar uma subconsulta no lado direito:

SELECT * FROM orders
WHERE user_id IN (
  SELECT id FROM users WHERE country = 'US'
);

NOT IN: exclua uma lista

Filtre as linhas correspondentes:

SELECT * FROM users WHERE status NOT IN ('banned', 'deleted');

A armadilha de NULL em NOT IN

Se o lado direito contiver NULL, NOT IN retornará NULL — e as linhas cujo predicado for NULL serão descartadas. Resultado: zero linhas.

-- Suppose blocked_names contains NULL:
SELECT name FROM users
WHERE name NOT IN (SELECT excluded_name FROM blocked_names);
-- → 0 rows, silently

-- Safer: filter out NULLs explicitly, or use NOT EXISTS:
SELECT name FROM users u
WHERE NOT EXISTS (
  SELECT 1 FROM blocked_names b WHERE b.excluded_name = u.name
);

Por que NOT EXISTS é mais seguro

NOT EXISTS usa a semântica padrão de subconsultas correlacionadas e é seguro com NULL. A maioria dos planejadores o otimiza de forma idêntica a um NOT IN bem formulado.

IN versus OR — legibilidade

IN é mais claro do que longas sequências de OR, e o planejador frequentemente o otimiza de forma idêntica:

-- Hard to read:
WHERE country = 'US' OR country = 'CA' OR country = 'GB' OR ...

-- Clear:
WHERE country IN ('US', 'CA', 'GB', ...)

IN com tuplas (construtores de linhas)

Faça correspondência entre pares de colunas:

SELECT * FROM order_items
WHERE (order_id, product_id) IN (
  (1, 42), (2, 99), (3, 17)
);

Uso de índices

Uma lista IN em uma coluna indexada pode ser executada como várias buscas no índice (varredura de índice por bitmap). Em geral, é rápido.

-- Plan: Bitmap Index Scan + Bitmap Heap Scan
SELECT * FROM products WHERE id IN (1, 5, 99, 121, 4421);

Listas IN grandes

Listas com milhares de valores podem ficar lentas. Prefira:

  • JOIN com uma tabela real ou temporária
  • = ANY(array) para passar um parâmetro de matriz
SELECT * FROM products WHERE id = ANY(ARRAY[1,2,3,...]);

IN com lista vazia

Uma lista IN vazia é ilegal no SQL padrão. Alguns clientes passam um marcador sentinela; é mais seguro gerar a condição SQL condicionalmente.

-- Use empty array trick in PostgreSQL:
SELECT * FROM products WHERE id = ANY($1::bigint[]);
-- Pass {} to get zero matches without rewriting the SQL.

IN versus JOIN

Às vezes, um JOIN é mais claro do que uma subconsulta IN:

-- With IN:
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE pro);

-- With JOIN:
SELECT o.*
FROM orders o
JOIN users  u ON u.id = o.user_id
WHERE u.pro;

Recapitulação

IN é a forma amigável de verificar pertencimento a um conjunto.

  • Prefira IN a OR para melhorar a legibilidade
  • NOT IN é perigoso com NULLs — prefira NOT EXISTS
  • Para conjuntos grandes, use JOIN ou passe matrizes

Verificação rápida

Qual é a substituição mais segura para NOT IN (subquery) quando a subconsulta pode conter NULLs?

Perguntas Frequentes

A aula “IN e NOT IN para conjuntos” é grátis?

Sim — o texto completo de “IN e NOT IN para conjuntos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “IN e NOT IN para conjuntos”?

Filtre por listas de valores com IN e NOT IN, aprenda a armadilha de NULL em NOT IN e converta para EXISTS para obter uma semântica segura. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “IN e NOT IN para conjuntos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Padrões e caracteres curinga com LIKE
  2. IN e NOT IN para conjuntos
  3. BETWEEN para intervalos
  4. IS NULL, IS NOT NULL e COALESCE
← Voltar para SQL Academy