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
fg165230
Banca
FGV
Órgão
ALETO
Ano
2024
Cargo
Ana Leg ( )

Considere uma tabela fictícia que registre as doações recebidas por projetos sociais de uma determinada prefeitura, criada com o seguinte comando SQL:

 

CREATE TABLE doacoes (

SiglaProjeto text,

DataDoacao text,

Valor REAL,

DocumentoDoador text,

NomeDoador text);

 

Considere, ainda, que uma certa consulta SQL produziu a seguinte saída:

 

SiglaProjeto                       total_recebido

------------                                ------------

PA                                  57865.01

PB                                  37199.87

PC                                  18025.90

PD                                  17828.83

PE                                  8201.47

 

Assinale a opção que indica, corretamente, a consulta que poderia ter produzido a saída acima.

  1. ASELECT SiglaProjeto, count(valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido DESC LIMIT 5.
  2. BSELECT SiglaProjeto, sum(Valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido DESC LIMIT 5.
  3. CSELECT SiglaProjeto, sum(Valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido LIMIT 5.
  4. DSELECT SiglaProjeto, count(valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido LIMIT 5.
  5. ESELECT SiglaProjeto, total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido DESC LIMIT 5.
Revelar gabarito e comentário

GabaritoB — SELECT SiglaProjeto, sum(Valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido DESC LIMIT 5.

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: Agregação com GROUP BY, ORDER BY e LIMIT

Gabarito: letra B. A consulta correta é SELECT SiglaProjeto, sum(Valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido DESC LIMIT 5;, pois a saída apresenta a soma dos valores (sum) agrupada por projeto (GROUP BY), ordenada de forma decrescente (ORDER BY ... DESC) e limitada a 5 linhas (LIMIT 5). As demais alternativas ou usam count (que contaria registros, não somaria valores), ou omitem o DESC (invertendo a ordem), ou referenciam um alias inexistente na cláusula GROUP BY.

A questão testa o domínio das cláusulas de uma consulta SQL de agregação. Vamos decompor o que cada parte faz:

  1. SELECT SiglaProjeto, sum(Valor) as total_recebido: projeta a coluna SiglaProjeto e a soma dos valores da coluna Valor, dando a essa soma o apelido (alias) total_recebido. A função SUM é uma função de agregação que retorna a soma de um conjunto de valores.

  2. FROM doacoes: indica a tabela de origem dos dados.

  3. GROUP BY SiglaProjeto: agrupa as linhas da tabela pelos valores distintos da coluna SiglaProjeto. Para cada grupo, a função SUM(Valor) é calculada. Sem o GROUP BY, a função de agregação atuaria sobre todas as linhas da tabela, retornando uma única linha.

  4. ORDER BY total_recebido DESC: ordena o resultado final pela coluna total_recebido (o alias criado no SELECT) em ordem decrescente (DESC). Isso faz com que o maior valor apareça primeiro, o que é consistente com a saída apresentada (PA com 57865.01, depois PB, PC, PD e PE).

  5. LIMIT 5: restringe o resultado às 5 primeiras linhas, que são exatamente as 5 linhas da saída.

A saída mostra valores como 57865.01, 37199.87, etc., que são somas de múltiplas doações, não contagens. Se fosse count(Valor), a saída mostraria números inteiros (quantidade de doações por projeto), não valores com casas decimais. Além disso, a ordem decrescente é essencial para que PA (maior valor) apareça primeiro.

A pegadinha central está na distinção entre SUM e COUNT e na presença/ausência do DESC. A banca explora exatamente esses dois pontos para criar distratores.

  1. 1SELECT SiglaProjeto, sum(Valor)
  2. 2FROM doacoes
  3. 3GROUP BY SiglaProjeto
  4. 4ORDER BY total_recebido DESC
  5. 5LIMIT 5
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Usa count(valor) em vez de sum(Valor). A função COUNT conta o número de registros (linhas) em cada grupo, não soma os valores. A saída esperada apresenta somas (57865.01, 37199.87, etc.), que são valores decimais, não contagens inteiras. Portanto, o uso de count produziria uma saída com números inteiros (quantidade de doações por projeto), incompatível com a apresentada.

Alternativa B — ✅ Correta ⟵ GABARITO

Esta é a consulta que produz exatamente a saída: SELECT SiglaProjeto, sum(Valor) as total_recebido FROM doacoes GROUP BY SiglaProjeto ORDER BY total_recebido DESC LIMIT 5;. Ela soma os valores (sum(Valor)), agrupa por projeto (GROUP BY SiglaProjeto), ordena do maior para o menor (ORDER BY total_recebido DESC) e limita a 5 linhas (LIMIT 5). Todos os elementos da saída (valores decimais, ordem decrescente, 5 linhas) são atendidos.

Alternativa C — ❌ Incorreta

Usa sum(Valor) corretamente, mas omite o DESC no ORDER BY. Sem DESC, a ordenação é ascendente (padrão), ou seja, do menor para o maior valor. A saída apresentada está em ordem decrescente (PA com 57865.01 é o maior, PE com 8201.47 é o menor). Portanto, sem DESC, a ordem seria invertida, não correspondendo à saída.

Alternativa D — ❌ Incorreta

Usa count(valor) (errado, como na alternativa A) e omite o DESC (errado, como na alternativa C). Acumula os dois erros: contaria registros em vez de somar valores e ordenaria de forma ascendente. A saída não corresponderia em nenhum aspecto.

Alternativa E — ❌ Incorreta

A cláusula SELECT referencia total_recebido diretamente, mas esse alias não existe na tabela doacoes — ele é criado apenas no SELECT como apelido para sum(Valor). Além disso, a cláusula GROUP BY exige que todas as colunas não agregadas no SELECT estejam presentes no GROUP BY; como total_recebido é um alias de uma função de agregação, ele não pode ser usado no GROUP BY. A consulta correta deveria usar sum(Valor) as total_recebido no SELECT e GROUP BY SiglaProjeto.

Gabarito: letra B

Link permanente: /questoes/fg165230