Leçon 4 / 8
Leçon 04 · Partie 1 — Lire des données

Fonctions d'agrégat

Calculer plutôt qu'afficher

Jusqu'ici, SELECT affichait des lignes brutes. Mais parfois, tu veux calculer un résultat : combien de clients ? quel est le prix moyen ? le total des ventes ? C'est le rôle des fonctions d'agrégat.

COUNT() — compter des lignes

COUNT() compte le nombre de lignes. La forme la plus courante : COUNT(*).

-- Combien de clients au total ?
SELECT COUNT(*) AS total_clients
FROM clients;

-- Combien de clients à Paris ?
SELECT COUNT(*) AS clients_paris
FROM clients
WHERE ville = 'Paris';

SUM() — additionner

SUM() additionne les valeurs d'une colonne numérique.

-- Chiffre d'affaires total
SELECT SUM(montant) AS chiffre_affaires
FROM commandes;

-- Total des ventes de ce mois (avec un filtre WHERE)
SELECT SUM(montant) AS total_mois
FROM commandes
WHERE date_commande >= '2024-04-01';

AVG() — calculer une moyenne

-- Prix moyen des produits
SELECT AVG(prix) AS prix_moyen
FROM produits;

MIN() et MAX() — minimum et maximum

-- Produit le moins cher et le plus cher
SELECT
  MIN(prix) AS prix_min,
  MAX(prix) AS prix_max
FROM produits;
🔢

COUNT(*)

Nombre de lignes dans le résultat

Comptage

SUM(col)

Somme de toutes les valeurs d'une colonne

Addition
📊

AVG(col)

Moyenne arithmétique des valeurs

Moyenne
📉

MIN / MAX

Valeur minimale ou maximale

Extrêmes

GROUP BY : grouper les résultats

Les fonctions ci-dessus calculent sur toute la table. Mais souvent, tu veux calculer par groupe : combien de clients par ville ? le total des ventes par produit ? C'est le rôle de GROUP BY.

-- Nombre de clients par ville
SELECT ville, COUNT(*) AS nb_clients
FROM clients
GROUP BY ville;

Résultat : une ligne par ville, avec le nombre de clients dans chaque ville. C'est comme faire un tableau croisé dynamique dans Excel.

-- Chiffre d'affaires par client
SELECT client_id, SUM(montant) AS total_depense
FROM commandes
GROUP BY client_id
ORDER BY total_depense DESC;

Règle importante avec GROUP BY : dans le SELECT, tu ne peux mettre que les colonnes présentes dans GROUP BY ou des fonctions d'agrégat. Sinon, erreur.

HAVING : filtrer après groupement

WHERE filtre les lignes avant le groupement. HAVING filtre les groupes après le calcul. Utilise HAVING avec des fonctions d'agrégat.

-- Villes avec plus de 5 clients
SELECT ville, COUNT(*) AS nb_clients
FROM clients
GROUP BY ville
HAVING COUNT(*) > 5;
⚠️

WHERE vs HAVING :
WHERE prix < 20 → filtre les lignes avant groupement
HAVING COUNT(*) > 5 → filtre les groupes après calcul
Tu ne peux pas écrire WHERE COUNT(*) > 5 — ça provoque une erreur.

L'ordre complet d'une requête

📐 Ordre des clauses SQL complet
SELECT    colonnes / fonctions agrégat
FROM      table
[WHERE     filtre de lignes]
[GROUP BY  regroupement]
[HAVING    filtre de groupes]
[ORDER BY  tri]
[LIMIT     nombre max de résultats]
// À retenir
  • COUNT(*) compte les lignes, SUM(col) additionne, AVG(col) fait la moyenne
  • MIN(col) et MAX(col) donnent les valeurs extrêmes
  • GROUP BY ville regroupe les résultats par valeur unique de ville
  • HAVING COUNT(*) > 5 filtre les groupes après calcul
  • WHERE filtre avant groupement, HAVING filtre après