Para responder à questão, considere um banco de dados relacional que possui
duas tabelas, chamadas de tabela_a e tabela_b, contendo o formato e os valores abaixo:
Qual o resultado esperado após a execução do comando SQL abaixo?select * from tabela_b where id in (select id_b from tabela_a);
A
B
C
D
E
Revelar gabarito e comentário▾
GabaritoC — [imagem]
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Subconsulta com IN em SQL
Gabarito: letra C. O comando select * from tabela_b where id in (select id_b from tabela_a) retorna as linhas da tabela_b cujo valor da coluna id esteja presente na lista de id_b da tabela_a. Como a subconsulta retorna os valores id_b existentes na tabela_a, o IN filtra a tabela_b para exibir apenas os registros cujo id corresponda a um desses valores — é exatamente o que a alternativa C representa.
O que está acontecendo no comando
A consulta é composta por duas partes: a consulta externa (select * from tabela_b) e a subconsulta (select id_b from tabela_a). A subconsulta é executada primeiro, gerando uma lista de valores da coluna id_b da tabela_a. Em seguida, o operador IN compara o valor da coluna id de cada linha da tabela_b com essa lista: se o valor estiver presente, a linha é incluída no resultado; caso contrário, é descartada.
O IN é um operador de comparação que verifica se um valor pertence a um conjunto de valores. Ele é semanticamente equivalente a uma série de comparações com OR (por exemplo, id = 1 OR id = 2 OR id = 3). Uma característica importante é que o IN não elimina duplicatas da subconsulta — se a subconsulta retornar valores repetidos, eles são tratados como um único valor na comparação, mas isso não afeta o resultado, pois a comparação é de pertinência, não de contagem.
Exemplo prático
Suponha que a tabela_a tenha os seguintes valores na coluna id_b: (1, 3, 5). E a tabela_b tenha as seguintes linhas com id: (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E'). A subconsulta retorna (1, 3, 5). O IN filtra a tabela_b, retornando as linhas com id 1, 3 e 5 — ou seja, (1, 'A'), (3, 'C') e (5, 'E'). As linhas com id 2 e 4 são descartadas porque não estão na lista.
A pegadinha da banca
A banca explora a confusão entre o IN e o NOT IN. Enquanto o IN retorna as linhas que estão na lista, o NOT IN retorna as linhas que não estão na lista. Nesta questão, o comando usa IN, então o resultado são as linhas da tabela_b cujo id está presente na subconsulta. Se o candidato inverter a lógica e pensar que o comando retorna as linhas que não estão na lista, ele marcará a alternativa errada.
Outra pegadinha comum é confundir o IN com um JOIN. O IN é uma subconsulta que filtra linhas, enquanto o JOIN combina colunas de duas tabelas. Nesta questão, o IN não combina colunas — ele apenas usa a subconsulta como uma lista de valores para filtrar a tabela_b.
Distinção entre IN e EXISTS
O IN e o EXISTS são operadores que podem ser usados para filtrar linhas com base em uma subconsulta, mas têm diferenças sutis:
Critério
IN
EXISTS
Comparação
Compara um valor com uma lista de valores
Verifica se a subconsulta retorna pelo menos uma linha
Subconsulta
Retorna uma lista de valores (geralmente uma coluna)
Retorna linhas (a seleção é irrelevante)
Tratamento de NULL
Se a lista contiver NULL, o resultado pode ser indeterminado
Não é afetado por NULL na subconsulta
Desempenho
Pode ser mais lento com listas grandes
Geralmente mais eficiente quando a subconsulta é grande
Nesta questão, o IN é usado corretamente, pois a subconsulta retorna uma lista de valores id_b.
Análise das alternativas
Como as alternativas são imagens, a análise é baseada na descrição do resultado esperado. A alternativa C é a correta, pois representa as linhas da tabela_b cujo id está presente na subconsulta.
Alternativa A — ❌ Incorreta
Provavelmente representa todas as linhas da tabela_b, ignorando o filtro do IN. O comando não retorna todas as linhas — apenas aquelas cujo id está na subconsulta.
Alternativa B — ❌ Incorreta
Provavelmente representa as linhas da tabela_b cujo idnão está na subconsulta, invertendo a lógica do IN para NOT IN. O comando usa IN, então o resultado são as linhas que estão na lista.
Alternativa C — ✅ Correta ⟵ GABARITO
Representa as linhas da tabela_b cujo id está presente na subconsulta select id_b from tabela_a. O IN filtra corretamente, retornando apenas os registros que pertencem à lista.
Alternativa D — ❌ Incorreta
Provavelmente representa um cruzamento entre as duas tabelas, como se fosse um JOIN. O IN não combina colunas — ele apenas filtra linhas com base na pertinência à lista.
Alternativa E — ❌ Incorreta
Provavelmente representa um resultado vazio ou com valores incorretos, talvez por considerar que a subconsulta retorna valores que não existem na tabela_b. O IN retorna as linhas que correspondem, não as que não correspondem.
NÃO CAIA NESSA!
A banca adora inverter a lógica do IN com o NOT IN. Nesta questão, o comando usa IN, então o resultado são as linhas que estão na lista da subconsulta. Se você pensar que o comando retorna as linhas que não estão, cairá na alternativa B. Lembre-se: IN = pertence à lista; NOT IN = não pertence à lista. Com treino, você enxerga essa troca de longe 💪.
PEGA ESSA DICA!
Para resolver questões com subconsulta e IN, execute mentalmente a subconsulta primeiro, anote os valores retornados e depois filtre a tabela externa. Isso evita confusão e garante que você não inverta a lógica.