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, 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 MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);
select 1 having count(*) = 1;
que ainda não compreendi.SELECT 1 AS id, 'Colin' AS name;
enquanto outros, como o Oracle, têm umadual
tabela especial . Eu não acho que nenhuma dessas sintaxes seja ANSI / ISO SQL (que requerFROM
).from
mas a referênciacount(*)
nahaving
cláusula sem qualquer indicação sobre quais colunas estão sendo agregadas. Presumivelmente, ele agrega todas as colunas daselect
cláusula.Tendo é usado para filtrar grupos.
cláusula where é usada para filtrar linhas.
fonte
having
é aplicado após a fase de agregação e pode ser usado para filtrar grupos.TENDO está filtrando os grupos. Se você não tiver uma causa GROUP BY, todas as linhas apresentarão um grupo. Portanto, se o predicado em HAVING for avaliado como verdadeiro, você obterá uma linha, caso contrário, nenhuma linha.
fonte
Na ausência da cláusula GROUP BY, a consulta considera toda a relação como um grupo.
por exemplo
fonte