Le tri du linge
Avant de laver, on fait des tas par couleur (GROUP BY couleur), puis on compte les pièces de chaque tas (COUNT). Chaque tas devient une seule ligne : « blanc : 12 pièces ».
SELECT couleur, COUNT(*) FROM linge GROUP BY couleur;
Utiliser les fonctions du SGBD (texte, nombres, dates), résumer des lignes avec COUNT, SUM, AVG, MIN, MAX, regrouper avec GROUP BY et filtrer les groupes avec HAVING.
Fin du mois à Souk Atlas : la présidente veut des chiffres. Combien de commandes ? Quel chiffre d'affaires par catégorie ? Quel est le prix moyen des poteries ? Quels clients ont commandé plus de deux fois ? On ne lit plus des lignes une par une : on les résume. C'est le travail des fonctions d'agrégation et de GROUP BY.
Les 12 produits, avec leur catégorie (1 Poterie, 2 Cosmétique, 3 Textile).
| Famille | Fonctions courantes | Exemple → résultat |
|---|---|---|
| Texte | CONCAT, UPPER, LOWER, LENGTH, SUBSTRING, TRIM | UPPER('fès') → FÈS |
| Nombres | ROUND, ABS, CEIL, FLOOR | ROUND(216.256, 2) → 216.26 |
| Dates | NOW, CURDATE, YEAR, MONTH, DAY, DATEDIFF | YEAR('2025-03-09') → 2025 |
| Conditions | IFNULL, IF, CASE WHEN | IFNULL(email, 'non renseigné') |
SELECT COUNT(*) AS nb_produits, -- 12
SUM(stock) AS pieces, -- 368
ROUND(AVG(prix),2) AS prix_moyen, -- 216.25
MIN(prix) AS moins_cher, -- 30
MAX(prix) AS plus_cher -- 1200
FROM produits;
SELECT categorie_id, COUNT(*) AS nb, ROUND(AVG(prix), 2) AS prix_moyen
FROM produits
GROUP BY categorie_id;
Résultat :
categorie_id | nb | prix_moyen
1 | 4 | 198.75
2 | 4 | 61.25
3 | 4 | 388.75
La catégorie 4 (Bijoux) n’a aucun produit : elle n’apparaît pas, puisqu’il n’y a aucune ligne à regrouper.
Avant de laver, on fait des tas par couleur (GROUP BY couleur), puis on compte les pièces de chaque tas (COUNT). Chaque tas devient une seule ligne : « blanc : 12 pièces ».
SELECT couleur, COUNT(*) FROM linge GROUP BY couleur;
WHERE trie les pièces avant de faire les tas (« seulement les vêtements, pas les draps »). HAVING regarde les tas déjà faits (« seulement les tas de plus de 10 pièces »).
Le résultat de chaque requête s'affichera ici.
Consignes 0 / 5
Affichez pour chaque client : son nom complet en une colonne (« Amina BENALI »), et l'année de son inscription.
SELECT CONCAT(prenom, ' ', UPPER(nom)) AS nom_complet, YEAR(date_inscription) AS annee FROM clients;
Calculez le chiffre d'affaires (quantité × prix unitaire) de chaque mois, en ignorant les commandes annulées.
SELECT MONTH(o.date_commande) AS mois, SUM(l.quantite * l.prix_unitaire) AS ca FROM commandes o JOIN lignes_commande l ON l.commande_id = o.id WHERE o.statut <> 'annulée' GROUP BY MONTH(o.date_commande) ORDER BY mois;
Pourquoi cette requête est-elle refusée ? SELECT categorie_id, AVG(prix) FROM produits WHERE AVG(prix) > 100 GROUP BY categorie_id;
-- WHERE filtre les lignes AVANT le regroupement : -- la moyenne n'existe pas encore. On filtre les groupes avec HAVING : SELECT categorie_id, AVG(prix) FROM produits GROUP BY categorie_id HAVING AVG(prix) > 100;