Questão nº 44
Questão de Banco de Dados · CEBRASPE TCE MS 2025 SERVIDOR (nº 44)
Considere a seguinte tabela Funcionarios em um banco de dados relacional de funcionários de uma empresa.
```sql
CREATE TABLE Funcionarios (
id INT PRIMARY KEY,
nome VARCHAR(100),
salario DECIMAL(10, 2),
departamento VARCHAR(50)
);
```
Considere, ainda, que os seguintes dados sejam inseridos nessa tabela.
```sql
INSERT INTO Funcionarios (id, nome, salario, departamento) VALUES
(1, 'Ana', 3000.00, 'Vendas'),
(2, 'Bruno', 4500.00, 'TI'),
(3, 'Carlos', 3500.00, 'Vendas'),
(4, 'Diana', 5000.00, 'TI'),
(5, 'Elena', 4000.00, 'Financeiro');
```
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```sql
SELECT f1.departamento, f1.nome, f1.salario
FROM Funcionarios f1
WHERE f1.salario = (
SELECT MAX(f2.salario)
FROM Funcionarios f2
GROUP BY f2.departamento
HAVING f2.departamento = f1.departamento
);
``` - B```sql
SELECT f1.departamento, f1.nome, f1.salario
FROM Funcionarios f1
WHERE f1.salario = (
SELECT MAX(f2.salario)
FROM Funcionarios f2
);
``` - C```sql
SELECT f1.departamento, f1.nome, f1.salario
FROM Funcionarios f1
WHERE f1.salario = (
SELECT MAX(f2.salario)
FROM Funcionarios f2
WHERE f2.departamento = f1.departamento
);
``` (alternativa correta) - D```sql
SELECT departamento, nome, MAX(salario)
FROM Funcionarios
GROUP BY departamento;
``` - E```sql
SELECT f1.departamento, f1.nome, f1.salario
FROM Funcionarios f1
WHERE f1.salario = (
SELECT MAX(f2.salario)
FROM Funcionarios f2
GROUP BY f2.departamento
);
```
Resposta comentada
Gabarito Alternativa C
O conceito-chave é que uma subconsulta correlacionada referencia a tabela externa (o f1) dentro da subconsulta interna, fazendo com que o MAX seja calculado separadamente para cada departamento da linha atual. Sem essa correlação, o MAX seria global ou a consulta quebraria a regra de agrupamento.
- (A) Incorreta: A subconsulta usa
GROUP BY f2.departamentoeHAVING f2.departamento = f1.departamento, mas oHAVINGfiltra o grupo depois de agrupar, e a subconsulta pode retornar mais de uma linha (umMAXpor departamento), causando erro de "subconsulta retorna mais de um valor" na comparação=. A armadilha aqui é tentar "corrigir" a correlação comHAVING, que é desnecessário e inválido nesse contexto. - (B) Incorreta: A subconsulta calcula o
MAX(salario)de toda a tabela (sem correlação), retornando apenas o maior salário global (5000). Isso faria a consulta retornar apenas a Diana (TI), ignorando os maiores salários de Vendas (3500) e Financeiro (4000). - (C) Correta: A subconsulta é correlacionada (
WHERE f2.departamento = f1.departamento), então para cada linha def1, oMAXé recalculado apenas para o departamento daquela linha. Isso retorna corretamente Ana (3000) e Carlos (3500) em Vendas, Bruno (4500) e Diana (5000) em TI, e Elena (4000) em Financeiro, respeitando empates. - (D) Incorreta: A consulta agrupa por
departamentoe selecionanomeeMAX(salario), mas onomenão está agregado nem noGROUP BY. Em bancos como MySQL (comONLY_FULL_GROUP_BYdesativado), isso retorna um nome aleatório do grupo, não necessariamente o do maior salário. Em bancos rígidos, gera erro de sintaxe. - (E) Incorreta: A subconsulta usa
GROUP BY f2.departamentosem correlação (WHERE), retornando uma lista deMAX(salario)por departamento (3000, 4500, 4000). A comparaçãof1.salario = (lista)falha, pois a subconsulta retorna múltiplas linhas, causando erro de "subconsulta retorna mais de um valor".
Fonte: CEBRASPE TCE MS 2025 SERVIDOR Auditor de Controle Externo - Área: Tecnologia da Informação. Reproduzida para fins de estudo.