La clause HAVING dans un SELECT¶
La clause HAVING permet de filtrer des groupes de données après un GROUP BY.
👉 Elle est utilisée avec des fonctions d’agrégat comme :
- COUNT()
- SUM()
- AVG()
- MIN()
- MAX()
⚠️ Contrairement à WHERE, HAVING filtre des groupes, pas des lignes individuelles.
Syntaxe :
SELECT colonne, fonction_agregat
FROM table
WHERE condition
GROUP BY colonne
HAVING condition_sur_agregat
ORDER BY colonne;
Différence entre WHERE et HAVING¶
| WHERE | HAVING |
|---|---|
| Filtre les lignes | Filtre les groupes |
| S’utilise avant GROUP BY | S’utilise après GROUP BY |
| Ne peut pas utiliser une fonction d’agrégat | Utilise des fonctions d’agrégat |
Exemple¶
Soit la table des ventes :
| idVente | vendeur | montant |
|---|---|---|
| 1 | Marie | 200 |
| 2 | Paul | 150 |
| 3 | Marie | 300 |
| 4 | Paul | 100 |
| 5 | Sophie | 500 |
Objectif : Afficher les vendeurs dont le total des ventes dépasse 300.
SELECT vendeur, SUM(montant) AS "Total ventes"
FROM Vente
GROUP BY vendeur
HAVING SUM(montant) > 300;
Résultat :
| vendeur | total_ventes |
|---|---|
| Marie | 500 |
| Sophie | 500 |
Erreur fréquente¶
❌ Utiliser une fonction d’agrégat dans WHERE :
SELECT vendeur, SUM(montant) AS "Total ventes"
FROM commande
WHERE SUM(montant) > 300
GROUP BY vendeur; -- ERREUR, WHERE s'exécute avant le GROUP BY et ne peut donc pas connaître la somme
✔️ Il faut utiliser HAVING :
SELECT vendeur, SUM(montant) AS "Total ventes"
FROM commande
GROUP BY vendeur
HAVING SUM(montant) > 300;
Ordre d'exécution¶
Dans une requête complète :
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
HAVING agit après la création des groupes.