Questão de Banco de Dados — Banco de Dados Relacionais — CESPE / CEBRASPE 2025
Banco de Dados›Banco 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.Considere, ainda, que os seguintes dados sejam inseridos nessa tabela.A 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.
A
B
C
D
E
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.
1Subconsulta correlacionada
2MAX(Salario) por departamento
3WHERE Salario = MAX
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.