Pular para o conteúdo principal

Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024

Banco de DadosConsultas 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

202312

0,28

202311

0,24

202310

. . .

. . .

. . .

0,2

20037

-0,15

20036

. . .

. . .

. . .

2,25

20031
2,1200212
3,02200211

. . .

. . .

. . .

0,5720011

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.

  1. Aselect * from v1      where salto = max(salto)
  2. Bselect ano, mes, salto from v1      where salto = (select max(salto) from v1)
  3. Cselect ano, mes, salto from v1
  4. Dselect ano, mes, salto from v1      where 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: 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.

  1. 1Calcular salto na view
  2. 2MAX na subconsulta
  3. 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.

Gabarito: letra B

Link permanente: /questoes/fg165267