Questão nº 44

Questão de Banco de Dados · CEBRASPE TCE MS 2025 SERVIDOR (nº 44)

CEBRASPE2025Auditor de Controle Externo - Área: Tecnologia da InformaçãoBanco de Dados
Gabarito: Cver comentário ↓

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.

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.departamento e HAVING f2.departamento = f1.departamento, mas o HAVING filtra o grupo depois de agrupar, e a subconsulta pode retornar mais de uma linha (um MAX por departamento), causando erro de "subconsulta retorna mais de um valor" na comparação =. A armadilha aqui é tentar "corrigir" a correlação com HAVING, 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 de f1, o MAX é 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 departamento e seleciona nome e MAX(salario), mas o nome não está agregado nem no GROUP BY. Em bancos como MySQL (com ONLY_FULL_GROUP_BY desativado), 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.departamento sem correlação (WHERE), retornando uma lista de MAX(salario) por departamento (3000, 4500, 4000). A comparação f1.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.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho