GROUP BY HAVING VISUALIZER

Par :

,le

Visualiseur GROUP BY SQL

Le GROUP BY regroupe les lignes ayant la même valeur sur une ou plusieurs colonnes, puis applique une fonction d’agrégation. Le HAVING filtre ensuite les groupes selon une condition sur l’agrégat.

Jeu de données
Fonction d’agrégation
1 Sélection des données
La requête définit la table source à lire. Chaque couleur correspond à un groupe futur selon la colonne GROUP BY.
📄 Requête exécutée
2 Regroupement + agrégation
Les lignes de même valeur sont rassemblées. Chaque groupe est une colonne. La ou les fonctions d’agrégation sont calculées par groupe.
Filtre HAVING
Le HAVING s’applique après le GROUP BY. Il teste la condition sur chaque agrégat et élimine les groupes qui ne la satisfont pas. Contrairement au WHERE (qui filtre les lignes), HAVING filtre les groupes.
Groupe conservé Groupe éliminé par HAVING
3 Données renvoyées
Une ligne par groupe . Les colonnes agrégées contiennent les résultats calculés — c’est exactement ce que retourne la requête.
📄 Rappel — requête qui a produit ce résultat
🔗 Lien copié dans le presse-papiers !

Le visualiseur décompose visuellement l’exécution d’une requête GROUP BY en trois étapes distinctes, affichées les unes sous les autres et reliées par des flèches. Chaque groupe reçoit une couleur unique qui se propage de l’étape 1 à l’étape 3, permettant de suivre le devenir de chaque ligne source jusqu’au résultat final. Des cases à cocher permettent de masquer les étapes déjà assimilées pour se concentrer sur une seule.

  • Étape 1 — Sélection : la table source complète est affichée avec un code couleur par groupe futur, et la requête SQL exécutée est rappelée juste au-dessus.
  • Étape 2 — Regroupement : chaque groupe devient un bloc indépendant avec ses lignes internes et ses valeurs agrégées calculées (COUNTSUMAVGMINMAX).
  • Étape HAVING : chaque bloc affiche la condition testée, un badge vert ✅ Conservé ou rouge ❌ Éliminé, et les groupes éliminés sont grisés visuellement.
  • Étape 3 — Résultat : le tableau final affiche une ligne par groupe conservé, avec un résumé indiquant combien de lignes sources ont été traitées, combien de groupes ont été formés, et combien ont passé le filtre HAVING.

Ce que GROUP BY fait réellement sur les données

GROUP BY rassemble toutes les lignes qui partagent la même valeur sur une colonne désignée, puis applique une fonction d’agrégation sur chaque groupe. Le résultat n’est plus une liste de lignes individuelles, mais une ligne unique par groupe avec une valeur calculée. Comprendre ce passage de lignes brutes à des groupes agrégés est la compétence centrale que cet outil permet d’acquérir visuellement.

Le moteur SQL ne trie pas les lignes : il les rassemble logiquement en groupes distincts avant tout calcul. Par exemple, dans la table ventes, les lignes Livres sont regroupées ensemble pour calculer SUM(montant) = 75. Sans visualisation, ce mécanisme reste abstrait et difficile à intérioriser pour un apprenant.

Les 12 jeux de données disponibles

L’outil propose 12 jeux de données répartis en deux catégories, accessibles via un menu déroulant. Les sept premiers exemples illustrent GROUP BY sans HAVING, avec des cas variés : SUM(montant) par catégorie de ventes, AVG(salaire) par département, COUNT(*) par client ou par statut de commande, SUM(prix * quantite) pour un chiffre d’affaires calculé, et MIN + MAX simultanés par fournisseur. Les cinq derniers ajoutent une clause HAVING avec des opérateurs différents (><) pour filtrer les groupes selon une valeur agrégée.

-- Exemple sans HAVING : ventes par catégorie
SELECT   categorie,
         SUM(montant) AS sum_montant
FROM     ventes
GROUP BY categorie;

-- Exemple avec HAVING : clients par ville ayant plus de 5 clients
SELECT   ville,
         COUNT(*) AS nb_clients
FROM     clients
GROUP BY ville
HAVING   COUNT(*) > 5
ORDER BY nb_clients DESC;

La différence entre WHERE et HAVING rendue concrète

WHERE filtre les lignes individuelles avant la formation des groupes. HAVING filtre les groupes après que les agrégats ont été calculés. Cette distinction est l’une des plus importantes et des plus mal comprises en SQL, car les deux clauses semblent syntaxiquement proches.

L’outil la rend évidente en l’absence de tout texte explicatif : dans l’étape HAVING, les lignes sources ont déjà disparu et seuls les blocs agrégés subsistent. Il est alors impossible de confondre les deux niveaux de filtrage, car ils agissent sur des objets visuellement différents — des lignes d’un côté, des blocs de l’autre. Utiliser HAVING sur une colonne non agrégée est une erreur fréquente que cet outil aide à éviter durablement.

-- ✅ Correct : WHERE filtre les lignes avant le GROUP BY
SELECT   departement,
         AVG(salaire) AS avg_salaire
FROM     employes
WHERE    salaire > 2000
GROUP BY departement
HAVING   AVG(salaire) > 3500;

-- ❌ Incorrect : HAVING ne peut pas filtrer une colonne brute non agrégée
SELECT   departement,
         AVG(salaire) AS avg_salaire
FROM     employes
GROUP BY departement
HAVING   salaire > 2000;  -- erreur : salaire n'est pas agrégé

Les fonctions d’agrégation interchangeables

Certains jeux de données exposent un sélecteur de fonction d’agrégation permettant de basculer entre COUNTSUMAVGMIN et MAX sur la même table. Changer de fonction met immédiatement à jour les trois étapes sans recharger la page, ce qui permet de comprendre l’impact de chaque fonction sur les mêmes données sources. Par exemple, passer de COUNT à AVG sur la table commandes montre que le nombre de lignes par groupe reste identique, mais que la valeur agrégée change complètement.

-- Les 5 fonctions sur la même table selon le sélecteur
SELECT client, COUNT(*)        AS total_commandes FROM commandes GROUP BY client;
SELECT client, SUM(total)      AS somme           FROM commandes GROUP BY client;
SELECT client, AVG(total)      AS moyenne         FROM commandes GROUP BY client;
SELECT client, MIN(total)      AS minimum         FROM commandes GROUP BY client;
SELECT client, MAX(total)      AS maximum         FROM commandes GROUP BY client;