Ce sujet s’inspire du sujet 9 du bac de NSI 2022

Thèmes abordés : bases de données et langage SQL.

On souhaite gérer un club de tennis en ligne avec la possibilité de réserver un terrain à un créneau horaire. Le site ne gère que des réservations pour des matchs en simple. Voici la structure de la base de données :

joueurs
id_joueur nom_joueur prenom_joueur login mdp
1 Dupont Alice alice 1234
2 Durand Belina belina 5694
3 Caron Camilia camilia 9478
4 Dupont Dorine dorine 1347
matchs
id_match date id_creneau id_terrain id_joueur1 id_joueur2
1 2020-08-01 2 1 1 4
2 2020-08-01 3 1 2 3
3 2020-08-02 6 2 1 3
4 2020-08-02 7 2 2 4
5 2020-08-08 3 3 1 2
6 2020-08-08 5 2 3 4
terrains
id_terrain nom_terrain surface
1 stade terre battue
2 gymnase synthétique
3 hangar terre battue
creneaux
id_creneau plage_horaire
1 8h-9h
2 9h-10h
3 10h-11h
4 11h-12h
5 12h-13h
6 13h-14h
7 14h-15h
8 15h-16h
9 16h-17h
10 17h-18h
11 18h-19h
12 19h-20h


  1. Clés primaires/étrangères :

Question en plus : Reprendre le script ci-dessous (ANNEXE 1),

  1. Requêtes en langage SQL (On pourra s’aider de l’annexe 2)
  1. Ecrire une requête permettant d’ajouter le nouveau membre « Zora MAGID » dont le login est « zora » et le mot de passe 2021.

Question en plus : Difficulté supplémentaire : on ne connait pas le prochain identifiant (id_joueur), notre script SQL doit calculer le prochain identifiant ; Rechercher le plus grand id_joueur dans la table, et l’instruction INSERT utilisera l’identifiant suivant.
Modifier le script ci-dessous pour calculer l’identifiant suivant :

SET @id_max = (... requête qui recherche le plus grand id_joueur);
SELECT @id_max;
INSERT joueurs VALUES (@id_max+1,....

Utiliser cet identifiant pour ajouter le prochain joueur

Documentation : SET Syntax for Variable Assignment

  1. Ecrire une requête qui renvoie les jours où Alice joue.

2.. Par lecture et analyse des relations de la base de donnée.

Les élèves qui passaient le bac devaient répondre en recherchant les informations dans les données des relations (tables) ci-dessus.

Question en plus : Ecrire les requêtes qui répondent aux questions ci-dessus

Ajouter quelques enregistrements

INSERT INTO matchs VALUES
(7 ,'2020-08-08', 6 ,2 ,2 ,1),
(8 ,'2020-08-08', 7 ,3 ,2 ,1),
(9 ,'2020-08-08', 7 ,2 ,3 ,2);
+------------+------------+------------+------------+
| date_match | id_creneau | nom_joueur | nom_joueur |
+------------+------------+------------+------------+
| 2020-08-01 |          3 | Durand     | Caron      |
| 2020-08-08 |          7 | Caron      | Durand     |
+------------+------------+------------+------------+

aide : pour réaliser cette requête, il est possible de faire une jointure un peu particulière avec la table (relation) matchs

INNER JOIN joueurs AS J1 ON J1.id_joueur=matchs.id_joueur1
INNER JOIN joueurs AS J2 ON J2.id_joueur=matchs.id_joueur2


+---------------+------------+
| prenom_joueur | nom_joueur |
+---------------+------------+
| Alice         | Dupont     |
| Belina        | Durand     |
+---------------+------------+

aide : pour réaliser cette requête, il est possible de faire une jointure un peu particulière avec la table (relation) matchs

INNER JOIN joueurs ON joueurs.id_joueur=matchs.id_joueur1 OR joueurs.id_joueur=matchs.id_joueur2

Annexe 1

DROP TABLE IF EXISTS xxxx;
DROP TABLE IF EXISTS xxxx;
DROP TABLE IF EXISTS xxxx;
DROP TABLE IF EXISTS xxxx;

CREATE TABLE joueurs (
id_joueur INT,
nom_joueur VARCHAR(255),
prenom_joueur VARCHAR(255),
login VARCHAR(255),
mdp VARCHAR(255)
);

INSERT INTO joueurs VALUES
(1,'Dupont','Alice','alice','1234'),
(2,'Durand','Belina','belina','5694'),
(3,'Caron','Camilia','camilia','9478'),
(4,'Dupont','Dorine','dorine','1347');

CREATE TABLE matchs (
id_match INT,
date_match DATE,
id_creneau INT,
id_terrain INT,
id_joueur1 INT,
id_joueur2 INT
);

INSERT INTO matchs VALUES
(1 ,'2020-08-01', 2, 1, 1, 4),
(2 ,'2020-08-01', 3 ,1 ,2 ,3),
(3 ,'2020-08-02', 6 ,2 ,1 ,3),
(4 ,'2020-08-02', 7 ,2 ,2 ,4),
(5 ,'2020-08-08', 3 ,3 ,1 ,2),
(6 ,'2020-08-08', 5 ,2 ,3 ,4);

CREATE TABLE terrains (
id_terrain INT,  
nom_terrain VARCHAR(255),
surface     VARCHAR(255)
);

INSERT INTO terrains VALUES
(1,'stade','terre battue'),
(2,'gymnase','synthétique'),
(3,'hangar','terre battue');

CREATE TABLE creneaux (
id_creneau INT,
plage_horaire VARCHAR(255)
);

INSERT INTO creneaux (id_creneau,plage_horaire) values
(1,'8h-9h'),
(2,'9h-10h'),
(3,'10h-11h'),
(4,'11h-12h'),
(5,'12h-13h'),
(6,'13h-14h'),
(7,'14h-15h'),
(8,'15h-16h'),
(9,'16h-17h'),
(10,'17h-18h'),
(11,'18h-19h'),
(12,'19h-20h');

Réflexion sur le schéma


Utiliser le fichier looping ci-joint et modifier le pour obtenir le bon MLD



CONSTRAINT uk_table  UNIQUE (col1, col2, col);

doc unique key - doc index key




ANNEXE :


https://formations.imt-atlantique.fr/bd_ihm/fr/normalisation/normal_forms/