Considere a seguinte tabela Funcionarios em um banco de dad...

Próximas questões
Com base no mesmo assunto
Q3701186 Banco de Dados
Considere a seguinte tabela Funcionarios em um banco de dados relacional de funcionários de uma empresa.

Q44_1.png (234×108)

Considere, ainda, que os seguintes dados sejam inseridos nessa tabela.  

Q44_2.png (369×120)

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

Comentários

Veja os comentários dos nossos alunos

A e E usam subconsultas com , mas não garantem comparação correta por departamento.

B não relaciona departamentos, então está errada.

D retorna apenas departamento e o maior salário, mas não traz o nome do funcionário.

C faz exatamente o necessário: compara o salário do funcionário com o maior salário do mesmo departamento usando uma subconsulta correlacionada.

A subconsulta correlacionada é a melhor solução porque ela compara cada linha da tabela externa com um conjunto de valores calculados dinamicamente para aquele contexto específico — neste caso, o maior salário dentro do mesmo departamento.

Isso garante duas coisas importantes:

  1. Filtragem por departamento: a subconsulta é executada para cada funcionário, considerando apenas os salários do mesmo departamento.
  2. Empates: se houver mais de um funcionário com o maior salário, todos serão retornados, pois a condição f1.salario = (SELECT MAX(...)) é verdadeira para todos os casos iguais.

As outras opções ou não relacionam corretamente departamento e salário, ou não retornam o nome do funcionário.

Fonte: copilot

A (também funciona)

https://sqlfiddle.com/sql-server/online-compiler?id=d3338da8-5f63-4f94-bfaa-bb6728aecdbe

B(Retorna só o maior salário de todos, não segmenta por departamento)

https://sqlfiddle.com/sql-server/online-compiler?id=faf10d22-c4b7-4a93-b492-de3f49d540f9

C

https://sqlfiddle.com/sql-server/online-compiler?id=36aaa4cc-772d-4649-9e10-6e980fba6f6e

D (nome precisaria estar no group by, falha a query):

https://sqlfiddle.com/sql-server/online-compiler?id=56a2634d-573b-4c89-894d-2a8bec3adea7

E (Subquery retorna mais de um resultado)

https://sqlfiddle.com/sql-server/online-compiler?id=814f6d91-5c0d-4953-8102-ec44037f45bb

Letra C

SELECT nome, departamento, salario

FROM Funcionarios f

WHERE salario = (

   SELECT MAX(salario)

   FROM Funcionarios

   WHERE departamento = f.departamento

);

A subconsulta SELECT MAX(salario) ... WHERE departamento = f.departamento retorna o maior salário dentro de cada departamento. A cláusula WHERE salario = (...) garante que sejam selecionados os funcionários cujo salário é igual ao maior salário do respectivo departamento, incluindo empates.

Essa questão me ensinou algo novo: o HAVING pode ser usado para qualquer coluna, não apenas funções agregadoras. A questão foi anulada porque A e C devolvem o que é pedido, como o outro usuário comentou.

Na minha cabeça, o código correto seria a letra C

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

);

No entanto, usar o HAVING não gera erro, apenas uma ineficiência. O WHERE é executado antes do GROUP BY, então linhas não correspondentes são descartadas antes de serem agrupadas. No caso do código em questão

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

);

Nesse caso, todos os agrupamentos são feitos para, depois, serem descartados na condição do HAVING.

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo