Exercice 2 Métropole – Bac NSI 2025 – Jour 2
Une ludothèque municipale a décidé de moderniser sa gestion en créant une base de données informatique. Cette base de données permettra de suivre les jeux disponibles, les emprunts effectués par les adhérents, ainsi que les avis laissés sur les différents jeux.
mots clés: BDD, SQL, programmation
🔎 Voir les exercices similaires ↓
Métropole – Bac NSI 2025 – Jour 2 Énoncé de l'exercice 2
Cet exercice porte sur les bases de données relationnelles, le langage SQL et la programmation.
Une ludothèque municipale a décidé de moderniser sa gestion en créant une base de données informatique. Cette base de données permettra de suivre les jeux disponibles, les emprunts effectués par les adhérents, ainsi que les avis laissés sur les différents jeux. Pour commencer, quatre tables principales ont été identifiées : jeu, adhérent, emprunt et avis. Ces tables et leurs relations vont permettre de stocker toutes les informations essentielles au bon fonctionnement de la ludothèque. On va considérer que la ludothèque n’a qu’un exemplaire de chaque jeu (deux jeux de la ludothèque ne peuvent donc pas avoir le même nom).

Dans la figure ci-dessus, les clés primaires de chacune des tables sont soulignées et les clés étrangères sont précédées du symbole #.
Dans cet exercice, on pourra utiliser les clauses du langage SQL pour :
construire des requêtes d’interrogation à l’aide de SELECT, FROM, WHERE (avec les opérateurs logiques AND, OR) et JOIN ... ON ;
construire des requêtes d’insertion et de mise à jour à l’aide de UPDATE, INSERT et DELETE ;
affiner les recherches à l’aide de DISTINCT et ORDER BY ;
réaliser des agrégations à l’aide de COUNT.
Par exemple, l’instruction SQL :
SELECT COUNT(nomJeu) FROM jeu;
donne le nombre de jeux présents dans la table jeu.
Expliquer pourquoi on ne peut pas prendre l’attribut nom comme clé primaire pour la relation adherent.
Décrire ce que donne la requête SQL suivante :
SELECT nomJeu, editeur
FROM jeu
ORDER BY nomJeu;
Lorsqu’un jeu est emprunté et n’a pas encore été rendu, la valeur de l’attribut dateRendu de la table emprunt est à NULL.
Écrire une requête permettant de connaitre le nom de tous les jeux qui sont en cours d’emprunt.
Écrire une requête SQL pour afficher le nom et le prénom de tous les adhérents qui ont emprunté le jeu “Catan”.
Claire VOYANT, adhérente de longue date à cette ludothèque, a emprunté le jeu “Catan” et l’a rendu le 3 juin 2025. Lors de l’emprunt, la valeur de id_emprunt était 1538.
Écrire une requête SQL qui a permis de mettre à jour la base de données afin qu’elle prenne en compte que ce jeu a été rendu. Toutes les dates de la base de données sont écrites sous le format 'AAAA-MM-JJ'.
Écrire une requête SQL qui permet de trouver le nom et la catégorie de tous les jeux de la ludothèque sortis à partir de 2010 et dont l’âge minimum est strictement inférieur à 10 ans.
La ludothèque décide d’organiser des événements. Pour cela, elle ajoute une relation evenement à sa base de données. En outre, pour chaque événement, elle souhaite garder en mémoire une trace des adhérents qui y ont participé. À cette fin, elle complète sa base avec une relation participation.

