Pular para o conteúdo principal

Questão de Banco de Dados — Geral — FUNDATEC 2026

Banco de DadosGeral
Código
qa433524
Banca
FUNDATEC
Órgão
IFC
Ano
2026
Cargo
PEBTT ( )

Considere a tabela VENDAS(id venda, vendedor, valor) em um banco de dados MySQL. Um analista deseja obter exclusivamente o nome do vendedor com o maior valor total de vendas, considerando que pode haver empate entre vendedores. Assinale a consulta SQL que atende corretamente ao objetivo.

  1. ASELECT vendedor FROM vendas GROUP BY vendedor ORDER BY SUM(valor) DESC LIMIT 1;
  2. BSELECT vendedor FROM vendas GROUP BY vendedor HAVING SUM(valor) = ( SELECT MAX(total) FROM ( SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor ) AS subtotais );
  3. CSELECT vendedor FROM vendas GROUP BY vendedor HAVING SUM(valor) >= ALL ( SELECT SUM(valor) FROM vendas GROUP BY vendedor );
  4. DSELECT vendedor, MAX(SUM(valor)) FROM vendas GROUP BY vendedor;
  5. ESELECT vendedor FROM vendas WHERE valor = ( SELECT MAX(valor) FROM vendas ) GROUP BY vendedor;
Revelar gabarito e comentário

GabaritoB — SELECT vendedor FROM vendas GROUP BY vendedor HAVING SUM(valor) = ( SELECT MAX(total) FROM ( SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor ) AS subtotais );

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”.

Consulta SQL para o vendedor com maior total de vendas

Gabarito: letra B. A consulta correta agrupa as vendas por vendedor, calcula o total de cada um e, com a cláusula HAVING, filtra apenas os grupos cuja soma seja igual ao maior total obtido em uma subconsulta — assim, retorna todos os vendedores empatados no topo, atendendo ao requisito de considerar empates. As demais alternativas ou retornam apenas um vendedor (ignorando empates), ou usam sintaxe inválida, ou comparam valores individuais em vez de totais.

O problema central é: como obter o vendedor (ou vendedores) com o maior valor total de vendas, incluindo empates? A solução clássica em SQL é usar GROUP BY para agregar os totais por vendedor e, em seguida, uma subconsulta que calcule o máximo desses totais. A cláusula HAVING permite filtrar grupos após a agregação, comparando SUM(valor) de cada grupo com o máximo global. Essa abordagem é portátil e funciona em MySQL, PostgreSQL, SQL Server etc.

Vamos entender cada peça:

  • GROUP BY vendedor: agrupa as linhas da tabela por vendedor, permitindo que funções de agregação como SUM(valor) atuem sobre cada grupo.

  • SUM(valor): calcula o total de vendas de cada vendedor.

  • Subconsulta: SELECT MAX(total) FROM (SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor) AS subtotais — primeiro calcula o total de cada vendedor (subconsulta interna), depois extrai o maior desses totais.

  • HAVING SUM(valor) = (subconsulta): filtra os grupos cuja soma seja exatamente igual ao maior total. Se houver empate, todos os vendedores com esse total aparecem.

Um exemplo concreto: suponha a tabela vendas com os registros:

vendedor

valor

Ana

100

Ana

200

Bruno

150

Bruno

150

Carla

300

Os totais por vendedor são: Ana = 300, Bruno = 300, Carla = 300. O maior total é 300. A consulta da alternativa B retornaria Ana, Bruno e Carla — todos empatados. Já a alternativa A, com ORDER BY SUM(valor) DESC LIMIT 1, retornaria apenas um deles (o primeiro na ordem de desempate, que não é especificada), violando o requisito de considerar empates.

A pegadinha da banca está em confundir "maior valor total" com "maior valor individual". A alternativa E, por exemplo, compara valor (cada venda) com o MAX(valor) da tabela, retornando vendedores que tenham uma venda individual máxima — não o maior total. A alternativa C usa >= ALL, que é sintaxe válida em alguns bancos, mas não no MySQL (que não suporta ALL com subconsulta dessa forma). A alternativa D tenta usar MAX(SUM(valor)), o que é inválido porque não se pode aninhar funções de agregação diretamente.

Guarde o critério decisivo: para considerar empates, a consulta deve comparar o total de cada grupo com o máximo dos totais — e isso se faz com HAVING + subconsulta, não com LIMIT 1.

Alternativa A — ❌ Incorreta

Esta consulta usa ORDER BY SUM(valor) DESC LIMIT 1, que retorna apenas um vendedor — o primeiro após a ordenação. Se houver empate, apenas um deles é retornado, ignorando os demais. O enunciado exige exclusivamente o nome do vendedor com o maior valor total, considerando que pode haver empate — ou seja, devem ser retornados todos os vendedores com o maior total. O LIMIT 1 quebra esse requisito.

Alternativa B — ✅ Correta ⟵ GABARITO

A consulta agrupa por vendedor, calcula o total de cada um e, com HAVING, filtra os grupos cuja soma seja igual ao maior total obtido na subconsulta. A subconsulta SELECT MAX(total) FROM (SELECT SUM(valor) AS total FROM vendas GROUP BY vendedor) AS subtotais calcula o maior total entre todos os vendedores. Assim, todos os vendedores com esse total são retornados, incluindo empates. A sintaxe é válida em MySQL e em outros SGBDs relacionais.

Alternativa C — ❌ Incorreta

A cláusula HAVING SUM(valor) >= ALL (SELECT SUM(valor) FROM vendas GROUP BY vendedor) é sintaticamente inválida no MySQL. O operador ALL não é suportado dessa forma no MySQL (diferente de ANY/SOME). Além disso, a lógica >= ALL seria equivalente a >= MAX, mas a sintaxe correta seria HAVING SUM(valor) >= (SELECT MAX(...)). Mesmo que fosse corrigida, a intenção de retornar todos os empatados seria atendida, mas a forma apresentada não funciona no MySQL.

Alternativa D — ❌ Incorreta

SELECT vendedor, MAX(SUM(valor)) FROM vendas GROUP BY vendedor é inválida porque não se pode aninhar funções de agregação (MAX(SUM(...))). O MySQL não permite essa sintaxe. Além disso, mesmo que fosse possível, retornaria o máximo da soma de cada grupo, o que não faz sentido — cada grupo já tem uma soma única.

Alternativa E — ❌ Incorreta

Esta consulta compara valor (valor de cada venda individual) com o MAX(valor) da tabela inteira, retornando vendedores que tenham uma venda individual igual ao maior valor de venda. Isso não considera o total de vendas por vendedor. Por exemplo, um vendedor com uma única venda de 1000 e outro com várias vendas somando 1500: a consulta retornaria o primeiro (por ter a venda individual máxima), mas o correto seria o segundo (maior total). Além disso, a cláusula GROUP BY vendedor sem função de agregação na lista de seleção é desnecessária e pode gerar erro em alguns bancos.

Gabarito: letra B — a única consulta que retorna todos os vendedores com o maior total de vendas, considerando empates.

Link permanente: /questoes/qa433524