Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq892787
Banca
FUNDATEC
Órgão
GHC-RS
Ano
2023
Nível
Médio
Cargo
Programador

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: 


Imagem da questão

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);
  1. AImagem associada para resolução da questão
  2. BImagem associada para resolução da questão
  3. CImagem associada para resolução da questão
  4. DImagem associada para resolução da questão
  5. EImagem associada para resolução da questão
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 id nã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.

Gabarito: letra C

Link permanente: /questoes/qq892787