Agrégation · 20 min
HAVING : filtrer les groupes
Apprendre à filtrer les groupes avec HAVING après GROUP BY, notamment sur des agrégats (COUNT, AVG...).
Contexte
WHERE filtre les lignes individuelles ; HAVING filtre les groupes (après regroupement).
Explication
HAVING condition filtre sur les agrégats calculés par GROUP BY. La condition peut utiliser COUNT, AVG, SUM, MIN, MAX.
Règles :
WHEREfiltre les lignes avant le GROUP BYHAVINGfiltre les groupes après le GROUP BY- ne pas utiliser WHERE sur une fonction d'agrégation
Syntaxe :
SELECT col1, AVG(col) AS moy FROM une_table GROUP BY col1 HAVING AVG(col)>=seuil;
Exemple guidé
Étudiants avec moyenne générale >= 10 :
SELECT etudiant_id, ROUND(AVG(note),2) AS moy FROM notes GROUP BY etudiant_id HAVING AVG(note)>=10 ORDER BY moy DESC;
Résultat :
| etudiant_id | moy |
|---|---|
| 10 | 13.17 |
| 3 | 13.0 |
| 5 | 12.83 |
| 1 | 12.63 |
| 11 | 12.5 |
| 6 | 12.5 |
| 2 | 12.5 |
| 8 | 12.25 |
| 4 | 12.25 |
| 7 | 12.0 |
HAVING filtre après le GROUP BY, c'est-à-dire sur les agrégats calculés. WHERE ne peut pas filtrer sur une fonction d'agrégation.
À retenir
HAVING = filtre de groupes (sur agrégats). Ne pas utiliser WHERE sur agrégats. Combinaison WHERE + GROUP BY + HAVING + ORDER BY + LIMIT possible.