Aller au contenu

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

Flux