web-dev-qa-db-fra.com

Utilisation de HAVING sans GROUP BY dans les requêtes SQL

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?

28
Computernerd

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 havingne 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.

27
Colin 't Hart

Avoir est utilisé pour filtrer les groupes.

la clause where est utilisée pour filtrer les lignes.

5
sqlengineer

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;
2
Vikrant Singh

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.

2
msi77