Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165267
Banca
FGV
Órgão
STN
Ano
2024
Cargo
AFFC ( )
ATENÇÃO: use a tabela relacional IPCA a seguir para responder à questão.
Tabela IPCA
indice
ano
mes
0,56
2023
12
0,28
2023
11
0,24
2023
10
. . .
. . .
. . .
0,2
2003
7
-0,15
2003
6
. . .
. . .
. . .
2,25
2003
1
2,1
2002
12
3,02
2002
11
. . .
. . .
. . .
0,57
2001
1
A instância da tabela contém os valores do índice IPCA para todos os meses dos anos de 2001 até 2023. Os valores pontilhados representam a continuidade mensal da série. Todas as colunas são numéricas, e não aceitam valores nulos.
No contexto da tabela IPCA, analise o script SQL de criação da view “v1”.
create view v1 as
select ano, mes, salto from (
select y.ano, y.mes, y.indice anterior,
x.indice novo, y.indice - x.indice salto
from ipca x, ipca y
where
((x.ano = y.ano and y.mes = x.mes + 1)
Or (y.ano = x.ano + 1 and
y.mes = 1 and x.mes = 12))
) x
Admitindo que pode haver empates, assinale o comando SQL que emprega corretamente a view v1 para produzir o ano/mês que teve o maior salto positivo do índice em relação ao mês anterior, e o valor do salto.
Aselect * from v1 where salto = max(salto)
Bselect ano, mes, salto from v1 where salto = (select max(salto) from v1)
Cselect ano, mes, salto from v1
Dselect ano, mes, salto from v1 where salto = max(v1.salto)
Eselect ano, mes, salto from v1 where salto > 0
Revelar gabarito e comentário▾
GabaritoB — select ano, mes, salto from v1
where salto = (select max(salto) from v1)
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”.
Consultas SQL: subconsulta com MAX para obter o maior salto
Gabarito: letra B. Para produzir o ano/mês que teve o maior salto positivo do índice em relação ao mês anterior, e o valor do salto, é necessário comparar cada valor de salto com o máximo de todos os saltos. Isso é feito com uma subconsulta escalar: where salto = (select max(salto) from v1). As demais alternativas ou usam funções de agregação em lugar errado (A, D), ou não filtram pelo máximo (C, E).
A questão cobra o uso correto de funções de agregação e subconsultas em SQL. A view v1 calcula, para cada mês (exceto o primeiro da série), o salto do IPCA em relação ao mês anterior. O comando deve retornar apenas a linha (ou linhas, em caso de empate) cujo salto seja o maior valor positivo. Para isso, precisamos comparar o valor de salto de cada linha com o valor máximo de salto em toda a view.
A função MAX é uma função de agregação: ela opera sobre um conjunto de linhas e retorna um único valor. Ela não pode ser usada diretamente na cláusula WHERE de uma consulta simples, porque o WHERE filtra linha a linha, antes da agregação. Para usar o valor máximo como filtro, precisamos de uma subconsulta que calcule esse máximo e o compare com cada valor de salto.
A alternativa B faz exatamente isso: a subconsulta (select max(salto) from v1) retorna o maior salto de toda a view, e a consulta externa seleciona as linhas cujo salto é igual a esse máximo. Como o enunciado admite empates, a subconsulta garante que todas as linhas com o maior salto sejam retornadas, mesmo que haja mais de uma.
1Calcular salto na view
2MAX na subconsulta
3Filtrar WHERE salto = MAX
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
A consulta select * from v1 where salto = max(salto) é inválida porque usa a função de agregação MAX diretamente na cláusula WHERE sem uma subconsulta. O WHERE filtra linha a linha, e MAX é uma função de agregação que opera sobre um conjunto de linhas; não pode ser usada dessa forma em uma consulta simples. Para usar o máximo como filtro, é necessário uma subconsulta, como na alternativa B.
Alternativa B — ✅ Correta ⟵ GABARITO
A consulta select ano, mes, salto from v1 where salto = (select max(salto) from v1) está correta. A subconsulta (select max(salto) from v1) calcula o maior valor de salto em toda a view, e a consulta externa seleciona as linhas cujo salto é igual a esse máximo. Isso retorna o ano/mês (ou anos/meses, em caso de empate) com o maior salto positivo, e o valor do salto. A subconsulta é escalar, retornando um único valor, que é comparado com cada salto da consulta externa.
Alternativa C — ❌ Incorreta
A consulta select ano, mes, salto from v1 simplesmente retorna todas as linhas da view, sem nenhum filtro. Ela não seleciona apenas o maior salto, mas todos os saltos de todos os meses. Portanto, não atende ao requisito de produzir o ano/mês com o maior salto positivo.
Alternativa D — ❌ Incorreta
A consulta select ano, mes, salto from v1 where salto = max(v1.salto) é inválida pelo mesmo motivo da alternativa A: usa a função de agregação MAX diretamente na cláusula WHERE sem uma subconsulta. Além disso, a referência v1.salto é desnecessária, pois salto já é uma coluna da view. A forma correta é usar uma subconsulta para calcular o máximo.
Alternativa E — ❌ Incorreta
A consulta select ano, mes, salto from v1 where salto > 0 retorna todas as linhas com salto positivo, mas não seleciona apenas o maior salto. Ela retorna todos os meses em que o IPCA subiu em relação ao mês anterior, não apenas o mês com o maior salto. Portanto, não atende ao requisito de produzir o ano/mês com o maior salto positivo.