Exercice 2 Nouvelle Calédonie – Bac NSI 2025 – Jour 1

🔥🔥🔥🔥🔥
On exploite une base de données de randonnées et on écrit des requêtes SQL (sélection, tri, ajout, modification, suppression). Puis on refait un petit bilan en Python en parcourant une liste d'objets pour compter les randonnées par parking.

mots clés: BDD, SQL , POO

🔎 Voir les exercices similaires ↓

📘 Sujet PDF

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

Figure 1. Schéma des trois relations
Figure 1. Schéma des trois relations

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
idPcommunealtitudecoord_GPS
1Chamonix1 026(45.98;6.89)
2Argentiere1 429(45.99;6.92)
3Passy600(45.92;6.72)
4Passy1 181(45.95;6.71)
5Nevache2 022(45.05;6.52)
rando
idRdepartarrivee
111
221
312
433
lac
idLnomaltitude
1Lac Blanc2 354
2Lacs Noirs2 564
3Lac Vert1 266
4Lac Rouge2 585
  1. Indiquer ce que renvoie la requête suivante lorsqu’on l’applique aux extraits précédents.

SELECT nom
FROM lac
WHERE altitude <= 2000;
  1. 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.

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

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

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

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

  3. 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
  1. 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].

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

  1. É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}.

▶✅ Correction (cliquer pour afficher) PDF

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

💻 Console Python (cliquer pour afficher)

🔎 Exercices sur des thèmes similaires