Pular para o conteúdo principal

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

Banco de DadosSQL
Código
qg162294
Banca
FUNDATEC
Órgão
CRF-RS
Ano
2024
Nível
Superior
Cargo
Programador
Um banco de dados Oracle contém as duas tabelas abaixo, chamadas de tab_a e tab_b, ambas com um campo numérico v:Imagem associada para resolução da questãoUm programador executou um comando SQL e obteve a resposta abaixo:Imagem associada para resolução da questãoQual comando o programador executou?
  1. Aselect tab_a.v from tab_b, tab_a order by a.v desc
  2. Bselect v from tab_b where v = (select v from tab_a) order by 1 desc
  3. Cselect v from tab_b where v in (select v from tab_a) order by v desc
  4. Dselect v from tab_a where v not IN (select v from tab_b) order by 1
  5. Eselect v from tab_b where v not in (select v from tab_a)
Revelar gabarito e comentário

GabaritoC — select v from tab_b where v in (select v from tab_a) order by v desc

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”.

SQL: subconsultas e operadores IN, NOT IN e =

Gabarito: letra C. O comando que produz o resultado exibido é select v from tab_b where v in (select v from tab_a) order by v desc, pois ele retorna apenas os valores da coluna v de tab_b que também existem em tab_a (interseção), ordenados de forma decrescente. A alternativa C é a única que combina corretamente o operador IN (que aceita múltiplos valores) com a ordenação ORDER BY v DESC.

A questão exige compreender o comportamento de três operadores de comparação em subconsultas SQL: =, IN e NOT IN. O operador = só funciona quando a subconsulta retorna exatamente um valor; se retornar mais de um, o banco dispara um erro. Já o IN compara o valor da coluna com cada um dos valores retornados pela subconsulta, funcionando como uma lista de valores permitidos. O NOT IN é o oposto: seleciona os valores que não estão na lista. A pegadinha central está em distinguir quando usar = (subconsulta escalar) de quando usar IN (subconsulta de lista).

Vamos analisar o cenário: temos duas tabelas, tab_a e tab_b, ambas com um campo numérico v. O resultado obtido pelo programador é uma lista de valores que aparecem em ambas as tabelas, ordenada de forma decrescente. Isso indica que o comando deve:

  1. Selecionar valores de tab_b;

  2. Filtrar apenas aqueles que também estão em tab_a (interseção);

  3. Ordenar o resultado em ordem decrescente.

O operador IN é o único que permite comparar com uma lista de valores retornada pela subconsulta. Se usássemos =, a subconsulta precisaria retornar um único valor, o que não é o caso aqui (a menos que as tabelas tenham apenas uma linha, o que não é informado). Portanto, a alternativa C é a correta.

A alternativa A usa um produto cartesiano (FROM tab_b, tab_a) sem condição de junção, o que geraria todas as combinações possíveis entre as linhas das duas tabelas, não apenas a interseção. A alternativa B usa = com uma subconsulta que pode retornar múltiplos valores, causando erro. A alternativa D usa NOT IN e seleciona de tab_a, retornando valores que não estão em tab_b — o oposto do resultado esperado. A alternativa E usa NOT IN e seleciona de tab_b, retornando valores que não estão em tab_a — também o oposto.

Guarde a distinção entre IN e = como o critério decisivo: IN aceita uma lista de valores; = exige um único valor. É exatamente nessa fronteira que as alternativas se dividem.

Alternativa A — ❌ Incorreta

select tab_a.v from tab_b, tab_a order by a.v desc — Esta consulta usa um produto cartesiano entre tab_b e tab_a sem nenhuma condição de junção (WHERE ou ON). Isso significa que cada linha de tab_b será combinada com cada linha de tab_a, gerando todas as combinações possíveis. O resultado seria muito maior que a interseção esperada, e ainda há um erro de sintaxe: o alias a não foi definido (a tabela tab_a não recebeu o alias a). O correto seria tab_a.v ou definir o alias.

Alternativa B — ❌ Incorreta

select v from tab_b where v = (select v from tab_a) order by 1 desc — O operador = exige que a subconsulta retorne exatamente um valor (subconsulta escalar). Se tab_a tiver mais de uma linha, o banco de dados retornará um erro do tipo "single-row subquery returns more than one row". Como não há garantia de que tab_a tenha apenas uma linha, esta alternativa está incorreta. O correto seria usar IN para comparar com uma lista de valores.

Alternativa C — ✅ Correta ⟵ GABARITO

select v from tab_b where v in (select v from tab_a) order by v desc — Esta consulta seleciona os valores de v de tab_b que estão presentes em tab_a (interseção), usando o operador IN que aceita uma lista de valores retornada pela subconsulta. A cláusula ORDER BY v DESC ordena o resultado em ordem decrescente, exatamente como mostrado na resposta obtida pelo programador. É a única alternativa que combina corretamente o filtro de interseção com a ordenação decrescente.

Alternativa D — ❌ Incorreta

select v from tab_a where v not IN (select v from tab_b) order by 1 — Esta consulta seleciona valores de tab_a que não estão em tab_b (diferença), usando NOT IN. O resultado seria o oposto do esperado: em vez da interseção, teríamos os valores exclusivos de tab_a. Além disso, a ordenação ORDER BY 1 ordena pela primeira coluna do resultado, mas não especifica se é crescente ou decrescente (o padrão é crescente), o que não corresponde ao resultado decrescente mostrado.

Alternativa E — ❌ Incorreta

select v from tab_b where v not in (select v from tab_a) — Esta consulta seleciona valores de tab_b que não estão em tab_a (diferença), usando NOT IN. O resultado seria o oposto do esperado: em vez da interseção, teríamos os valores exclusivos de tab_b. Além disso, não há cláusula ORDER BY, então o resultado não estaria ordenado de forma decrescente como mostrado.

NÃO CAIA NESSA!

A banca explora a confusão entre IN e =. O = só funciona com subconsulta escalar (um único valor); o IN aceita uma lista. Muitos candidatos marcam a alternativa B por acharem que = funciona com múltiplos valores, mas isso gera erro no Oracle. Lembre-se: IN é para listas, = é para valor único. Com treino, você identifica essa troca de longe 💪.

PEGA ESSA DICA!

Para resolver questões de subconsulta, verifique primeiro se a subconsulta pode retornar mais de um valor. Se sim, o operador correto é IN (ou NOT IN). Se a subconsulta retorna um único valor (por exemplo, com MAX, MIN, ou uma condição que garanta unicidade), o = é válido. Essa análise rápida elimina várias alternativas de uma vez.

Gabarito: letra C

Link permanente: /questoes/qg162294