WHERE ou HAVING ? Les quatre combinaisons
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 16 — SQL : jointures, agrégation et requêtes imbriquées
Énoncé
En exploitant les tables emprunt et usager, écrire les requêtes SQL renvoyant : (a) le nombre d'emprunts par usager ; (b) le nombre d'emprunts du mois d'octobre par usager ; (c) la liste des usagers ayant effectué au moins 2 emprunts au total ; (d) la liste des usagers ayant effectué au moins 2 emprunts durant le seul mois d'octobre. Distinguer le rôle des clauses WHERE et HAVING dans ces calculs.
Corrigé
-- (a) Nombre d'emprunts par usager
SELECT nom, COUNT(*) AS nb FROM emprunt
JOIN usager ON emprunt.id_usager = usager.id_usager
GROUP BY usager.id_usager, nom;
-- (b) Nombre d'emprunts d'octobre par usager (utilisation de WHERE)
SELECT nom, COUNT(*) AS nb FROM emprunt
JOIN usager ON emprunt.id_usager = usager.id_usager
WHERE jour >= '2025-10-01'
GROUP BY usager.id_usager, nom;
-- (c) Usagers ayant fait au moins 2 emprunts (utilisation de HAVING)
SELECT nom, COUNT(*) AS nb FROM emprunt
JOIN usager ON emprunt.id_usager = usager.id_usager
GROUP BY usager.id_usager, nom
HAVING COUNT(*) >= 2;
-- (d) Usagers ayant fait au moins 2 emprunts en octobre (WHERE + HAVING)
SELECT nom, COUNT(*) AS nb FROM emprunt
JOIN usager ON emprunt.id_usager = usager.id_usager
WHERE jour >= '2025-10-01'
GROUP BY usager.id_usager, nom
HAVING COUNT(*) >= 2;
WHEREagit sur les lignes de données individuelles, avant le regroupement. Dans la question (b), il filtre les emprunts pour ne retenir que ceux d'octobre. Un usager comme David, n'ayant aucun emprunt en octobre, voit ses lignes supprimées avant le calcul de l'agrégat.HAVINGintervient sur les groupes, après le regroupement et le calcul de l'agrégation. Dans la question (c), le calcul du nombre total d'emprunts est effectué pour tous les usagers, puis seuls ceux dont l'effectif est sont conservés.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.