Exercice 2 Nouvelle Calédonie – Bac NSI 2025 – Jour 1
mots clés: BDD, SQL , POO
🔎 Voir les exercices similaires ↓
Nouvelle Calédonie – Bac NSI 2025 – Jour 1 Énoncé de l'exercice 2
Cet exercice porte sur les bases de données et la programmation orientée objet.
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), JOIN ... ON ;
construire des requêtes d’insertion et de mise à jour à l’aide de UPDATE, INSERT, DELETE ;
affiner les recherches à l’aide de DISTINCT et ORDER BY.
Susie décide de créer une base de données qui recense des randonnées allant d’un parking à un lac.
Elle crée trois relations représentées sur le schéma ci-dessous (figure 1).

Les clés primaires sont signalées par une clé. Dans la relation rando :
depart est une clé étrangère qui référence l’attribut idP de la relation parking ;
arrivee est une clé étrangère qui référence l’attribut idL de la relation lac.
L’altitude, exprimée en mètre, est un entier.
Voici un extrait des enregistrements de ces trois relations.
| parking | |||
|---|---|---|---|
| idP | commune | altitude | coord_GPS |
| 1 | Chamonix | 1 026 | (45.98;6.89) |
| 2 | Argentiere | 1 429 | (45.99;6.92) |
| 3 | Passy | 600 | (45.92;6.72) |
| 4 | Passy | 1 181 | (45.95;6.71) |
| 5 | Nevache | 2 022 | (45.05;6.52) |
| rando | ||
|---|---|---|
| idR | depart | arrivee |
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 2 |
| 4 | 3 | 3 |
| lac | ||
|---|---|---|
| idL | nom | altitude |
| 1 | Lac Blanc | 2 354 |
| 2 | Lacs Noirs | 2 564 |
| 3 | Lac Vert | 1 266 |
| 4 | Lac Rouge | 2 585 |
Indiquer ce que renvoie la requête suivante lorsqu’on l’applique aux extraits précédents.
SELECT nom
FROM lac
WHERE altitude <= 2000;
Indiquer les noms des lacs qu’on peut atteindre depuis le parking de Chamonix d’après la base de données de Susie.
À partir de maintenant, on travaille sur la totalité des enregistrements et non plus seulement sur les extraits précédents.
Donner une requête permettant d’obtenir les coordonnées GPS des parkings situés dans la commune de Passy à une altitude comprise strictement entre 800 et 1 000 mètres.
Donner une requête permettant d’obtenir les noms des lacs qu’il est possible d’atteindre depuis le parking situé à 1300 mètres d’altitude dans la commune de Cordon (on admet qu’un tel parking existe dans la base de données).
Dans les questions suivantes, l’ordre des requêtes SQL est important. On considère une nouvelle randonnée qui part du parking dont l’identifiant est 3 à Passy et qui conduit au lac d’Anterne situé à 2 059 mètres d’altitude.
Le parking est déjà dans la base de données mais par contre, ni la randonnée, ni le lac n’y figurent.
Donner les requêtes permettant à Susie d’ajouter à sa base de données cette randonnée et ce lac (on pourra utiliser l’identifiant 42 pour le lac et l’identifiant 100 pour la randonnée).
Susie a fait une erreur de saisie en insérant le nom du lac, elle a écrit ‘Lc d Anterne’. Donner la requête permettant de corriger cette erreur.
Le parking dont l’identifiant est 28 a été transformé en un parc et n’existe plus. Donner les requêtes permettant de supprimer ce parking de la base de données.
Susie souhaite obtenir pour chacun des parkings le nombre de randonnées qui en partent.
Elle n’a pas encore appris à le faire en SQL et décide de le faire en Python. Pour cela elle définit la classe Rando ci-dessous permettant de représenter chacune des randonnées. La table rando est alors donnée par une liste d’objets de la classe Rando.
class Rando:
def __init__(self, idR, depart, arrivee):
self.idR = idR # identifiant de la rando
self.depart = depart # identifiant du parking
self.arrivee = arrivee # identifiant du lac
Recopier et compléter les lignes 3 et 5 de la fonction get_parking qui prend en paramètre une liste de randonnées et qui renvoie la liste des identifiants des différents parkings, points de départ de ces randonnées (cette liste ne devra pas avoir de doublon).
def get_parking(randos):
parkings = []
for ...:
if rando.depart not in parkings:
...
return parkings
Par exemple, get_parking([Rando(1, 1, 1), Rando(2, 2, 1), Rando(3, 1, 2)]) renvoie [1, 2].
Recopier et compléter la ligne 4 de la fonction get_nb_rando qui prend en paramètres un identifiant de parking et une liste de randonnées, et qui renvoie le nombre de randonnées qui partent de ce parking.
def get_nb_rando(parking, randos):
nb = 0
for rando in randos:
if ...:
nb = nb + 1
return nb
Par exemple, get_nb_rando(1, [Rando(1, 1, 1), Rando(2, 2, 1), Rando(3, 1, 2)]) renvoie 2.
Écrire une fonction nb_rando_par_parking qui prend en paramètre une liste de randonnées et qui renvoie un dictionnaire qui associe à chaque identifiant de parking le nombre de randonnées qui partent de ce parking.
Par exemple, nb_rando_par_parking([Rando(1, 1, 1), Rando(2, 2, 1), Rando(3, 1, 2)]) renvoie {1: 2, 2: 1}.
Nouvelle Calédonie – Bac NSI 2025 – Jour 1 Correction de l'exercice 2
1. Requête sur les lacs
La requête renvoie le nom des lacs d’altitude inférieure ou égale à 2 000 m. Dans l’extrait, seul le Lac Vert (1 266 m) convient :
| nom |
|---|
| Lac Vert |
2. Lacs atteignables depuis Chamonix
Le parking de Chamonix a l’identifiant idP = 1. Dans la table rando, les randonnées 1 et 3 partent du parking 1 et arrivent aux lacs 1 et 2 : on peut atteindre le Lac Blanc et les Lacs Noirs.
3. Parkings de Passy entre 800 et 1 000 m
SELECT coord_GPS
FROM parking
WHERE commune = 'Passy'
AND altitude > 800 AND altitude < 1000;
4. Lacs atteignables depuis le parking de Cordon à 1 300 m
SELECT lac.nom
FROM parking
JOIN rando ON parking.idP = rando.depart
JOIN lac ON rando.arrivee = lac.idL
WHERE parking.commune = 'Cordon' AND parking.altitude = 1300;
5. Ajout du lac et de la randonnée
INSERT INTO lac VALUES (42, 'Lac d''Anterne', 2059);
INSERT INTO rando VALUES (100, 3, 42);
6. Correction du nom du lac
UPDATE lac
SET nom = 'Lac d''Anterne'
WHERE idL = 42;
7. Suppression du parking 28
DELETE FROM rando WHERE depart = 28;
DELETE FROM parking WHERE idP = 28;
8. Fonction get_parking (lignes 3 et 5)
def get_parking(randos):
parkings = []
for rando in randos: # ligne 3
if rando.depart not in parkings:
parkings.append(rando.depart) # ligne 5
return parkings
9. Fonction get_nb_rando (ligne 4)
def get_nb_rando(parking, randos):
nb = 0
for rando in randos:
if rando.depart == parking: # ligne 4
nb = nb + 1
return nb
10. Fonction nb_rando_par_parking
def nb_rando_par_parking(randos):
resultat = {}
for rando in randos:
if rando.depart in resultat:
resultat[rando.depart] = resultat[rando.depart] + 1
else:
resultat[rando.depart] = 1
return resultat
Une erreur, un oubli ? Écrivez-moi : frederic.peuriere@lfcl.pt
🔎 Exercices sur des thèmes similaires
-
Asie 2024 – jour 1 – exercice 3
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Asie 2025 – jour 2 – exercice 3
POO, BDD, SQL, arbres binaires — Difficulté : 🔥🔥🔥🔥🔥 -
Centres étrangers 2024 – jour 1 – exercice 3
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Polynésie 2025 – jour 2 – exercice 2
programmation, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Centres étrangers 2026 – jour 1 – exercice 3
POO, récursivité, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥 -
Sujet Zéro 2024 – jour 2 – exercice 3
dictionnaires, POO, BDD, SQL — Difficulté : 🔥🔥🔥🔥🔥