Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg086784
Banca
FGV
Órgão
MF
Ano
2024
Nível
Superior
Cargo
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.

Imagem da questão


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”.Imagem associada para resolução da questãoAdmitindo 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.
  1. Aselect * from v1where salto = max(salto)
  2. Bselect ano, mes, salto from v1where salto = (select max(salto) from v1)
  3. Cselect ano, mes, salto from v1
  4. Dselect ano, mes, salto from v1where salto = max(v1.salto)
  5. 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.

  1. 1Calcular MAX(salto) da view
  2. 2Subconsulta escalar no WHERE
  3. 3Comparar salto = MAX
  4. 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.

Gabarito: letra B

Link permanente: /questoes/fg086784