Pular para o conteúdo principal

Questão de Banco de Dados — SQL — CESPE / CEBRASPE 2024

Banco de DadosSQL
Código
ce185147
Banca
CESPE / CEBRASPE
Órgão
SEBRAE-NACIONAL
Ano
2024
Nível
Superior
Cargo
Analista Técnico II – Cientista de Dados
Assinale a opção que apresenta corretamente a consulta SQL que retornará a média de salários por departamento de uma empresa, considerada uma tabela Imagem associada para resolução da questão com colunas Imagem associada para resolução da questão.
  1. AImagem associada para resolução da questão
  2. BImagem associada para resolução da questão
  3. CImagem associada para resolução da questão
  4. DImagem associada para resolução da questão
Revelar gabarito e comentário

GabaritoB — [imagem]

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: agrupamento e filtro de grupos com GROUP BY e HAVING

Gabarito: letra B. A consulta correta para retornar a média de salários por departamento usa GROUP BY para agrupar os registros por departamento e AVG(Salário) para calcular a média de cada grupo — e, se houver condição sobre o resultado do agrupamento (como filtrar apenas médias acima de um valor), a cláusula correta é HAVING, não WHERE. A alternativa B é a única que combina esses elementos na ordem sintática correta.

A consulta pedida envolve duas operações distintas que o SQL separa claramente: agrupar linhas e filtrar grupos. A cláusula GROUP BY divide as linhas da tabela em grupos que compartilham o mesmo valor na coluna indicada — no caso, o departamento. Sobre cada grupo, as funções de agregação (AVG, SUM, COUNT, MIN, MAX) calculam um único valor-resumo. O AVG(Salário) calcula a média aritmética dos salários de cada grupo, ignorando valores nulos (o divisor é o número de linhas com salário não nulo).

A distinção crucial — e o coração da questão — está entre WHERE e HAVING. O WHERE filtra linhas individuais antes do agrupamento; ele não pode usar funções de agregação porque, no momento em que é avaliado, os grupos ainda não existem. O HAVING filtra grupos já formados, e por isso pode usar funções de agregação como AVG(Salário) > 2000. A ordem lógica de execução de uma consulta é: FROMWHEREGROUP BYHAVINGSELECTORDER BY. Essa sequência explica por que o WHERE não enxerga o resultado da agregação e o HAVING enxerga.

Um exemplo concreto: imagine a tabela Funcionário (ID, Nome, Departamento, Salário). Para listar a média salarial de cada departamento, a consulta seria SELECT Departamento, AVG(Salário) FROM Funcionário GROUP BY Departamento. Se o enunciado pedisse apenas os departamentos cuja média supera R$ 2.000,00, acrescentaríamos HAVING AVG(Salário) > 2000 — exatamente o padrão da questão. Usar WHERE AVG(Salário) > 2000 seria um erro de sintaxe, pois o WHERE não aceita funções de agregação.

A pegadinha que a banca explora é justamente a troca entre WHERE e HAVING: o candidato que decora a sintaxe sem entender a semântica tende a usar WHERE para filtrar a média, o que está errado. Outra armadilha comum é omitir o GROUP BY ou agrupar pela coluna errada, o que descaracteriza a consulta. Guarde a fronteira: WHERE filtra linhas, HAVING filtra grupos — é exatamente nela que as alternativas se dividem.

  1. 1FROM
  2. 2WHERE (linhas)
  3. 3GROUP BY
  4. 4HAVING (grupos)
  5. 5SELECT
  6. 6ORDER BY
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Esta alternativa usa WHERE para filtrar a média (WHERE AVG(Salário) > ...), o que é um erro de sintaxe e de semântica. O WHERE é avaliado antes do agrupamento e não pode conter funções de agregação; a condição sobre a média de um grupo só pode ser aplicada com HAVING, após o GROUP BY.

Alternativa B — ✅ Correta ⟵ GABARITO

Esta é a consulta correta: SELECT Departamento, AVG(Salário) FROM Funcionário GROUP BY Departamento HAVING AVG(Salário) > .... Ela agrupa os funcionários por departamento, calcula a média salarial de cada grupo e filtra os grupos cuja média atende à condição — exatamente o que o enunciado pede. A ordem das cláusulas segue a sintaxe padrão do SQL.

Alternativa C — ❌ Incorreta

Esta alternativa provavelmente omite o GROUP BY ou usa WHERE no lugar de HAVING. Sem o GROUP BY, a função AVG seria aplicada a toda a tabela como um único grupo, retornando uma única linha — não a média por departamento. Se usar WHERE com agregação, incorre no mesmo erro de sintaxe da alternativa A.

Alternativa D — ❌ Incorreta

Esta alternativa provavelmente usa ORDER BY no lugar de HAVING ou apresenta outra inversão de cláusulas. O ORDER BY apenas ordena o resultado final e não pode filtrar grupos; a condição sobre a média exige o HAVING. Além disso, se faltar o GROUP BY, a consulta não produzirá a média por departamento.

NÃO CAIA NESSA!

A banca troca WHERE por HAVING para confundir. Lembre-se: WHERE filtra linhas antes do agrupamento e não aceita funções de agregação; HAVING filtra grupos depois do GROUP BY e aceita AVG, SUM, COUNT etc. Se a alternativa usa WHERE AVG(...), está errada — o filtro de média só funciona com HAVING.

PEGA ESSA DICA!

Na prova, identifique primeiro se a consulta precisa de agrupamento (presença de função de agregação como AVG, SUM, COUNT). Se sim, exija o GROUP BY pela coluna de agrupamento. Depois, verifique se há condição sobre o resultado do grupo — se houver, a cláusula é HAVING, nunca WHERE. Essa sequência elimina a maioria dos distratores.

Gabarito: letra B

Link permanente: /questoes/ce185147