Exercice 3 - Bases de données relationnelles et S… · Bac Numérique et Sciences Informatiques Métropole 2026 (sujet 2)

Thème : Bases de données relationnelles, SGBD et langage SQL · Tiré du sujet Métropole France 2 (2026)

Énoncé

Partie B

Alice, Maxime, Valérie et Clément doivent choisir un point de rendez-vous pour leur trajet de covoiturage. Ils ont identifié trois points de rendez-vous possibles. Dans le graphe suivant:

les sommets A, M, C, et V représentent les domiciles des quatre covoitureurs;

les sommets P1, P2, et P3 représentent les points de rendez-vous possibles;

les arêtes représentent des trajets entre ces lieux qui possèdent tous approximativement les mêmes conditions de parcours (distance et durée).

On utilise la fonction dico_distance donnée ci-après pour déterminer toutes les distances en nombre d'arêtes entre un point de rendez-vous et les autres sommets du graphe.

1 def dico_distance(graphe, depart):

2 """ graphe: dictionnaire

3 {sommet: liste de sommets adjacents }

4 depart: un sommet du graphe

5 renvoie un dictionnaire

6 {sommet atteignable depuis depart:

7 distance entre depart et ce sommet }"""

8

9 # initialisation d'une file

10 file = File()

11 file.inserer(depart)

12

13 # initialisation du dictionnaire de sortie

14 dico = {depart: 0}

15

16 while not file.est_vide():

17 # extraire le prochain sommet à explorer

18 sommet = file.extraire()

19 # pour chaque voisin encore non atteint

20 for voisin in graphe[sommet]:

21 if voisin not in dico:

22 # attribuer la distance à ce voisin

23 dico[voisin] = dico[sommet] + 1

24 # placer ce voisin dans la file

25 # pour une exploration future

26 file.inserer(voisin)

27 return dico La fonction dico_distance utilise une file pour gérer l'ordre d'exploration des sommets du graphe. Cette file est implémentée avec une classe File. En tapant la commande help(File) dans la console de Python on obtient:

class File(builtins.object)

| Methods defined here:

|

| __init__(self)

| initialise une file vide

|

| consulter(self)

| renvoie le premier élément disponible

| sans le retirer de la file

| lève une exception IndexError si la file est vide

|

| est_vide(self)

| renvoie True si la file est vide, False sinon

|

| extraire(self)

| renvoie le premier élément disponible et

| le retire de la file

| lève une exception IndexError si la file est vide

|

| inserer(self, element)

| ajoute l'élément donné dans la file

Exercice 3 (8 points)

Cet exercice porte sur les bases de données ainsi que les structures de file et de graphe.

Partie A

Dans cette partie, 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 et OR), 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.

Dans une entreprise qui possède plusieurs sites de production, on met en place une application de covoiturage pour aider les salariés à limiter leurs déplacements en voiture individuelle, et ainsi, diminuer l'empreinte carbone de l'entreprise. Avec cette application, chaque membre du personnel peut proposer un trajet ou s'inscrire sur un trajet proposé.

L'application repose sur une base de données avec trois tables, que l'on décrit par le schéma suivant où les attributs qui servent de clé primaire sont soulignés et les attributs qui servent de clé étrangère sont précédés du caractère #.

1.

Expliquer pourquoi les attributs nom et prenom n'ont pas été retenus comme clé primaire de la table utilisateur.

Les attributs id_utilisateur et id_trajet sont des nombres entiers.

2.

Justifier que les attributs de la relation inscription sont aussi des nombres entiers.

La requête:

SELECT *

FROM trajet

WHERE heure > '2026-06-19 00:00:00'

AND heure < '2026-06-20 00:00:00';

renvoie le tableau suivant:

Avec des requêtes adaptées, on peut obtenir les informations suivantes concernant les inscriptions et les utilisateurs concernés par ces trajets:

3.

Recopier et compléter la requête suivante afin de connaître le nombre de passagers inscrits sur le trajet n° 1291.

SELECT COUNT(*)

FROM...

WHERE...;

4.

Écrire une requête permettant d'obtenir la liste des trajets qui arrivent à Nancy le 19 juin 2026 dans l'ordre croissant de l'heure de départ.

On suppose que le trajet n°1295 a été ajouté dans la base de données lors de sa création par une simple requête et qu'il n'a pas été modifié depuis.

5.

Écrire une requête qui aurait permis d'ajouter le trajet n°1295 dans la base de données lors de sa création.

6.

Écrire une requête permettant de modifier l'heure de départ à 18h40 pour le trajet n°1294. On pourra utiliser les valeurs présentes dans les tableaux extraits de la base de données.

Pour supprimer le trajet de 18h00 entre Toul et Liverdun, on essaye la requête suivante:

DELETE FROM trajet

WHERE id_trajet=1296;

Le gestionnaire de base de données donne alors l'erreur suivante:

ERROR 1451 (23000) at line 95 in file: 'covoit.sql': Cannot delete or update a parent row: a foreign key constraint fails

7.

Expliquer en détail les raisons de cette erreur.

8.

Écrire une requête permettant d'obtenir la liste des noms et prénoms des passagers transportés au moins une fois par l'utilisatrice dont l'identifiant est 25.

Énoncé: Exercice 3 - Bases de données relationnelles et S… · Bac Numérique et Sciences Informatiques Métropole 2026 (sujet 2)

Corrigé

Corrigé proposé par AprenAI (non officiel)

1. Expliquer pourquoi les attributs nom et prenom n'ont pas été retenus comme clé primaire de la table utilisateur.

Réponse : Une clé primaire doit identifier chaque enregistrement de manière unique. Deux utilisateurs distincts peuvent avoir les mêmes nom et prénom (homonymes). Le couple (nom, prenom) ne garantit donc pas l'unicité.

2. Justifier que les attributs de la relation inscription sont aussi des nombres entiers.

Réponse : Les attributs #trajet et #passager sont des clés étrangères référençant respectivement id_trajet (table trajet) et id_utilisateur (table utilisateur), qui sont des entiers.

3. Recopier et compléter la requête suivante afin de connaître le nombre de passagers inscrits sur le trajet n° 1291.

Réponse : SELECT COUNT(*) FROM inscription WHERE trajet = 1291;

4. Écrire une requête permettant d'obtenir la liste des trajets qui arrivent à Nancy le 19 juin 2026 dans l'ordre croissant de l'heure de départ.

Réponse : SELECT * FROM trajet WHERE arrivee = 'Nancy' AND heure >= '2026-06-19 00:00:00' AND heure < '2026-06-20 00:00:00' ORDER BY heure ASC;

Les réponses des 4 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium

Résous-le ici : correction automatique, indices et corrigé détaillé.

‹ Exercice 3 - Partie B · Métropole 2026 (sujet 1) · Exercice 1 · Métropole 2025 (sujet 1) ›

Plus d’exercices de Bases de données relationnelles, SGBD et langage SQL