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
ComptageSUM(col)
Somme de toutes les valeurs d'une colonne
AdditionAVG(col)
Moyenne arithmétique des valeurs
MoyenneMIN / MAX
Valeur minimale ou maximale
ExtrêmesGROUP 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
FROM table
[WHERE filtre de lignes]
[GROUP BY regroupement]
[HAVING filtre de groupes]
[ORDER BY tri]
[LIMIT nombre max de résultats]
COUNT(*)compte les lignes,SUM(col)additionne,AVG(col)fait la moyenneMIN(col)etMAX(col)donnent les valeurs extrêmesGROUP BY villeregroupe les résultats par valeur unique devilleHAVING COUNT(*) > 5filtre les groupes après calculWHEREfiltre avant groupement,HAVINGfiltre après