Considere a seguinte tabela Funcionarios em um banco de dad...
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.
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:
- Filtragem por departamento: a subconsulta é executada para cada funcionário, considerando apenas os salários do mesmo departamento.
- 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