0Pricing
Coding Interview Prep · Aula

Subconsultas com IN, ANY e ALL

Explore subconsultas de associação a conjuntos e a famosa armadilha de NOT IN com NULL.

Subconsultas com IN, ANY e ALL é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 3 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 Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.

Subconsultas de pertencimento a conjuntos

Quando uma subconsulta retorna uma lista de valores, você verifica o pertencimento a ela com IN, ANY ou ALL. É assim que o SQL pergunta este valor pertence a esse conjunto? ou ele é maior que todos os elementos desse conjunto ou que algum deles?

  • IN — corresponde a qualquer valor da lista.
  • ANY/SOME — é verdadeiro se a comparação for válida para pelo menos um elemento.
  • ALL — só é verdadeiro se a comparação for válida para todos os elementos.

IN com uma subconsulta

O caso mais comum: encontre funcionários que trabalham em qualquer departamento localizado em 'NYC'. A subconsulta retorna um conjunto de identificadores de departamentos, e IN mantém as linhas que correspondem a qualquer um deles.

Essa formulação é natural e é a que os entrevistadores esperam ver primeiro.

SELECT name
FROM employees
WHERE dept_id IN (
  SELECT id FROM departments WHERE city = 'NYC'
);

= ANY é o mesmo que IN

Uma equivalência interessante que os entrevistadores apreciam: = ANY (subquery) significa exatamente o mesmo que IN (subquery). Ambas são verdadeiras quando o valor é igual a pelo menos um elemento do conjunto.

A consulta abaixo retorna exatamente o mesmo resultado que a anterior. ANY e seu sinônimo SOME generalizam isso para outros operadores, como > e <.

SELECT name
FROM employees
WHERE dept_id = ANY (
  SELECT id FROM departments WHERE city = 'NYC'
);

ANY com um operador de comparação

ANY se torna poderoso com > ou <. salary > ANY (set) é verdadeiro se o salário for maior que pelo menos um elemento — isto é, maior que o mínimo.

Isso encontra funcionários que ganham mais do que pelo menos uma pessoa no departamento 5.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT salary FROM employees WHERE dept_id = 5
);

ALL com um operador de comparação

salary > ALL (set) só é verdadeiro se o salário for maior que todos os elementos — isto é, maior que o máximo. Isso encontra funcionários que ganham mais do que todas as pessoas do departamento 5.

Memorize o atalho: > ALL = maior que MAX, > ANY = maior que MIN. Os entrevistadores avaliam isso constantemente.

SELECT name, salary
FROM employees
WHERE salary > ALL (
  SELECT salary FROM employees WHERE dept_id = 5
);

NOT IN: a famosa armadilha de NULL

Aqui está a armadilha de subconsultas mais mencionada em entrevistas. Se a subconsulta em um NOT IN retornar até mesmo um NULL, o NOT IN inteiro poderá não retornar nenhuma linha — e não os registros sem correspondência que você esperava.

Por quê? x NOT IN (1, 2, NULL) se expande para x <> 1 AND x <> 2 AND x <> NULL. Essa última comparação é UNKNOWN, portanto o AND nunca pode ser verdadeiro.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
);

Por que essa consulta falha silenciosamente

Se orders.customer_id aceitar NULL e alguma linha tiver um NULL nesse campo, a consulta anterior retornará zero linhas, mesmo quando existirem claramente clientes sem pedidos.

  • A presença de NULL faz a lógica resultar em UNKNOWN.
  • Isso não gera um erro — apenas retorna resultados incorretos (vazios).

Mencionar esse perigo em voz alta durante uma entrevista é um forte indicativo de conhecimento.

Corrigindo NOT IN com NULL

Três correções seguras que os entrevistadores aceitam:

  • Exclua NULLs na subconsulta: adicione WHERE customer_id IS NOT NULL.
  • Reescreva usando NOT EXISTS, que trata NULLs corretamente.
  • Use uma antijunção com LEFT JOIN ... IS NULL.

A versão protegida abaixo retorna a lista verdadeira de clientes sem pedidos.

SELECT name
FROM customers
WHERE id NOT IN (
  SELECT customer_id FROM orders
  WHERE customer_id IS NOT NULL
);

IN funciona bem com NULLs

Um contraponto tranquilizador: um IN simples (não negado) não é prejudicado por NULLs na lista. x IN (1, 2, NULL) é verdadeiro se x for igual a 1 ou 2; o NULL simplesmente nunca encontra correspondência.

O perigo de NULL é específico de NOT IN. Saber a diferença entre os dois casos é exatamente o que distingue uma resposta confiante de um palpite.

IN com várias colunas

Alguns dialetos (Postgres, MySQL) permitem usar IN sobre uma tupla de colunas, comparando pares de uma só vez. Isso encontra linhas de pedidos cuja combinação (produto, região) aparece em uma tabela de promoções.

O SQL Server não oferece IN para valores de linha; nesse caso, você o reescreveria com EXISTS. Mencionar essa limitação de portabilidade impressiona os entrevistadores.

SELECT *
FROM order_lines
WHERE (product_id, region) IN (
  SELECT product_id, region FROM promotions
);

Frase para a entrevista

Diga isto: "IN verifica o pertencimento a conjuntos e é igual a = ANY. Com operadores de comparação, > ANY significa maior que o mínimo e > ALL significa maior que o máximo. A grande armadilha é NOT IN diante de uma subconsulta que pode retornar NULL — ela retorna silenciosamente zero linhas, então faço uma proteção com IS NOT NULL ou mudo para NOT EXISTS."

Essa resposta aborda o pertencimento, a semântica de ANY/ALL e a armadilha de NULL de uma só vez.

Verificação rápida

A armadilha de subconsultas favorita dos entrevistadores.

Revisão

Subconsultas de pertencimento, consolidadas:

  • IN = = ANY: corresponde a qualquer elemento do conjunto.
  • > ANY significa maior que o mínimo; > ALL significa maior que o máximo.
  • NOT IN com um NULL na subconsulta retorna silenciosamente zero linhas — proteja com IS NOT NULL ou use NOT EXISTS.
  • Um IN simples aceita NULLs; IN com várias colunas funciona em alguns dialetos.

A seguir: EXISTS versus IN e a questão de desempenho que os entrevistadores adoram nas entrevistas para cargos seniores.

Perguntas Frequentes

A aula “Subconsultas com IN, ANY e ALL” é grátis?

Sim — o texto completo de “Subconsultas com IN, ANY e ALL” é 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 Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.

O que vou aprender em “Subconsultas com IN, ANY e ALL”?

Explore subconsultas de associação a conjuntos e a famosa armadilha de NOT IN com NULL. Você pratica Coding Interview Prep 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 Coding Interview Prep?

Nenhuma experiência prévia é necessária. Coding Interview Prep 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 3 de 4.

Quanto tempo leva a aula “Subconsultas com IN, ANY e ALL”?

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 Coding Interview Prep?

Sim. Cada aula de Coding Interview Prep 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. Subconsultas escalares em SELECT e WHERE
  2. Subconsultas na cláusula FROM (tabelas derivadas)
  3. Subconsultas com IN, ANY e ALL
  4. Desempenho de EXISTS versus IN
← Voltar para Coding Interview Prep