Considere uma tabela denominada funcionario, com os campos idFuncionario (PK, inteiro), nome (varchar), email (varchar), salario(double) e idDepartamento(FK inteiro). Para selecionar todos os funcionários que ganham salario acima do salário médio em seu departamento utiliza-se a instrução SQL
ASELECT * FROM funcionario t1 WHERE salario > (SELECT AVG(salario) FROM funcionario t2 WHERE t2.idDepartamento = t1.idDepartamento);
BSELECT * FROM funcionario f1 WHERE salario > GROUP BY(AVG(f1.salario));
CSELECT * FROM funcionario f1 WHERE f1.salario > (SELECT AVG(f1.salario) INNER JOIN funcionario f2 WHERE f2.idDepartamento = f1.idDepartamento);
DSELECT * FROM funcionario WHERE salario > (SELECT AVG(salario) FROM funcionario GROUP BY idDepartamento);
ESELECT * FROM funcionario WHERE salario > AVG(salario);
Revelar gabarito e comentário▾
GabaritoA — SELECT * FROM funcionario t1 WHERE salario > (SELECT AVG(salario) FROM funcionario t2 WHERE t2.idDepartamento = t1.idDepartamento);
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”.
SQL: Subconsulta Correlacionada
Gabarito: letra A. A alternativa A utiliza uma subconsulta correlacionada que, para cada funcionário, calcula a média salarial dos funcionários do mesmo departamento (comparando o idDepartamento da subconsulta com o da consulta externa). As demais alternativas apresentam erros de sintaxe ou lógica que impedem a consulta correta.
Alternativa A — ✅ Correta ⟵ GABARITO
A consulta SELECT * FROM funcionario t1 WHERE salario > (SELECT AVG(salario) FROM funcionario t2 WHERE t2.idDepartamento = t1.idDepartamento); é a sintaxe correta de uma subconsulta correlacionada: a subconsulta é executada para cada linha da tabela externa, usando o idDepartamento da linha atual para calcular a média do respectivo departamento. O resultado são os funcionários com salário acima da média do seu próprio departamento.
Alternativa B — ❌ Incorreta
Erro de sintaxe: a cláusula WHERE não pode conter GROUP BY(AVG(...)). A função de agregação AVG não pode ser usada diretamente no WHERE sem uma subconsulta ou agrupamento.
Alternativa C — ❌ Incorreta
Erro de sintaxe: a subconsulta tenta usar INNER JOIN sem uma cláusula FROM e referencia o alias f1 de forma incorreta (o alias f1 pertence à consulta externa, mas é usado dentro da subconsulta sem qualificação adequada).
Alternativa D — ❌ Incorreta
A subconsulta (SELECT AVG(salario) FROM funcionario GROUP BY idDepartamento) retorna uma média para cada departamento (várias linhas), mas a comparação > espera um único valor escalar – a consulta gerará um erro de execução (subquery retorna mais de uma linha). Além disso, não há correlação para garantir que a média seja do mesmo departamento do funcionário.
Alternativa E — ❌ Incorreta
Erro de sintaxe: AVG(salario) é uma função de agregação e não pode ser usada diretamente na cláusula WHERE sem uma subconsulta ou agrupamento (GROUP BY). A consulta não faz sentido no SQL.
PEGA ESSA DICA!
Quando for necessário comparar cada linha com a agregação de um grupo (ex.: salário acima da média do departamento), lembre-se de usar uma subconsulta correlacionada ou funções de janela como AVG() OVER(PARTITION BY idDepartamento). A subconsulta correlacionada é a abordagem clássica e é frequentemente cobrada em concursos.