Questão de Banco de Dados — Consultas e Comandos em SQL — FUNDATEC 2025
Banco de Dados›Consultas e Comandos em SQL
Código
qa698976
Banca
FUNDATEC
Órgão
SBC
Ano
2025
Cargo
POSCOMP ( )
Considere o esquema de relação BEM (id, nome, valor), pertinente aos bens de uma pessoa em um banco de dados. BEM é o nome da relação; o atributo id é a chave primária; os atributos nome e valor referem-se à descrição do bem e ao valor monetário avaliado do bem, respectivamente. Seja V o conjunto de valores distintos dos bens avaliados na relação BEM, onde a cardinalidade de V é superior a 10, analise a expressão SQL abaixo: SELECT id, nome, valor FROM BEM AS B1 WHERE 1 >= ( SELECT COUNT(DISTINCT B2.valor) FROM BEM AS B2 WHERE B2.valor < B1.valor ) A execução dessa expressão resulta no(s) bem(ns) cujo valor da avaliação é igual ao
Amaior valor em V.
Bmaior valor em V ou ao segundo maior valor em V.
Cmenor valor em V.
Dmenor valor em V ou ao segundo menor valor em V.
Emenor valor em V ou ao maior valor em V.
Revelar gabarito e comentário▾
GabaritoD — menor valor em V ou ao segundo menor valor em V.
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”.
Subconsultas correlacionadas e a lógica de ranking no SQL
Gabarito: letra D. A consulta retorna os bens cujo valor é o menor ou o segundo menor valor distinto em V, porque a subconsulta correlacionada conta quantos valores distintos são estritamente menores que o valor da linha externa, e a condição 1 >= seleciona apenas as linhas com 0 ou 1 valores menores — exatamente os dois menores valores distintos.
A consulta usa uma subconsulta correlacionada: para cada linha da tabela externa (B1), a subconsulta interna (B2) é executada de novo, referenciando o valor da linha externa (B1.valor). O COUNT(DISTINCT B2.valor) conta quantos valores distintos em toda a tabela são estritamente menores que o valor da linha atual. A condição 1 >= (ou seja, <= 1) filtra as linhas cuja contagem é 0 ou 1.
Vamos pensar com um exemplo concreto. Suponha que os valores distintos em V sejam: 100, 200, 300, 400, 500 (5 valores, mas a questão diz que são mais de 10 — o raciocínio é o mesmo). Para cada valor, a subconsulta conta quantos valores distintos são menores:
Valor (B1.valor)
COUNT(DISTINCT B2.valor) com B2.valor < B1.valor
Atende 1 >=?
100
0
Sim
200
1 (o 100)
Sim
300
2 (100, 200)
Não
400
3 (100, 200, 300)
Não
500
4 (100, 200, 300, 400)
Não
Perceba o padrão: o menor valor tem 0 valores menores que ele; o segundo menor tem exatamente 1 valor menor. Todos os demais têm 2 ou mais valores menores. A condição 1 >= (contagem menor ou igual a 1) seleciona exatamente o menor e o segundo menor valor distinto.
A pegadinha clássica aqui é inverter a lógica: se a condição fosse 1 <= (ou >= 1), selecionaria todos exceto o menor. Mas com 1 >=, o filtro é sobre a quantidade de valores menores, não sobre o valor em si. É uma forma elegante de implementar um "top 2" pelo menor lado, sem usar ORDER BY e LIMIT.
Guarde o critério decisivo: a contagem de valores menores que o atual — é ela que posiciona cada linha no ranking, e é nela que as alternativas se dividem.
1Menor valor
2Segundo menor
3Terceiro menor
4Demais valores
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Afirma que retorna apenas o maior valor em V. Isso seria verdade se a condição fosse 1 >= sobre a contagem de valores maiores que o atual (ou seja, o maior tem 0 maiores, o segundo maior tem 1, etc.). Mas a subconsulta conta valores menores (B2.valor < B1.valor), então o maior valor teria a maior contagem de menores — e seria justamente o excluído pela condição 1 >=.
Alternativa B — ❌ Incorreta
Afirma que retorna o maior ou o segundo maior valor. Mesmo erro da alternativa A: a subconsulta conta valores menores, não maiores. O maior valor tem o maior número de valores menores que ele, então nunca atenderia 1 >=. A lógica de "maior ou segundo maior" exigiria contar valores maiores que o atual.
Alternativa C — ❌ Incorreta
Afirma que retorna apenas o menor valor em V. O menor valor tem 0 valores menores que ele, então atende 1 >=. Mas o segundo menor também atende, pois tem exatamente 1 valor menor. A condição 1 >= inclui ambos (0 e 1), não apenas o caso 0. A alternativa ignora o segundo menor.
Alternativa D — ✅ Correta ⟵ GABARITO
A condição 1 >= seleciona linhas cuja contagem de valores distintos menores é 0 ou 1. O menor valor tem 0 valores menores; o segundo menor tem exatamente 1. Portanto, retorna exatamente o menor e o segundo menor valor distinto em V. É a implementação clássica de "top 2" pelo lado inferior, usando subconsulta correlacionada.
Alternativa E — ❌ Incorreta
Afirma que retorna o menor ou o maior valor. O menor valor atende (0 menores), mas o maior valor tem o maior número de valores menores que ele — nunca atenderia 1 >=. A alternativa mistura os dois extremos sem considerar a lógica da contagem de valores menores.
NÃO CAIA NESSA!
A banca explora a inversão da lógica de comparação. O candidato apressado lê 1 >= e pensa em "maior valor" (como se fosse um MAX), mas a subconsulta conta valores menores (B2.valor < B1.valor). O segredo é sempre perguntar: "menores que o quê?" — e a resposta é "menores que o valor da linha externa". Isso posiciona a consulta no lado inferior do ranking, não no superior.
PEGA ESSA DICA!
Para resolver subconsultas correlacionadas de ranking, monte uma tabela mental com valores de exemplo e calcule a contagem para cada um. O padrão é sempre: o menor tem 0 menores, o segundo menor tem 1, o terceiro tem 2, e assim por diante. A condição N >= seleciona os N+1 menores valores distintos. Com treino, você enxerga esse padrão de longe 💪