Pular para o conteúdo principal

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

Banco de DadosPostgreSQL
Código
ce403612
Banca
CESPE / CEBRASPE
Órgão
INPI
Ano
2024
Cargo
APGIPI ( )
ALUNOS(ID,Nome,Endereço,Cidade,UF) DISCIPLINA(Cod_disciplina, Nome_diciplina,                    Carga_horaria) Considerando que as tabelas precedentes façam parte de um banco de dados relacional, julgue o item subsequente. O comando a seguir está sintaticamente correto em PostgreSql. select count(_) total, Cidade, UF from ALUNOS group by Cidade, UF having nome like 'maria%' and count(_) > 5 order by count(_) desc;
  1. CCerto
  2. 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”.

SQL – Cláusulas WHERE, HAVING e GROUP BY no PostgreSQL

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.

  1. 1WHERE filtra linhas
  2. 2GROUP BY agrupa
  3. 3HAVING filtra grupos
LEVEL · soulevel.com.br

Alternativa E — ❌ Incorreta (gabarito)

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.

NÃO CAIA NESSA!

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