HAVING – Filtrer les groupes
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes
La condition HAVING en SQL est presque similaire à WHERE, à la seule différence que HAVING permet de filtrer en utilisant des fonctions d’agrégation telles que SUM(), COUNT(), AVG(), MIN() ou MAX().
Syntaxe
Section titled “Syntaxe”L’utilisation de HAVING s’effectue de la manière suivante :
SELECT colonne1, SUM(colonne2)FROM nom_tableGROUP BY colonne1HAVING fonction(colonne2) operateur valeurCela permet donc de sélectionner les colonnes de la table « nom_table » en groupant les lignes qui ont des valeurs identiques sur la colonne « colonne1 » et en ne retournant que les groupes qui respectent la condition du HAVING.
💡 Important :
HAVINGest très souvent utilisé en même temps queGROUP BY, bien que ce ne soit pas obligatoire. SansGROUP BY,HAVINGse comporte comme unWHEREsur les fonctions d’agrégation.
Différence entre WHERE et HAVING
Section titled “Différence entre WHERE et HAVING”| Clause | Filtre sur | S’applique |
|---|---|---|
WHERE |
Lignes individuelles | Avant le GROUP BY |
HAVING |
Groupes (résultats d’agrégation) | Après le GROUP BY |
💡 Bon à savoir :
WHEREfiltre les lignes avant le regroupement, tandis queHAVINGfiltre les groupes après le regroupement. On ne peut pas utiliser de fonctions d’agrégation dans unWHEREclassique.
Exemple concret
Section titled “Exemple concret”Imaginons une table « achat » qui contient les achats de différents clients avec le coût du panier pour chaque achat :
Table « achat »
Section titled “Table « achat »”| id | client | tarif | date_achat |
|---|---|---|---|
| 1 | Pierre | 102 | 2012-10-23 |
| 2 | Simon | 47 | 2012-10-27 |
| 3 | Marie | 18 | 2012-11-05 |
| 4 | Marie | 20 | 2012-11-14 |
| 5 | Pierre | 160 | 2012-12-03 |
Si dans cette table on souhaite récupérer la liste des clients qui ont commandé plus de 40€, toutes commandes confondues, alors il est possible d’utiliser la requête suivante :
SELECT client, SUM(tarif) AS total_achatsFROM achatGROUP BY clientHAVING SUM(tarif) > 40;Résultat :
| client | total_achats |
|---|---|
| Pierre | 262 |
| Simon | 47 |
La cliente « Marie » a cumulé 38€ d’achat (un achat de 18€ et un autre de 20€), ce qui est inférieur à la limite de 40€ imposée par HAVING. En conséquence, cette ligne n’est pas affichée dans le résultat.
Utiliser HAVING avec d’autres fonctions d’agrégation
Section titled “Utiliser HAVING avec d’autres fonctions d’agrégation”Compter les clients ayant effectué plus de 1 achat
Section titled “Compter les clients ayant effectué plus de 1 achat”SELECT client, COUNT(*) AS nb_achatsFROM achatGROUP BY clientHAVING COUNT(*) > 1;Résultat :
| client | nb_achats |
|---|---|
| Pierre | 2 |
| Marie | 2 |
Clients dont le panier moyen dépasse 50€
Section titled “Clients dont le panier moyen dépasse 50€”SELECT client, AVG(tarif) AS panier_moyenFROM achatGROUP BY clientHAVING AVG(tarif) > 50;Résultat :
| client | panier_moyen |
|---|---|
| Pierre | 131 |
(Remarque : Simon n’est pas affiché car son panier moyen est de 47€, inférieur à 50€.)
Combiner WHERE et HAVING
Section titled “Combiner WHERE et HAVING”Il est tout à fait possible d’utiliser WHERE et HAVING ensemble. WHERE filtre les lignes avant le regroupement, et HAVING filtre les groupes après.
Exemple : Obtenir les clients qui ont effectué au moins un achat après le 1er novembre 2012 et dont le total des achats dépasse 100€.
SELECT client, SUM(tarif) AS total_achatsFROM achatWHERE date_achat >= '2012-11-01'GROUP BY clientHAVING SUM(tarif) > 100;Résultat :
| client | total_achats |
|---|---|
| Pierre | 160 |
Explication :
- Pierre a un achat le 3 décembre 2012 (160€) → total 160€ > 100€
- Marie a deux achats après le 1er novembre (18€ + 20€ = 38€) → total 38€ < 100€, exclue
- Simon n’a aucun achat après le 1er novembre → exclu par le
WHERE
Ordre des clauses dans une requête complète
Section titled “Ordre des clauses dans une requête complète”Voici l’ordre complet des clauses dans une requête SQL utilisant toutes les fonctionnalités :
SELECT colonnesFROM tableWHERE conditionGROUP BY colonneHAVING condition_sur_groupeORDER BY colonneLIMIT nombre;Bonnes pratiques
Section titled “Bonnes pratiques”- Utilisez
HAVINGuniquement pour filtrer sur des fonctions d’agrégation. - Pour filtrer sur des lignes individuelles, utilisez
WHERE(plus performant car il réduit le nombre de lignes avant le regroupement). - Donnez des alias aux colonnes agrégées pour améliorer la lisibilité des résultats.
HAVINGpeut être utilisé sansGROUP BY, mais c’est rarement utile (cela revient à filtrer un résultat unique).
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment filtrer les groupes avec HAVING. Mais comment effectuer des traitements conditionnels dans vos requêtes, comme des instructions SI / SINON ?
👉 Chapitre 15 : CASE WHEN – Conditions SI / SINON
Bonne continuation !
Junior TSAFACK – 08/08/2026