Para usar HAVING
em consultas SQL, deve haver um GROUP BY
para agregar os nomes das colunas?
Existem casos especiais em que é possível usar HAVING
sem GROUP BY
consultas SQL?
Eles devem coexistir ao mesmo tempo?
Para usar HAVING
em consultas SQL, deve haver um GROUP BY
para agregar os nomes das colunas?
Existem casos especiais em que é possível usar HAVING
sem GROUP BY
consultas SQL?
Eles devem coexistir ao mesmo tempo?
Não.
Eles não precisam coexistir, como comprovado pelo fato de que a seguinte consulta no Oracle funciona:
Da mesma forma, no PostgreSQL a seguinte consulta funciona:
Então
having
não exigegroup by
.Tendo é aplicado após a fase de agregação e deve ser usado se você deseja filtrar os resultados agregados. Portanto, o inverso não é verdadeiro e o seguinte não funcionará:
Você precisa substituir
where
porhaving
neste caso, da seguinte forma:NB O seguinte formulário de consulta também funcionará:
Você pode ver que using
having
é simplesmente uma versão abreviada desta última consulta.Em resumo,
having
é aplicado após agroup by
fase enquantowhere
é aplicado antes dagroup by
fase.Tendo é usado para filtrar grupos.
onde a cláusula é usada para filtrar linhas.
Na ausência da cláusula GROUP BY, a consulta considera toda a relação como um grupo.
por exemplo
HAVING está filtrando os grupos. Se você não tiver a causa GROUP BY, todas as linhas apresentam um grupo. Portanto, se o predicado em HAVING for avaliado como verdadeiro, você obterá uma linha, caso contrário, nenhuma linha.