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
- Padrões e caracteres curinga com LIKE
- IN e NOT IN para conjuntos
- BETWEEN para intervalos
- IS NULL, IS NOT NULL e COALESCE