Proposer les clés étrangères de la table participation en précisant le nom des attributs auxquels elles font référence.
Le programme Python suivant permet de créer la liste de tous les jeux empruntés, sachant que, dans celle-ci, un jeu va apparaître autant de fois qu’il a été emprunté.
import sqlite3
# Connexion à la base de données
connection = sqlite3.connect("ludotheque.db")
curseur = connection.cursor()
# Exécution de la requête
curseur.execute("SELECT nomJeu FROM emprunt")
# Récupération des résultats
jeux = curseur.fetchall()
liste = []
# Création de la liste des jeux empruntés
for jeu in jeux:
liste.append(jeu[0])
# Fermeture de la connexion
curseur.close()
connection.close()
Écrire un script Python permettant de créer le dictionnaire dict_emprunts qui, à chaque jeu emprunté, associe le nombre de fois où il a été emprunté.
On veut créer un podium des jeux les plus souvent empruntés. Comme il peut y avoir des égalités à la première, deuxième ou troisième place, il peut y avoir plus de trois jeux sélectionnés sur le podium.
Par exemple, si le dictionnaire des emprunts est :
dict_emprunts = {
"Terraforming Mars": 25,
"Codenames": 22,
"Agricola": 18,
"Puerto Rico": 18,
"Caylus": 18,
"Dominion": 22,
"Dixit": 12
}
il y aura sur le podium les jeux “Agricola”, “Puerto Rico” et “Caylus” puis les jeux “Dominion” et “Codenames” et enfin le jeu “Terraforming Mars”.
Pour modéliser ce podium en Python, on va utiliser une liste de trois listes.
Pour l’exemple précédent, cette liste sera :
[["Agricola", "Puerto Rico", "Caylus"], ["Dominion", "Codenames"], ["Terraforming Mars"]]
- Proposer un script Python permettant de générer ce podium.
Métropole – Bac NSI 2025 – Jour 2 Correction de l'exercice 2
Question 1
Plusieurs adhérents peuvent avoir le même nom (par exemple deux membres d’une même famille). Une clé primaire doit identifier chaque enregistrement de manière unique : nom ne convient pas.
Question 2
La requête affiche le nom et l’éditeur de tous les jeux de la table jeu, classés par ordre alphabétique du nom du jeu.
Question 3
SELECT nomJeu
FROM emprunt
WHERE dateRendu IS NULL;
Question 4
SELECT DISTINCT adherent.nom, adherent.prenom
FROM adherent
JOIN emprunt ON adherent.idAdherent = emprunt.idAdherent
WHERE emprunt.nomJeu = 'Catan';
Question 5
UPDATE emprunt
SET dateRendu = '2025-06-03'
WHERE idEmprunt = 1538;
Question 6
SELECT nomJeu, categorie
FROM jeu
WHERE anneeSortie >= 2010 AND ageMinimum < 10;
Question 7
La table participation contient deux clés étrangères :
#nom, qui fait référence à l’attribut nom (clé primaire) de la table evenement ;
#idAdherent, qui fait référence à l’attribut idAdherent de la table adherent.
Question 8
dict_emprunts = {}
for jeu in liste:
if jeu in dict_emprunts:
dict_emprunts[jeu] = dict_emprunts[jeu] + 1
else:
dict_emprunts[jeu] = 1
Question 9
# nombres d'emprunts différents, du plus grand au plus petit
valeurs = []
for nb in dict_emprunts.values():
if nb not in valeurs:
valeurs.append(nb)
valeurs.sort(reverse=True)
podium = []
for nb in valeurs[:3]: # 1re, 2e et 3e places
place = []
for jeu in dict_emprunts:
if dict_emprunts[jeu] == nb:
place.append(jeu)
podium.insert(0, place) # la 1re place finit en dernier
Une erreur, un oubli ? Écrivez-moi : frederic.peuriere@lfcl.pt
🔎 Exercices sur des thèmes similaires
-
Amérique du Nord 2024 – jour 1 – exercice 3
programmation, modularité, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2024 – jour 1 – exercice 3
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2024 – jour 2 – exercice 3
BDD, SQL, programmation — Difficulté : 🔥🔥🔥🔥🔥 -
Polynésie 2025 – jour 2 – exercice 2
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Centres étrangers 2024 – jour 1 – exercice 3
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Amérique du Nord 2026 – jour 2 – exercice 3
BDD, SQL, programmation Python, dictionnaires — Difficulté : 🔥🔥🔥🔥🔥