Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2025
Banco de Dados›SQL
Código
ce220599
Banca
CESPE / CEBRASPE
Órgão
TRF - 6ª REGIÃO
Ano
2025
Nível
Médio
Cargo
Técnico Judiciário – Área: Apoio Especializado – Especialidade: Desenvolvimento de Sistemas de Informação
A partir das tabelas departamento e funcionario precedentes, julgue o item a seguir, relativo a SQL.A execução da seguinte consulta SQL resultará uma lista com a média de salários de cada departamento.SELECT d.nome_departamento, AVG(f.salario) ASsalario_medioFROM funcionarios fINNER JOIN departamentos dON f.id_departamento = d.idWHERE salario_medio > 4000.00GROUP BY d.nome_departamento;
CCerto
EErrado
Revelar gabarito e comentário▾
GabaritoE — Errado
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”.
SE LIGUE NESSA!
Esta questão depende de um texto-base (tabelas departamento e funcionario) que não está disponível aqui. O raciocínio abaixo ensina o método para julgar a consulta SQL; confira os dados na prova original.
SQL: cláusulas WHERE, HAVING e a ordem de execução
Gabarito: Errado (E). A consulta apresentada está incorreta porque usa a cláusula WHERE para filtrar o resultado de uma função de agregação (AVG), o que é inválido em SQL — o filtro sobre valores agregados deve ser feito com a cláusula HAVING. Além disso, a consulta tenta usar o alias salario_medio (criado no SELECT) dentro do WHERE, o que também não é permitido, pois o WHERE é avaliado antes do SELECT.
A questão cobra um dos pontos mais clássicos e mais cobrados em provas de SQL: a diferença entre WHERE e HAVING. A confusão entre essas duas cláusulas é a armadilha central — e é exatamente o que a banca explora aqui.
O que é WHERE e o que é HAVING?
Em SQL, WHERE e HAVING são cláusulas de filtro, mas atuam em momentos diferentes do processamento da consulta:
WHERE: filtra linhas individuais da tabela (ou do resultado do JOIN) antes de qualquer agrupamento ou agregação. Ele não pode usar funções de agregação (AVG, SUM, COUNT, etc.) nem referenciar aliases criados no SELECT.
HAVING: filtra grupos de linhas depois que o GROUP BY e as funções de agregação foram aplicados. Ele pode usar funções de agregação e referenciar aliases definidos no SELECT.
A ordem lógica de execução de uma consulta SQL é:
FROM (incluindo JOINs)
WHERE
GROUP BY
HAVING
SELECT (incluindo a criação de aliases)
ORDER BY
Essa ordem explica por que o WHERE não pode enxergar o alias salario_medio: o alias só é criado no passo 5, muito depois do WHERE (passo 2).
A consulta da questão
A consulta dada é:
SELECT d.nome_departamento, AVG(f.salario) AS salario_medio
FROM funcionarios f
INNER JOIN departamentos d
ON f.id_departamento = d.id
WHERE salario_medio > 4000.00
GROUP BY d.nome_departamento;
O objetivo declarado é: "resultará uma lista com a média de salários de cada departamento". Vamos analisar os problemas:
Uso do alias salario_medio no WHERE: o alias é criado no SELECT, que é executado depois do WHERE. Portanto, o WHERE não conhece salario_medio — isso gera um erro de sintaxe na maioria dos SGBDs (ou, em alguns, o alias é simplesmente ignorado, mas o comportamento não é o desejado).
Filtro sobre agregação no WHERE: mesmo que o alias fosse removido e a condição fosse escrita como WHERE AVG(f.salario) > 4000.00, isso continuaria errado, pois WHERE não aceita funções de agregação. O correto seria usar HAVING AVG(f.salario) > 4000.00 (ou HAVING salario_medio > 4000.00, já que o HAVING é avaliado depois do SELECT).
A intenção da consulta: se a intenção é listar a média salarial de cada departamento, sem filtro, a consulta correta seria simplesmente:
SELECT d.nome_departamento, AVG(f.salario) AS salario_medio
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id
GROUP BY d.nome_departamento;
Se a intenção é listar apenas os departamentos cuja média salarial é maior que 4000, o correto seria:
SELECT d.nome_departamento, AVG(f.salario) AS salario_medio
FROM funcionarios f
INNER JOIN departamentos d ON f.id_departamento = d.id
GROUP BY d.nome_departamento
HAVING AVG(f.salario) > 4000.00;
Exemplo prático
Suponha que a tabela funcionarios tenha os seguintes dados (apenas ilustrativo, já que o texto-base não está disponível):
id
nome
id_departamento
salario
1
Ana
1
3000
2
Bob
1
5000
3
Cid
2
4500
E a tabela departamentos:
id
nome_departamento
1
Vendas
2
TI
A consulta correta (sem filtro) retornaria:
nome_departamento
salario_medio
Vendas
4000
TI
4500
Com o filtro HAVING AVG(salario) > 4000, retornaria apenas:
nome_departamento
salario_medio
TI
4500
A consulta da questão, com WHERE salario_medio > 4000.00, simplesmente não executaria corretamente (erro de sintaxe) ou, em SGBDs mais permissivos, poderia retornar um resultado inesperado — mas nunca a lista correta de médias por departamento.
A pegadinha da banca
A banca mistura dois erros clássicos em uma única consulta:
Usar WHERE para filtrar o resultado de uma agregação (o correto é HAVING).
Referenciar um alias (salario_medio) dentro do WHERE, o que é inválido pela ordem de execução.
O candidato que decora a sintaxe sem entender a ordem de execução tende a achar que a consulta está correta, pois ela "parece" fazer sentido. Mas o WHERE simplesmente não pode enxergar o resultado do AVG.
Conclusão
A consulta apresentada não resultará em uma lista com a média de salários de cada departamento, pois contém erros de sintaxe e de lógica. O item está errado.
1FROM / JOIN
2WHERE
3GROUP BY
4HAVING
5SELECT
6ORDER BY
LEVEL · soulevel.com.br
Alternativa E — ❌ ERRADO ⟵ GABARITO
A alternativa E (Errado) é o gabarito, pois a consulta está incorreta. O erro específico é o uso da cláusula WHERE para filtrar o resultado de uma função de agregação (AVG), o que é inválido em SQL. O filtro sobre valores agregados deve ser feito com HAVING. Além disso, o alias salario_medio é referenciado no WHERE, mas ele só é criado no SELECT, que é executado depois — o que torna a consulta ainda mais incorreta.