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?
Respostas:
Não.
Eles não precisam coexistir, conforme comprovado pelo fato de que a seguinte consulta no Oracle funciona:
select * from dual having 1 = 1;
Da mesma forma, no PostgreSQL, a seguinte consulta funciona:
select 1 having 1 = 1;
Então having
não requer group by
.
Ter é 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 funciona:
select a, count(*) as c
from mytable
group by a
where c > 1;
Você precisa substituir where
por having
neste caso, da seguinte maneira:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB O seguinte formulário de consulta também funcionará:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Você pode ver que usar having
é simplesmente uma versão abreviada desta última consulta.
Em resumo, having
é aplicado após a group by
fase, enquanto where
é aplicado antes da group by
fase.
select 1 having count(*) = 1;
que ainda não compreendi.
SELECT 1 AS id, 'Colin' AS name;
enquanto outros, como o Oracle, têm uma dual
tabela especial . Eu não acho que nenhuma dessas sintaxes seja ANSI / ISO SQL (que requer FROM
).
from
mas a referência count(*)
na having
cláusula sem qualquer indicação sobre quais colunas estão sendo agregadas. Presumivelmente, ele agrega todas as colunas da select
cláusula.
Tendo é usado para filtrar grupos.
cláusula where é usada para filtrar linhas.
having
é aplicado após a fase de agregação e pode ser usado para filtrar grupos.
Na ausência da cláusula GROUP BY, a consulta considera toda a relação como um grupo.
por exemplo
select count(*)
from dual
having count(*) > 5;
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);