Para usar HAVINGem consultas SQL, deve haver um GROUP BYpara agregar os nomes das colunas?
Existem casos especiais em que é possível usar HAVINGsem GROUP BYconsultas SQL?
Eles devem coexistir ao mesmo tempo?
Para usar HAVINGem consultas SQL, deve haver um GROUP BYpara agregar os nomes das colunas?
Existem casos especiais em que é possível usar HAVINGsem GROUP BYconsultas 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 wherepor havingneste 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 byfase, enquanto whereé aplicado antes da group byfase.
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 dualtabela especial . Eu não acho que nenhuma dessas sintaxes seja ANSI / ISO SQL (que requer FROM).
frommas a referência count(*)na havingcláusula sem qualquer indicação sobre quais colunas estão sendo agregadas. Presumivelmente, ele agrega todas as colunas da selectclá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);