0Pricing
SQL Academy · Aula

IN versus ANY versus ALL

Compare com conjuntos de valores.

IN versus ANY versus ALL é uma aula grátis de SQL Academy 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 SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

O que são IN, ANY e ALL?

Ao escrever consultas SQL, você frequentemente precisa comparar um valor com um conjunto de valores. SQL oferece três operadores poderosos para isso: IN, ANY e ALL.

Os três podem trabalhar com subconsultas que retornam uma lista de valores. Eles parecem semelhantes, mas se comportam de maneira diferente — escolher o operador correto pode tornar sua consulta muito mais expressiva e eficiente.

O operador IN

O operador IN verifica se um valor corresponde a qualquer valor em uma lista ou no resultado de uma subconsulta. É o mais simples dos três.

O exemplo abaixo recupera funcionários que trabalham nos departamentos de Vendas, HR ou Engenharia.

SELECT name, department
FROM employees
WHERE department IN ('Sales', 'HR', 'Engineering');

IN com uma subconsulta

IN se torna especialmente poderoso quando combinado com uma subconsulta. Em vez de uma lista definida diretamente na consulta, você pode obter os valores de comparação diretamente de outra tabela.

Aqui, encontramos todos os funcionários que pertencem a um departamento com orçamento superior a 100.000.

SELECT name, department
FROM employees
WHERE department IN (
  SELECT dept_name
  FROM departments
  WHERE budget > 100000
);

O operador ANY

ANY (também escrito como SOME) compara um valor com cada valor retornado por uma subconsulta usando um operador de comparação, como =, >, <, >= ou <=.

A condição é verdadeira se a comparação for verdadeira para pelo menos um valor no resultado da subconsulta.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT salary
  FROM employees
  WHERE department = 'HR'
);

= ANY é igual a IN

Uma equivalência importante: = ANY (subquery) é logicamente idêntico a IN (subquery). Ambos retornam verdadeiro quando o valor corresponde a pelo menos um resultado da subconsulta.

Estas duas consultas produzem o mesmo resultado:

-- Using IN
SELECT name FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'NYC');

-- Using = ANY
SELECT name FROM employees
WHERE department_id = ANY (SELECT id FROM departments WHERE location = 'NYC');

O operador ALL

ALL compara um valor com cada valor no resultado de uma subconsulta. A condição é verdadeira somente se a comparação for válida para todos os valores retornados.

Este exemplo encontra funcionários cujo salário é maior que todos os salários da categoria de estagiários — ou seja, eles ganham mais que o estagiário mais bem remunerado.

SELECT name, salary
FROM employees
WHERE salary > ALL (
  SELECT salary
  FROM employees
  WHERE job_grade = 'Intern'
);

ANY e ALL — lado a lado

A principal diferença é a seguinte: ANY exige que a condição seja verdadeira para pelo menos um valor, enquanto ALL exige que ela seja verdadeira para todos os valores.

Pense assim: ANY é como OR aplicado a todas as comparações, e ALL é como AND aplicado a todas as comparações.

-- Returns rows where salary > at least one value in the subquery
SELECT name, salary FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE department = 'Support');

-- Returns rows where salary > every value in the subquery
SELECT name, salary FROM employees
WHERE salary > ALL (SELECT salary FROM employees WHERE department = 'Support');

NOT IN em comparação com &lt;&gt; ALL

Assim como = ANY corresponde a IN, o operador <> ALL é equivalente a NOT IN. Ambos retornam verdadeiro somente quando o valor não corresponde a nenhum valor na subconsulta.

Tenha cuidado, porém — se a subconsulta retornar até mesmo um NULL, NOT IN não retornará linha alguma devido à lógica de três valores do SQL.

-- Using NOT IN
SELECT name FROM employees
WHERE department_id NOT IN (SELECT id FROM departments WHERE location = 'Remote');

-- Using <> ALL (equivalent)
SELECT name FROM employees
WHERE department_id <> ALL (SELECT id FROM departments WHERE location = 'Remote');

A armadilha de NULL com NOT IN

Um detalhe crítico: se a subconsulta usada com NOT IN retornar um NULL, toda a condição NOT IN será avaliada como UNKNOWN para cada linha, retornando um conjunto de resultados vazio.

Para evitar isso, filtre os valores NULL da subconsulta ou use NOT EXISTS, que trata os valores NULL com segurança.

-- Dangerous: if manager_id has any NULL, no rows are returned
SELECT name FROM employees
WHERE id NOT IN (SELECT manager_id FROM employees);

-- Safe: filter NULLs explicitly
SELECT name FROM employees
WHERE id NOT IN (
  SELECT manager_id FROM employees
  WHERE manager_id IS NOT NULL
);

Exemplo prático: encontrando os maiores salários

Vejamos os três operadores aplicados a um cenário realista. Temos uma tabela employees com as colunas name, department e salary.

Queremos funcionários que ganhem mais do que o salário médio de qualquer departamento individual — isto é, mais do que a média de pelo menos um departamento.

SELECT name, salary
FROM employees
WHERE salary > ANY (
  SELECT AVG(salary)
  FROM employees
  GROUP BY department
)
ORDER BY salary DESC;

Quando usar cada um?

Aqui está um guia rápido para escolher entre os três operadores:

  • IN — quando você tem uma lista estática ou precisa de uma correspondência simples por igualdade com uma subconsulta.
  • = ANY — funciona como IN, mas permite usar outros operadores de comparação, como > e <.
  • ALL — quando a condição precisa ser válida para todos os valores (por exemplo, maior que o máximo sem usar MAX).
  • NOT IN — é conveniente, mas tenha cuidado com os valores NULL; prefira NOT EXISTS quando a subconsulta puder conter valores NULL.

Verificação rápida

Teste sua compreensão de IN, ANY e ALL.

Recapitulação da lição

Nesta lição, você aprendeu a comparar valores com um conjunto usando IN, ANY e ALL.

Principais conclusões:

  • IN verifica a pertença — é verdadeiro se o valor corresponder a qualquer elemento da lista ou da subconsulta.
  • = ANY é equivalente a IN; usar outros operadores, como > ANY, significa que a condição será verdadeira para pelo menos uma correspondência.
  • ALL significa que a condição precisa ser válida para todos os valores retornados pela subconsulta.
  • NOT IN retorna silenciosamente nenhuma linha quando a subconsulta contém valores NULL — sempre trate essa possibilidade.
  • Use NOT EXISTS como alternativa mais segura a NOT IN quando puder haver valores NULL.

Perguntas Frequentes

A aula “IN versus ANY versus ALL” é grátis?

Sim — o texto completo de “IN versus ANY versus 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 SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “IN versus ANY versus ALL”?

Compare com conjuntos de valores. 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 3 de 4.

Quanto tempo leva a aula “IN versus ANY versus 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 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. Subconsultas correlacionadas
  2. EXISTS e NOT EXISTS
  3. IN versus ANY versus ALL
  4. Desempenho de EXISTS versus JOIN
← Voltar para SQL Academy