Pour utiliser HAVING
dans les requêtes SQL, doit-il y avoir un GROUP BY
pour agréger les noms des colonnes?
Existe-t-il des cas particuliers où il est possible d'utiliser HAVING
sans GROUP BY
dans les requêtes SQL?
Doivent-ils coexister en même temps?
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;
Donc having
ne fait pas nécessite group 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 de having
est simplement une version abrégée de cette dernière requête.
En résumé, having
est appliqué après le group by
phase alors que where
est appliqué avant le group by
phase.
Avoir est utilisé pour filtrer les groupes.
la clause where est utilisée pour filtrer les lignes.
En l'absence de clause GROUP BY, la requête considère la relation entière comme un seul groupe.
par exemple.
select count(*)
from dual
having count(*) > 5;
AVOIR filtre les groupes. Si vous n'avez pas de cause GROUP BY, toutes les lignes présentent un groupe. Donc, si le prédicat dans HAVING est évalué comme vrai, vous obtenez une ligne, sinon aucune ligne.