Questão de Banco de Dados — PostgreSQL — CESPE / CEBRASPE 2024
- Código
- ce403612
- Banca
- CESPE / CEBRASPE
- Órgão
- INPI
- Ano
- 2024
- Cargo
- APGIPI ( )
- CCerto
- EErrado
GabaritoE — Errado
Gabarito: Errado. O comando apresentado não é sintaticamente correto em PostgreSQL porque a cláusula HAVING referencia a coluna nome, que não está incluída no GROUP BY e não é uma função de agregação. Em SQL, o HAVING só pode conter colunas agrupadas ou funções de agregação, e a condição nome like 'maria%' deveria estar na cláusula WHERE, antes do agrupamento.
O comando SQL em questão mistura conceitos de filtragem que precisam ser separados corretamente. A cláusula WHERE filtra linhas individuais antes do agrupamento, enquanto a cláusula HAVING filtra grupos após a agregação. No comando apresentado, a condição nome like 'maria%' é uma condição sobre uma coluna não agregada (nome), que não está presente no GROUP BY. Isso viola a regra fundamental do SQL: toda coluna no SELECT que não seja argumento de uma função de agregação deve aparecer no GROUP BY. Como nome não está no GROUP BY, ela não pode ser referenciada no HAVING.
Para que o comando fosse sintaticamente correto, a condição sobre nome deveria ser movida para a cláusula WHERE, filtrando os alunos cujo nome começa com 'maria' antes do agrupamento. A cláusula HAVING ficaria apenas com a condição sobre a agregação, como count(*) > 5. A forma correta seria:
select count(*) total, Cidade, UF
from ALUNOS
where nome like 'maria%'
group by Cidade, UF
having count(*) > 5
order by count(*) desc;Além disso, há um erro de digitação no comando: count(_) deveria ser count(*) ou count(nome). O sublinhado _ não é um identificador válido para uma coluna nessa tabela, pois as colunas são ID, Nome, Endereço, Cidade e UF. Portanto, o comando apresenta dois problemas: a referência indevida a nome no HAVING e o uso incorreto de count(_).
A banca explora exatamente a confusão entre WHERE e HAVING. O candidato pode pensar que, como a condição nome like 'maria%' aparece após o GROUP BY, ela está correta, mas o SQL exige que filtros sobre colunas não agregadas sejam feitos no WHERE. O HAVING é exclusivo para condições sobre funções de agregação ou colunas do GROUP BY.
A alternativa E afirma que o comando está sintaticamente correto, mas isso é falso. O comando viola a regra de que colunas no HAVING devem estar no GROUP BY ou serem agregadas. A coluna nome não está no GROUP BY e não é uma função de agregação, portanto não pode ser usada no HAVING. Além disso, count(_) é inválido, pois _ não é uma coluna da tabela. O correto seria count(*) ou count(nome). A condição nome like 'maria%' deveria estar no WHERE.
A banca troca o papel do WHERE e do HAVING. O candidato pode achar que, por a condição nome like 'maria%' vir depois do GROUP BY, ela está correta, mas o SQL exige que filtros sobre colunas não agregadas sejam feitos no WHERE. O HAVING é exclusivo para condições sobre funções de agregação ou colunas do GROUP BY. Fique atento: se a condição envolve uma coluna comum, ela vai no WHERE; se envolve uma agregação, vai no HAVING.
Gabarito: letra E
Link permanente: /questoes/ce403612