Les clauses WHERE et HAVING ont des usages en apparence similaires mais en réalité leurs rôles sont différents.
SELECT [Stock N].Référence, [Stock N].Désignation, Sum([Stock N].Quantité) AS SommeDeQuantité FROM [Stock N] WHERE [Stock N].PU>50 GROUP BY [Stock N].Référence, [Stock N].Désignation HAVING (((Sum([Stock N].Quantité))>1000));
Ainsi, leurs fonctions se résument ainsi :
- WHERE : La clause WHERE conditionne l’extraction de données au respect de certains critères, cf détails sur la rédaction de requêtes SQL avec la clause WHERE ;
- HAVING : La clause HAVING positionnée à la fin d’une requête regroupement permet d’ajouter un critère (à l’aide d’opérateurs de comparaison) afin de restreindre le nombre de lignes compris dans le résultat de la requête.
Ces deux clauses sont combinables dans une requête regroupement (et uniquement dans ce type de requête). Dans ce cas, la clause WHERE conditionne les données avant le regroupement et HAVING conditionne les données une fois regroupées. Dans la construction de la requête, WHERE se positionne avant GROUP BY et HAVING après.
Dans l’exemple qui précède, la requête va traiter les données de la table Stock (FROM) dont le prix unitaire est supérieur à 50 € (WHERE) puis regrouper (GROUP BY) les références en stock (répondant à ce critère de prix) en additionnant les quantités par référence (SUM) et enfin ne donner en résultat que les références dont la quantité est supérieure à 1000 (clause HAVING).
Approfondir le sujet : Maîtriser le langage de requête SQL / Analyse de données
