Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024
- Código
- ce403646
- Banca
- CESPE / CEBRASPE
- Órgão
- TCE AC
- Ano
- 2024
- Cargo
- ATI ( )

- CCerto
- EErrado

GabaritoC — Certo
Gabarito: Certo. A consulta está correta: ela agrupa os gastos por hospital, calcula o total de cada um com SUM(g.valor_gasto) e, na cláusula HAVING, compara esse total com a média geral de gastos obtida pela subconsulta SELECT AVG(valor_gasto) FROM gastos. Como o HAVING filtra grupos após a agregação, apenas os hospitais cujo total supera a média geral serão listados — exatamente o que o enunciado pede.
A questão cobra o entendimento da ordem lógica de execução de uma consulta SQL com agrupamento. O GROUP BY nome_hospital agrupa as linhas da tabela gastos (após o JOIN com hospital) por hospital, e o SUM(g.valor_gasto) calcula o total de gastos de cada grupo. A cláusula HAVING é aplicada depois da agregação, permitindo filtrar os grupos com base no resultado da função agregada — no caso, comparando o total de cada hospital com a média geral de todos os gastos.
A subconsulta (SELECT AVG(valor_gasto) FROM gastos) calcula a média aritmética de todos os valores da coluna valor_gasto da tabela gastos, sem qualquer filtro ou agrupamento. Esse valor é um escalar (um único número), que serve como referência para a comparação no HAVING. É importante notar que a média geral é calculada sobre todas as linhas de gastos, não sobre os totais por hospital — o que é exatamente o que se espera ao comparar o gasto total de cada hospital com a média geral de gastos.
Um ponto que pode gerar confusão é a diferença entre WHERE e HAVING. O WHERE filtra linhas antes da agregação, não podendo usar funções agregadas. O HAVING filtra grupos depois da agregação, podendo usar funções como SUM, AVG, COUNT. Nesta consulta, o filtro correto é o HAVING, pois a condição depende do total agregado de cada hospital. Se a condição fosse aplicada no WHERE, o banco tentaria filtrar linhas individuais antes de somar, o que não faz sentido para comparar totais com a média geral.
Outro detalhe: a consulta usa JOIN (que por padrão é INNER JOIN) entre gastos e hospital pela chave id_hospital. Isso garante que apenas gastos com hospital correspondente sejam considerados. O ORDER BY nome_hospital apenas ordena o resultado final por nome, sem afetar a lógica de filtragem. A consulta está sintaticamente correta e semanticamente adequada ao que se propõe.
A banca pode tentar confundir o candidato quanto ao uso de WHERE no lugar de HAVING. Lembre-se: WHERE filtra linhas antes da agregação e não pode usar funções agregadas; HAVING filtra grupos após a agregação e é o único lugar onde se pode comparar o resultado de SUM ou AVG com um valor. Nesta questão, a comparação com a média geral só é possível no HAVING.
A ordem lógica de execução de uma consulta SQL é:
Essa sequência explica por que o HAVING enxerga os totais agregados e o WHERE não. O SELECT só é avaliado depois do HAVING, então apelidos criados no SELECT não podem ser usados no HAVING (embora alguns SGBDs permitam, não é padrão).
✅ CERTO — a consulta lista corretamente os nomes dos hospitais com gastos totais superiores à média geral de gastos.
Gabarito: Certo.
Link permanente: /questoes/ce403646