Fonctions d'agrégation — COUNT, SUM, AVG, GROUP BY
Les 5 fonctions (COUNT, COUNT DISTINCT, SUM, AVG, MIN, MAX). GROUP BY — regrouper par catégorie, par mois, par client. HAVING — filtrer les groupes (HAVING vs WHERE). Stats catalogue, CA, panier moyen, top clients.
Concepts Théoriques
Les fonctions d'agrégation calculent une valeur unique à partir de plusieurs lignes : combien de produits avez-vous ? Quel est le chiffre d'affaires total ? Quel est le prix moyen par catégorie ? Combinées avec GROUP BY, elles transforment des milliers de lignes de données brutes en quelques chiffres clés — ceux que les dirigeants utilisent pour prendre des décisions.
Sans agrégation, vous avez une liste de 200 commandes. Avec agrégation, vous avez "CA du mois : 1 250 000 FCFA, 45 commandes, panier moyen 27 778 FCFA". C'est la différence entre des données et de l'information.
Les 6 fonctions d'agrégation
- COUNT(*) — nombre total de lignes. Compte TOUTES les lignes, y compris celles avec des NULL.
- COUNT(colonne) — nombre de lignes NON NULL dans cette colonne. COUNT(compare_price) compte seulement les produits en promo.
- COUNT(DISTINCT colonne) — nombre de valeurs UNIQUES. COUNT(DISTINCT city) = combien de villes différentes, pas combien de clients.
- SUM(colonne) — somme. SUM(price * stock) = valeur totale du stock en FCFA. Ignore les NULL.
- AVG(colonne) — moyenne. AVG(price) = prix moyen. Ignore les NULL (ne divise pas par les lignes NULL).
- MIN(colonne) / MAX(colonne) — valeur minimale / maximale. Fonctionnent aussi sur les dates (MIN(created_at) = plus ancienne commande) et les textes (MIN(name) = premier alphabétiquement).
GROUP BY — regrouper et calculer par groupe
Sans GROUP BY, une fonction d'agrégation retourne UNE seule ligne pour toute la table. Avec GROUP BY, elle retourne UNE ligne par groupe.
SELECT category_id, COUNT(*) AS nb_produits, AVG(price) AS prix_moyen FROM products GROUP BY category_id;
Résultat : une ligne par catégorie. MySQL regroupe les produits par category_id et calcule COUNT et AVG pour chaque groupe.
Règle essentielle : dans un SELECT avec GROUP BY, chaque colonne doit être soit listée dans le GROUP BY, soit à l'intérieur d'une fonction d'agrégation. SELECT category_id, name, COUNT(*) est invalide parce que name n'est ni groupé ni agrégé — MySQL ne sait pas quel "name" choisir parmi les 5 produits du groupe.
Vous pouvez grouper par plusieurs colonnes : GROUP BY YEAR(created_at), MONTH(created_at) regroupe par mois.
HAVING — filtrer les groupes (pas les lignes)
WHERE filtre les lignes AVANT le regroupement. HAVING filtre les groupes APRÈS.
WHERE price > 10000 → élimine les produits individuels avant de grouper. HAVING AVG(price) > 10000 → élimine les GROUPES dont la moyenne est ≤ 10 000.
WHERE ne peut pas utiliser les fonctions d'agrégation (WHERE COUNT(*) > 3 est une erreur). HAVING peut. L'ordre dans la requête : SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT.