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 wherepar havingdans 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 havingest simplement une version abrégée de cette dernière requête.
En résumé, havingest appliqué après la group byphase alors qu'il whereest appliqué avant la group byphase.
SELECT MIN(a) AS mina, MAX(a) As maxa FROM mytable HAVING MIN(a) < MAX(a);