Exercice 1 : Requêtes SELECT, WHERE, JOIN, GROUP BY
🌐 Énoncé du problème / Cadre d’étude
Section titled “🌐 Énoncé du problème / Cadre d’étude”En tant qu’examinateur, j’attends des candidats en MPSI une maîtrise parfaite des opérations relationnelles fondamentales, traduites en langage SQL. Cet exercice s’articule autour d’un système de gestion de base de données pour une bibliothèque universitaire.
Le schéma relationnel est constitué de trois tables :
-
Livre(contenant les ouvrages) :id_livre(INTEGER, Clé primaire)titre(VARCHAR)auteur(VARCHAR)annee(INTEGER)domaine(VARCHAR, ex :'Informatique','Mathematiques', etc.)
-
Abonne(contenant les étudiants et personnels inscrits) :id_abonne(INTEGER, Clé primaire)nom(VARCHAR)prenom(VARCHAR)departement(VARCHAR, ex :'MPSI','MP','PSI')
-
Emprunt(contenant l’historique et les prêts en cours) :id_emprunt(INTEGER, Clé primaire)id_livre(INTEGER, Clé étrangère référantLivre(id_livre))id_abonne(INTEGER, Clé étrangère référantAbonne(id_abonne))date_emprunt(DATE)rendu(BOOLEAN :TRUEsi le livre a été restitué,FALSEsinon)
❓ Questions progressives
Section titled “❓ Questions progressives”- Question 1 (Extraction simple) : Écrire une requête SQL qui retourne le titre et l’année de tous les livres du domaine
'Informatique'publiés après l’année (incluse), triés par ordre chronologique inverse, puis par titre alphabétique. - Question 2 (Jointure et filtrage) : Écrire une requête SQL qui affiche les noms et prénoms des abonnés du département
'MPSI'qui ont emprunté au moins un livre (rendu ou non). On veillera à éviter les doublons dans le résultat. - Question 3 (Agrégation et regroupement) : Écrire une requête SQL permettant d’obtenir, pour chaque domaine, le nombre total de livres référencés dans la base. Le résultat comportera deux colonnes :
domaineetnb_livres. - Question 4 (Jointure complexe et agrégation avec condition) : Écrire une requête SQL qui retourne le nom et le prénom des abonnés ayant emprunté strictement plus de livres au total.
💡 Pistes & Indications méthodologiques
Section titled “💡 Pistes & Indications méthodologiques”- Pour la Question 1 : Pensez à l’utilisation conjointe de
WHEREavec des opérateurs logiques (AND), ainsi qu’à la clauseORDER BY ... DESC, ... ASC. - Pour la Question 2 : Une jointure (
JOIN) est nécessaire pour lier les abonnés à leurs emprunts. L’opérateurDISTINCTest souvent indispensable lorsqu’un abonné effectue plusieurs actions correspondantes. - Pour la Question 3 : L’utilisation de
GROUP BYcombinée avec la fonction d’agrégationCOUNT(*)(ouCOUNT(id_livre)) est ici standard. - Pour la Question 4 : C’est un classique des concours : le filtrage sur un résultat d’agrégation ne se fait pas avec
WHERE, mais avec la clauseHAVINGaprès leGROUP BY.
📋 Corrigé détaillé pas à pas
Section titled “📋 Corrigé détaillé pas à pas”Correction de la Question 1
Section titled “Correction de la Question 1”Objectif: Sélectionner, filtrer et trier.*
SELECT titre, anneeFROM LivreWHERE domaine = 'Informatique' AND annee >= 2015ORDER BY annee DESC, titre ASC;Analyse de l’examinateur : On teste ici la maîtrise des clauses fondamentales. Le respect de la casse pour les chaînes de caractères et les types numériques est évalué. Le tri multiple (DESC puis ASC) est un classique souvent demandé.
Correction de la Question 2
Section titled “Correction de la Question 2”Objectif: Croiser des tables et éliminer les doublons.*
SELECT DISTINCT A.nom, A.prenomFROM Abonne AS AJOIN Emprunt AS E ON A.id_abonne = E.id_abonneWHERE A.departement = 'MPSI';Analyse de l’examinateur : L’utilisation d’alias (AS A, AS E) est vivement conseillée pour la lisibilité. Le mot-clé DISTINCT est crucial : un élève qui l’oublie perd des points car un étudiant MPSI ayant emprunté livres apparaîtrai fois dans le résultat.
Correction de la Question 3
Section titled “Correction de la Question 3”Objectif: Regrouper et compter.*
SELECT domaine, COUNT(*) AS nb_livresFROM LivreGROUP BY domaine;Analyse de l’examinateur : La présence de GROUP BY impose que toutes les colonnes sélectionnées soient soit des fonctions d’agrégation, soit présentes dans le GROUP BY. Le renommage avec AS est apprécié pour la clarté du jeu de résultats retourné.
Correction de la Question 4
Section titled “Correction de la Question 4”Objectif: Filtrer après agrégation.*
SELECT A.nom, A.prenomFROM Abonne AS AJOIN Emprunt AS E ON A.id_abonne = E.id_abonneGROUP BY A.id_abonne, A.nom, A.prenomHAVING COUNT(E.id_emprunt) > 3;Analyse de l’examinateur : C’est la question discriminante du problème.
- Erreur classique à éviter : utiliser
WHERE COUNT(...) > 3(ce qui provoque une erreur syntaxique car leWHEREs’exécute avant le regroupement). - Note de rigueur : dans les standards SQL stricts (et exigés aux concours), si l’on groupe par
id_abonne, il est préférable d’inclure toutes les colonnes affichées (nom,prenom) dans leGROUP BYou d’utiliser la clé primaire comme garant d’unicité.