Skip to content

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().


L’utilisation de HAVING s’effectue de la manière suivante :

SELECT colonne1, SUM(colonne2)
FROM nom_table
GROUP BY colonne1
HAVING fonction(colonne2) operateur valeur

Cela 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 : HAVING est très souvent utilisé en même temps que GROUP BY, bien que ce ne soit pas obligatoire. Sans GROUP BY, HAVING se comporte comme un WHERE sur les fonctions d’agrégation.


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 : WHERE filtre les lignes avant le regroupement, tandis que HAVING filtre les groupes après le regroupement. On ne peut pas utiliser de fonctions d’agrégation dans un WHERE classique.


Imaginons une table « achat » qui contient les achats de différents clients avec le coût du panier pour chaque 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_achats
FROM achat
GROUP BY client
HAVING 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_achats
FROM achat
GROUP BY client
HAVING 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_moyen
FROM achat
GROUP BY client
HAVING 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€.)


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_achats
FROM achat
WHERE date_achat >= '2012-11-01'
GROUP BY client
HAVING 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 colonnes
FROM table
WHERE condition
GROUP BY colonne
HAVING condition_sur_groupe
ORDER BY colonne
LIMIT nombre;

  • Utilisez HAVING uniquement 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.
  • HAVING peut être utilisé sans GROUP BY, mais c’est rarement utile (cela revient à filtrer un résultat unique).

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