Jointure interne avec agrégats et clause HAVING¶
Lorsqu'on combine plusieurs tables et qu'on souhaite regrouper des données pour effectuer des calculs (somme, moyenne, nombre, etc.), on utilise :
- INNER JOIN → pour relier les tables
- GROUP BY → pour regrouper les résultats
- Fonctions d’agrégat → SUM(), COUNT(), AVG(), MIN(), MAX()
- HAVING → pour filtrer les groupes
RAPPEL
Il est important de se rappeler que dès qu'on utilise une fonction d'agrégat dans le SELECT, tous les autres champs extraits doivent être regroupés.
Rappel : la jointure interne (INNER JOIN)¶
Une jointure interne retourne seulement les lignes pour lesquelles il existe une correspondance dans les deux tables.
Exemple de structure
Table clients
| id_client | nom |
|---|---|
| 1 | Marie |
| 2 | Thomas |
| 3 | Sophie |
Table commandes
| id_commande | id_client | montant |
|---|---|---|
| 101 | 1 | 120 |
| 102 | 1 | 80 |
| 103 | 2 | 50 |
Afficher toutes les commandes avec le nom du client :
SELECT nomClient, montantCommande
FROM clients
INNER JOIN commandes
ON idClient = idClientCommande;
Résultat :
| nom | montant |
|---|---|
| Marie | 120 |
| Marie | 80 |
| Thomas | 50 |
Ajouter des agrégats avec GROUP BY¶
Supposons qu'on veut connaître :
👉 Le total des achats par client
SELECT nomClient, SUM(montantCommande) AS total_achats
FROM clients
INNER JOIN commandes
ON idClient = idClientCommande
GROUP BY nomClient;
Résultat :
| nom | total_achats |
|---|---|
| Marie | 200 |
| Thomas | 50 |
🔎 Explication :
- La jointure associe les commandes aux clients
- GROUP BY regroupe les lignes par client
- SUM() calcule le total pour chaque groupe
Pourquoi la clause HAVING ?¶
⚠️ WHERE filtre les lignes AVANT le regroupement
⚠️ HAVING filtre les groupes APRÈS le regroupement
Si on veut :
👉 Afficher seulement les clients ayant dépensé plus de 100 $
SELECT nomClient, SUM(montantCommande) AS total_achats
FROM clients
INNER JOIN commandes
ON idClient = idClientCommande
GROUP BY nomClient
HAVING SUM(montantCommande) > 100;
Résultat :
| nom | total_achats |
|---|---|
| Marie | 200 |
Utiliser WHERE et HAVING¶
Puisque WHERE et HAVING ont chacun leur utilisé spécifique, on peut utiliser les deux ensemble :
👉 Trouver les clients ayant passé des commandes en 2025
👉 ET ayant dépensé plus de 100 $
SELECT nomClient, SUM(montantCommande) AS total_achats
FROM clients
INNER JOIN commandes
ON idClient = idClientCommande
WHERE dateCommande >= '2025-01-01'
GROUP BY nomClient
HAVING SUM(montantCommande) > 100;
✔ WHERE filtre les lignes
✔ GROUP BY regroupe
✔ HAVING filtre les groupes
🎯 Résumé¶
| Élément | Rôle |
|---|---|
| INNER JOIN | Relie les tables |
| WHERE | Filtre les lignes |
| GROUP BY | Regroupe les lignes |
| SUM(), COUNT()... | Calcule une valeur par groupe |
| HAVING | Filtre les groupes |
Ordre logique d’exécution¶
