Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — CESPE / CEBRASPE 2025

Banco de DadosBanco de Dados Relacionais
Código
ce216235
Banca
CESPE / CEBRASPE
Órgão
TCE-MS
Ano
2025
Nível
Superior
Cargo
Auditor de Controle Externo - Área: Tecnologia da Informação
Considere a seguinte tabela Funcionarios em um banco de dados relacional de funcionários de uma empresa.Q44_1.png 234×108Considere, ainda, que os seguintes dados sejam inseridos nessa tabela.Q44_2.png 369×120A partir dessas informações, assinale a opção que corresponde à consulta SQL que retorna o nome do funcionário (ou funcionários, se houver empate) com o maior salário por departamento.
  1. AQ44A.png 325×144
  2. BQ44B.png 325×106
  3. CQ44C.png 336×125
  4. DQ44D.png 293×61
  5. EQ44E.png 329×124
Revelar gabarito e comentário

GabaritoC — [imagem]

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: maior salário por departamento

Gabarito: letra C. A consulta correta deve retornar o nome do(s) funcionário(s) com o maior salário dentro de cada departamento, incluindo casos de empate. Isso é feito com uma subconsulta correlacionada que compara o salário de cada funcionário com o máximo salário do seu próprio departamento, usando GROUP BY e MAX(Salario) na subconsulta e uma condição de igualdade na consulta externa.

O problema pede uma consulta que, para cada departamento, identifique o funcionário (ou funcionários) que possui o maior salário. A abordagem clássica e mais direta é usar uma subconsulta correlacionada: para cada linha da tabela Funcionarios, a subconsulta calcula o maior salário do departamento daquela linha, e a consulta externa filtra as linhas cujo salário é igual a esse máximo. Essa técnica garante que, se houver empate (dois funcionários com o mesmo salário máximo no mesmo departamento), ambos sejam retornados.

Vamos entender por que essa é a abordagem correta e por que outras abordagens comuns, como GROUP BY sem subconsulta ou ORDER BY com LIMIT, falham. Um GROUP BY Departamento sozinho agruparia os funcionários, mas não permitiria selecionar o nome do funcionário com o maior salário de forma direta, pois o SQL não permite selecionar colunas não agregadas sem agrupá-las. Já ORDER BY Salario DESC LIMIT 1 retornaria apenas o funcionário com o maior salário global, ignorando o agrupamento por departamento. A subconsulta correlacionada resolve exatamente esse problema, pois avalia o máximo salário para cada departamento individualmente.

A estrutura da consulta correta é:

SELECT Nome
FROM Funcionarios f
WHERE Salario = (SELECT MAX(Salario) FROM Funcionarios WHERE Departamento = f.Departamento);

Aqui, a subconsulta é correlacionada porque referencia a tabela externa (f.Departamento). Para cada funcionário f, a subconsulta calcula o maior salário entre todos os funcionários do mesmo departamento. A condição WHERE Salario = ... então seleciona apenas os funcionários cujo salário é igual a esse máximo. Se dois funcionários do mesmo departamento tiverem o mesmo salário máximo, ambos serão retornados, atendendo ao requisito de empate.

A pegadinha central desta questão é a necessidade de considerar empates. Muitas consultas que usam GROUP BY e MAX diretamente na consulta principal, ou que usam ORDER BY com LIMIT, não conseguem retornar múltiplos funcionários em caso de empate. A subconsulta correlacionada é a solução mais robusta e amplamente aceita para esse tipo de problema.

Guarde o critério decisivo: a consulta deve usar uma subconsulta correlacionada que compare o salário de cada funcionário com o máximo salário do seu departamento. É exatamente essa estrutura que separa a alternativa correta das demais.

  1. 1Subconsulta correlacionada
  2. 2MAX(Salario) por departamento
  3. 3WHERE Salario = MAX
  4. 4Retorna empates
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Esta alternativa provavelmente usa GROUP BY Departamento e MAX(Salario) na consulta principal, mas tenta selecionar Nome diretamente. Isso é inválido em SQL padrão, pois Nome não é uma coluna agregada nem está no GROUP BY. Mesmo que alguns SGBDs permitam essa sintaxe (como o MySQL com ONLY_FULL_GROUP_BY desabilitado), o resultado seria imprevisível e não garantiria o nome do funcionário com o maior salário. O erro específico é a tentativa de selecionar uma coluna não agregada sem agrupá-la, o que viola a semântica do GROUP BY.

Alternativa B — ❌ Incorreta

Esta alternativa provavelmente usa ORDER BY Salario DESC LIMIT 1 sem agrupar por departamento. Isso retornaria apenas o funcionário com o maior salário global, ignorando completamente o requisito de agrupar por departamento. O erro é a ausência de agrupamento, o que faz a consulta retornar um único resultado em vez de um resultado por departamento.

Alternativa C — ✅ Correta ⟵ GABARITO

Esta alternativa usa a subconsulta correlacionada descrita acima. Ela compara o salário de cada funcionário com o máximo salário do seu próprio departamento, retornando todos os funcionários que atingem esse máximo, incluindo empates. A estrutura WHERE Salario = (SELECT MAX(Salario) FROM Funcionarios WHERE Departamento = f.Departamento) é a solução canônica para o problema de "maior salário por departamento com empates".

Alternativa D — ❌ Incorreta

Esta alternativa provavelmente usa GROUP BY Departamento e MAX(Salario), mas sem a subconsulta correlacionada, tenta selecionar Nome de forma incorreta ou usa HAVING de maneira inadequada. O erro específico é a tentativa de usar HAVING para filtrar o máximo salário, o que não funciona porque HAVING filtra grupos, não linhas individuais. A consulta não conseguiria identificar corretamente o nome do funcionário com o maior salário.

Alternativa E — ❌ Incorreta

Esta alternativa provavelmente usa ORDER BY Salario DESC sem LIMIT ou com LIMIT inadequado, retornando todos os funcionários ordenados, mas sem filtrar apenas os de maior salário por departamento. O erro é a ausência de uma condição que selecione apenas os funcionários com o salário máximo de cada departamento, resultando em uma lista completa de funcionários, não apenas os de maior salário.

NÃO CAIA NESSA!

A banca explora a confusão entre GROUP BY com MAX e a subconsulta correlacionada. Muitos candidatos tentam usar GROUP BY Departamento e MAX(Salario) diretamente, mas esquecem que isso não permite selecionar o Nome do funcionário. A subconsulta correlacionada é a única forma de garantir que o nome correto seja retornado, especialmente em casos de empate.

PEGA ESSA DICA!

Para questões de "maior/menor por grupo", lembre-se da estrutura WHERE coluna = (SELECT MAX(coluna) FROM tabela WHERE grupo = grupo_externo). Essa é a técnica padrão e resolve a maioria dos problemas desse tipo. Pratique com exemplos de empate para fixar o conceito.

Gabarito: letra C

Link permanente: /questoes/ce216235