Leçon 7 / 15

Filtrer les groupes avec HAVING

15 min SQL — jointures, agrégats et sous-requêtes Gratuit

Objectif : Sélectionner les adhérents ayant dépassé un nombre donné d’emprunts en filtrant les groupes avec HAVING.

Un total par adhérent ne suffit pas toujours : vous pouvez vouloir repérer uniquement les personnes qui ont emprunté plus souvent que les autres. Si vous placez le seuil au mauvais endroit, la requête filtre des lignes individuelles au lieu de filtrer le total calculé.

Vous allez partir de la synthèse par adhérent déjà construite avec LEFT JOIN et GROUP BY. Vous ajouterez un seuil sur le nombre d’emprunts, sans exclure les lignes de la table avant que le total soit calculé.

Filtrer des groupes, pas des lignes

WHERE filtre les lignes disponibles avant leur regroupement. HAVING filtre les groupes après leur formation et peut donc porter sur une fonction d’agrégation comme COUNT. Dans cette leçon, le seuil concerne le nombre total d’emprunts de chaque adhérent : il appartient à HAVING, pas à WHERE.

La requête ci-dessous conserve les adhérents sans emprunt pendant la jointure, puis forme un groupe pour chacun. Le filtre final ne garde que les groupes dont le compteur est supérieur ou égal à trois ; remplacez ce seuil par la valeur adaptée à votre rapport.

SQL
SELECT
    a.id,
    a.nom,
    COUNT(e.adherent_id) AS nombre_emprunts
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
GROUP BY
    a.id,
    a.nom
HAVING COUNT(e.adherent_id) >= 3;
Résultat attendu
La requête renvoie une ligne par adhérent ayant au moins trois emprunts : son identifiant, son nom et le nombre d’emprunts comptabilisés. Les adhérents sous le seuil ne figurent pas dans le résultat.

Le compteur utilise e.adherent_id : dans une ligne conservée par le LEFT JOIN sans emprunt correspondant, cette colonne est NULL et n’est pas comptée. La syntaxe et le rôle du regroupement sont ceux présentés dans « Regrouper les résultats » ; ici, la nouvelle partie est la condition placée après HAVING.

Comprendre l’ordre d’évaluation

Pour raisonner sur une requête agrégée, lisez-la selon son ordre logique de traitement : les tables sont d’abord reliées, puis les lignes sont éventuellement filtrées par WHERE. MariaDB forme ensuite les groupes avec GROUP BY, calcule les agrégats, applique HAVING, puis construit les colonnes demandées par SELECT.

Cet ordre explique pourquoi une condition de groupe ne peut pas être appliquée par un WHERE placé avant le regroupement : à cette étape, le total par adhérent n’existe pas encore. Dans MariaDB, écrivez donc l’expression d’agrégation dans HAVING, par exemple HAVING COUNT(e.adherent_id) >= 3.

Appliquer plusieurs filtres

Vous pouvez combiner les deux clauses lorsqu’elles répondent à des questions différentes. Par exemple, un filtre de lignes dans WHERE peut limiter les emprunts à une période ; HAVING peut ensuite conserver les adhérents qui atteignent un seuil dans les lignes restantes. Ce cas nécessite une colonne de date définie dans le schéma de votre projet ; n’ajoutez pas de filtre de période tant que cette colonne et la période attendue ne sont pas établies.

Le résultat de l’exemple est une liste d’adhérents dont le compteur atteint le seuil choisi. Pour un seuil de trois, une personne avec exactement trois emprunts est conservée grâce à >=, tandis qu’une personne avec deux emprunts est écartée. Si vous voulez strictement plus de trois emprunts, remplacez l’opérateur par >.

À retenir

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.