Auditor Federal de Finanças e Controle - Área de Tecnologia da Informação (Transformação Digital) - manhã
ATENÇÃO: use a tabela relacional IPCA a seguir para responder
às quatro próximas questões.
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”.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 v1where salto = max(salto)
Bselect ano, mes, salto from v1where salto = (select max(salto) from v1)
Cselect ano, mes, salto from v1
Dselect ano, mes, salto from v1where 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 sobre views: encontrando o maior valor
Gabarito: letra B. Para produzir o ano/mês com o maior salto positivo do índice em relação ao mês anterior, é necessário comparar o valor da coluna salto de cada linha com o valor máximo dessa coluna em toda a view. A alternativa B faz isso corretamente usando uma subconsulta escalar: where salto = (select max(salto) from v1). As demais alternativas ou usam funções de agregação de forma incorreta (fora de um contexto de agrupamento), ou simplesmente não filtram pelo valor máximo.
A questão exige que você entenda dois conceitos fundamentais de SQL: como as funções de agregação (como MAX) funcionam e como uma subconsulta pode ser usada para comparar um valor de cada linha com um valor agregado de toda a tabela. A função MAX(salto) retorna um único valor: o maior valor da coluna salto em todas as linhas da tabela (ou da view, neste caso). Para encontrar a linha (ou linhas) que contém esse valor máximo, você precisa comparar o valor de cada linha com esse resultado agregado.
A forma mais direta e portátil de fazer essa comparação é usar uma subconsulta escalar no WHERE. Uma subconsulta escalar é uma consulta que retorna exatamente um valor (uma linha e uma coluna). No caso, (select max(salto) from v1) retorna o maior valor de salto de toda a view. A consulta externa então seleciona todas as linhas cujo valor de salto seja igual a esse máximo. Como o enunciado admite que pode haver empates, essa abordagem retorna todas as linhas que atingem o valor máximo, o que está correto.
Vamos analisar por que as outras alternativas estão erradas:
Alternativa A: where salto = max(salto) — aqui, MAX(salto) é usada como uma função de agregação diretamente no WHERE, sem uma cláusula GROUP BY. Isso é inválido na maioria dos SGBDs, pois não é permitido usar funções de agregação na cláusula WHERE (a menos que seja em uma subconsulta). O WHERE filtra linhas individuais antes da agregação, então não pode usar o resultado de uma agregação.
Alternativa C: select ano, mes, salto from v1 — esta consulta simplesmente retorna todas as linhas da view, sem qualquer filtro. Ela não encontra o maior salto; apenas lista todos os dados.
Alternativa D: where salto = max(v1.salto) — semelhante à alternativa A, usa MAX como função de agregação diretamente no WHERE, o que é inválido. A qualificação v1.salto não muda o fato de que MAX é uma função de agregação e não pode ser usada dessa forma.
Alternativa E: where salto > 0 — esta consulta filtra apenas os saltos positivos, mas não encontra o maior deles. Ela retornaria todos os meses com salto positivo, não apenas o(s) mês(es) com o maior salto.
A alternativa B é a única que emprega corretamente a subconsulta para comparar cada valor de salto com o valor máximo, retornando assim o(s) ano/mês com o maior salto positivo e o valor do salto.
1Calcular MAX(salto) da view
2Subconsulta escalar no WHERE
3Comparar salto = MAX
4Retornar ano/mês e valor
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
O erro está em usar a função de agregação MAX(salto) diretamente na cláusula WHERE, sem uma subconsulta. A cláusula WHERE filtra linhas individualmente e não pode usar funções de agregação dessa forma. Para usar MAX, seria necessário uma subconsulta, como na alternativa B, ou uma cláusula HAVING (que é usada com GROUP BY).
Alternativa B — ✅ Correta ⟵ GABARITO
Esta alternativa usa uma subconsulta escalar (select max(salto) from v1) para obter o valor máximo da coluna salto. A consulta externa então seleciona todas as linhas onde salto é igual a esse valor máximo. Como o enunciado admite empates, essa abordagem retorna todos os registros que atingem o maior salto, o que está correto.
Alternativa C — ❌ Incorreta
Esta consulta simplesmente seleciona todas as linhas da view v1, sem qualquer filtro. Ela não encontra o maior salto; apenas lista todos os dados, o que não atende ao que foi pedido.
Alternativa D — ❌ Incorreta
Assim como a alternativa A, usa MAX(v1.salto) diretamente na cláusula WHERE, o que é inválido. A qualificação v1.salto não altera o fato de que MAX é uma função de agregação e não pode ser usada dessa forma sem uma subconsulta.
Alternativa E — ❌ Incorreta
Esta consulta filtra apenas os saltos positivos (salto > 0), mas não identifica o maior deles. Ela retornaria todos os meses com salto positivo, não apenas o(s) mês(es) com o maior salto.
NÃO CAIA NESSA!
A banca explora a confusão entre usar uma função de agregação diretamente no WHERE (inválido) e usar uma subconsulta para comparar com o valor agregado (válido). As alternativas A e D parecem corretas à primeira vista, mas são inválidas porque MAX não pode ser usado no WHERE sem uma subconsulta. A alternativa B é a única que faz a comparação corretamente.
PEGA ESSA DICA!
Para encontrar a linha com o valor máximo de uma coluna, lembre-se de que você precisa comparar o valor de cada linha com o valor máximo da coluna. Isso pode ser feito com uma subconsulta escalar no WHERE (como na alternativa B) ou com uma cláusula ORDER BY e LIMIT (em alguns SGBDs). Nunca use MAX diretamente no WHERE sem uma subconsulta.