Adloun

Corrigé bac NSI 2025 Métropole jour 2 — Exercice 2 : Ludothèque municipale : requêtes SQL, clés étrangères et podium des jeux empruntés

Sujet officiel du baccalauréat, spécialité numérique et sciences informatiques, session 2025. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF)

Énoncé

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).

Figure 1. La base de données de la ludothèque

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 :

Par exemple, l'instruction SQL :


SELECT COUNT(nomJeu) FROM jeu;

donne le nombre de jeux présents dans la table jeu.

1. Expliquer pourquoi on ne peut pas prendre l'attribut nom comme clé primaire pour la relation adherent.

2. Décrire ce que donne la requête SQL suivante :


SELECT nomJeu, editeur
FROM jeu
ORDER BY nomJeu;

Lorsque qu'un jeu est emprunté et n'a pas encore été rendu, la valeur de l'attribut dateRendu de la table emprunt est à NULL.

3. Écrire une requête permettant de connaitre le nom de tous les jeux qui sont en cours d'emprunt.

4. Écrire une requête SQL pour afficher le nom et le prénom de tous les adhérents qui ont emprunté le jeu « Catan ».

5. 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'.

6. É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.

Figure 2. La base de données de la ludothèque actualisée

7. 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()

8. É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"]].

9. Proposer un script Python permettant de générer ce podium.

Corrigé

1. Une clé primaire doit identifier de façon unique chaque n-uplet de la relation : deux lignes ne peuvent jamais porter la même valeur de clé, et cette valeur ne peut pas être NULL (contrainte d'intégrité d'entité). Or rien n'empêche deux adhérents d'être homonymes : deux personnes nommées « VOYANT » (voire deux « Claire VOYANT ») peuvent être inscrites à la ludothèque, et l'attribut nom ne permettrait pas de les distinguer, par exemple pour savoir laquelle a emprunté « Catan ». Un nom peut de plus changer au cours du temps. On utilise donc un identifiant artificiel, idAdherent, entier unique attribué à l'inscription et qui ne change jamais.

2. La requête projette deux colonnes de la table jeu : elle renvoie, pour chaque jeu de la ludothèque (il n'y a pas de clause WHERE), son nom et son éditeur, une ligne par jeu, les lignes étant triées par ordre alphabétique croissant du nom du jeu (ORDER BY nomJeu, l'ordre croissant étant celui par défaut). Comme nomJeu est la clé primaire, chaque jeu apparaît exactement une fois ; les jeux jamais empruntés y figurent aussi. Le sujet ne donne le contenu d'aucune table ; les résultats montrés ici et aux questions 4, 8 et 9 ont été obtenus sur une petite base sqlite3 construite pour la démonstration d'après le schéma de la Figure 1 (quatre jeux, trois adhérents, sept emprunts). Sur cette base, le résultat a la forme :

nomJeuediteur
AzulNext Move
CatanKosmos
CodenamesCzech Games
DixitLibellud

100 % gratuit

La suite du corrigé est sur Adloun

Le corrigé rédigé en entier, partie par partie, et le tuteur pour poser des questions sur ce sujet.

Voir le corrigé complet, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Corrigé complet gratuit →