Fondamentaux

WHERE ou HAVING : où placer votre filtre ?

WHERE définit les lignes du calcul ; HAVING décide quels groupes calculés restent visibles.

Équipe SQL.tn8 min
Des lignes sont filtrées avant regroupement puis les groupes passent un second seuil

La condition porte-t-elle sur une ligne ou sur un groupe ?

Un statut ou une date appartient à une ligne source : utilisez WHERE. Un total, une moyenne ou un nombre de commandes existe après regroupement : utilisez HAVING.

L’ordre modifie le sens. Exclure des lignes annulées avant SUM n’est pas équivalent à calculer tous les statuts puis masquer certains groupes.

Les noms, montants et données utilisés dans cet article sont fictifs et créés pour l’apprentissage.

La requête expliquée

Commencez par définir ce que doit représenter une ligne du résultat. Cette décision détermine les colonnes, les regroupements et les contrôles nécessaires.

L’exemple suivant isole le mécanisme principal. Exécutez-le, observez le résultat, puis modifiez une seule clause à la fois pour comprendre son effet.

Clients avec au moins deux commandes payées
SELECT id_client, COUNT(*) AS commandes_payees
FROM commandes
WHERE statut = 'Payée'
GROUP BY id_client
HAVING COUNT(*) >= 2;

Lire le résultat comme un analyste

WHERE prépare uniquement les commandes payées. GROUP BY crée une ligne par client, puis HAVING conserve les volumes d’au moins deux.

Séparez mentalement ces étapes et contrôlez le nombre de lignes à chacune lorsque la requête devient complexe.

  • Formuler le périmètre de lignes.
  • Définir le grain des groupes.
  • Appliquer le seuil sur l’agrégation.
  • Comparer le total global à la somme des groupes.

Les erreurs qui faussent l’analyse

Une requête peut être valide sans répondre correctement à la question. Les erreurs les plus coûteuses sont souvent silencieuses : mauvais périmètre, ligne multipliée ou valeur absente interprétée comme zéro.

Avant de partager le résultat, confrontez-le à un petit échantillon calculé à la main et conservez la définition du périmètre avec la requête.

  • Écrire WHERE COUNT(*).
  • Filtrer montant >= seuil au lieu de SUM(montant) >= seuil.
  • Oublier GROUP BY.
  • Comparer des groupes construits avec des périmètres différents.

Passez à la pratique

Faites l’exercice HAVING sur le panier moyen, puis changez le seuil pour observer les groupes retenus.

Le simulateur SQL de SQL.tn exécute uniquement des requêtes de lecture sur des données fictives dans votre navigateur. Vous pouvez essayer plusieurs écritures et comparer leur résultat sans installer de logiciel.

Mettez ce guide en pratique.

Ouvrez l’exercice associé, exécutez votre requête et comparez le résultat attendu.

Faire l’exercice