Chapitre Bases de données
Correction de l'évaluation
Le sujet « Covoiturage » corrigé, question par question. Chaque réponse est repliée : essaie de comparer avec ce que tu as écrit avant de la déplier.
Rappel
Le schéma du sujet
UTILISATEUR(id_utilisateur, nom, prenom, email, note_moyenne)
TRAJET(id_trajet, #id_conducteur, ville_depart, ville_arrivee, date_heure_depart,
nb_places, prix_place)
RESERVATION(id_reservation, #id_trajet, #id_passager, nb_places_reservees, date_reservation)
id_conducteur (dans TRAJET) et id_passager (dans RESERVATION) référencent tous deux UTILISATEUR.
Rappel
Les données
UTILISATEUR
1, Bernard, Julie, note 4.8
2, Morel, Adam, note 4.2
3, Faure, Sarah, note NULL
4, Simon, Lucas, note 3.9
TRAJET
1: Lyon→Grenoble, 3pl, 8€ (cond.1)
2: Lyon→Paris, 2pl, 35€ (cond.2)
3: Grenoble→Lyon, 3pl, 8€ (cond.1)
4: Lyon→Marseille, 4pl, 25€ (cond.4)
RESERVATION
1: trajet1, passager3, 1 place
2: trajet1, passager4, 2 places
3: trajet2, passager3, 1 place
4: trajet4, passager2, 2 places
5: trajet4, passager3, 1 place
Correction
Question par question
Q12 pts
Clé primaire de RESERVATION et ses clés étrangères. Pourquoi id_conducteur et id_passager référencent la même table ?
Clé primaire : id_reservation. Clés étrangères : #id_trajet (→ TRAJET) et #id_passager (→ UTILISATEUR). id_conducteur et id_passager référencent tous deux UTILISATEUR car un même utilisateur peut être à la fois conducteur et passager : ce sont deux rôles différents joués par la même entité.
Q22 pts
Trajets au départ de Lyon.
SELECT * FROM TRAJET WHERE ville_depart = 'Lyon';
→ trajets 1, 2 et 4.
Q32 pts
Utilisateurs sans note moyenne.
SELECT * FROM UTILISATEUR WHERE note_moyenne IS NULL;
→ Sarah Faure. Attention : IS NULL, jamais = NULL.
Q43 pts
Pour chaque réservation : nom du passager + villes de départ/arrivée du trajet.
SELECT UTILISATEUR.nom, TRAJET.ville_depart, TRAJET.ville_arrivee
FROM RESERVATION
JOIN UTILISATEUR ON RESERVATION.id_passager = UTILISATEUR.id_utilisateur
JOIN TRAJET ON RESERVATION.id_trajet = TRAJET.id_trajet;
Q53 pts
Trajets à moins de 20€/place, triés du moins cher au plus cher.
SELECT * FROM TRAJET WHERE prix_place < 20 ORDER BY prix_place ASC;
→ trajets 1 et 3 (8€).
Q63 pts
Nombre total de places réservées, par trajet.
SELECT id_trajet, SUM(nb_places_reservees) AS places_reservees
FROM RESERVATION GROUP BY id_trajet;
→ trajet 1 : 3 · trajet 2 : 1 · trajet 4 : 3.
Q73 pts
Le trajet 2 change de prix : 40€ la place.
UPDATE TRAJET SET prix_place = 40 WHERE id_trajet = 2;
Q82 pts
Le nombre de places réservées sur le trajet 4 peut-il dépasser nb_places ? La base l'empêche-t-elle ?
Oui, cela peut dépasser : rien ne l'empêche structurellement. Les contraintes de clé primaire/étrangère garantissent seulement que chaque réservation référence un trajet et un passager existants — aucune contrainte ne vérifie que la somme des places réservées reste inférieure ou égale à nb_places. Il faudrait une règle supplémentaire (CHECK avancé, trigger, ou vérification côté application).
Barème total
2+2+2+3+3+3+3+2
/ 20