Non.
Ils n'ont pas à coexister, comme le prouve le fait que la requête suivante dans Oracle fonctionne:
select * from dual having 1 = 1;
De même, dans PostgreSQL, la requête suivante fonctionne:
select 1 having 1 = 1;
having
Ne nécessite donc pasgroup by
.
Avoir est appliqué après la phase d'agrégation et doit être utilisé si vous souhaitez filtrer les résultats d'agrégation. Donc, l'inverse n'est pas vrai, et ce qui suit ne fonctionnera pas:
select a, count(*) as c
from mytable
group by a
where c > 1;
Vous devez remplacer where
par having
dans ce cas, comme suit:
select a, count(*) as c
from mytable
group by a
having c > 1;
NB Le formulaire de requête suivant fonctionnera également:
select *
from (
select a, count(*) as c
from mytable
group by a
)
where c > 1;
Vous pouvez voir que l'utilisation having
est simplement une version abrégée de cette dernière requête.
En résumé, having
est appliqué après la group by
phase alors qu'il where
est appliqué avant la group by
phase.
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);