Aller au contenu

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 :

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

HAVING agit après la création des groupes.