Retour à la page d'accueilNSI · Terminale (maths complémentaires) · Changer de matière
Commencer gratuitement
Terminale (maths complémentaires) · NSI
Préparer l'épreuve de spécialité NSI du bac · Épreuve de spécialité NSI du baccalauréat

Bases de données relationnelles et SQL

Dans l'exercice de bases de données du bac NSI, on te donne un schéma, quelques tables et des questions du type « Écrire une requête qui… » ou « Expliquer pourquoi cette insertion est refusée ». Le vocabulaire est précis et les requêtes sont très codifiées : une fois les réflexes acquis, c'est l'un des exercices les plus réguliers de l'épreuve.

Une question guide cette page : deux clients réservent la dernière place d'un concert au même instant. Comment le système évite-t-il de la vendre deux fois ? Tu auras la réponse à la fin.

Le modèle relationnel

Une base de données relationnelle range l'information dans des relations, que l'on dessine comme des tableaux. Reprenons une relation STATION qui décrit les stations d'un service de vélos en libre-service.

id nom ville velos
1 Gare Lyon 12
2 Mairie Lyon 3
3 Port Nantes 8
4 Parc Lyon 0

Une base distingue sa structure (les relations, les attributs, les domaines, les clefs : le schéma) et son contenu (les enregistrements à un instant donné). Le contenu change tout le temps, la structure beaucoup moins.

Voici deux relations reliées : VELO.id_station est une clef étrangère qui référence STATION.id.

Deux relations STATION et VELO reliées par une clef étrangère STATION id (clef primaire) nom ville, velos VELO id_velo (clef primaire) modele id_station (clef étrangère) référence

Un SGBD (système de gestion de bases de données) vérifie les contraintes : il refuse d'insérer un enregistrement dont la clef primaire existe déjà, ou dont la clef étrangère ne correspond à aucune ligne de la relation référencée. On parle de contraintes d'intégrité.

Entraîne-toi★☆☆Pas commencé
Un lycée gère ses élèves avec la relation ELEVE, dont la clef primaire est num. | num | nom | prenom | classe | |---|---|---|---| | 1 | Martin | Léa | TG1 | | 2 |…

Un lycée gère ses élèves avec la relation ELEVE, dont la clef primaire est num.

num nom prenom classe
1 Martin Léa TG1
2 Bernard Hugo TG2
3 Petit Inès TG1
4 Moreau Tom TG3
  1. Donner le nombre d'attributs et le nombre d'enregistrements de cette relation, puis écrire son schéma relationnel.

  2. Indiquer un domaine possible pour l'attribut num et un domaine possible pour l'attribut classe.

  3. On exécute la requête suivante.

INSERT INTO ELEVE VALUES (3, 'Roux', 'Paul', 'TG2');
Expliquer pourquoi le système de gestion de bases de données refuse cette insertion.
  1. Écrire une requête SQL qui renvoie les noms des élèves de la classe TG1, puis donner son résultat.
Résoudre

Interroger une relation : SELECT

Une requête de consultation suit toujours le même squelette, dans cet ordre :

SELECT attributs

FROM relation

WHERE condition

ORDER BY attribut;

SELECT dit quelles colonnes on garde, FROM dans quelle relation on cherche, WHERE quelles lignes on garde, ORDER BY dans quel ordre on les affiche (ASC par défaut, DESC pour décroissant). Seuls SELECT et FROM sont obligatoires. SELECT * sélectionne tous les attributs.

Les conditions se combinent avec AND, OR, NOT et se testent avec =, <>, <, <=, >, >=. Les chaînes s'écrivent entre apostrophes : 'Lyon'. Dans le code SQL, le séparateur décimal est le point : 1.50.

Entraîne-toi★☆☆Pas commencé
Un cinéma de quartier gère la relation FILM. | id | titre | realisateur | annee | duree | |---|---|---|---|---| | 1 | Le Phare | Dubois | 2015 | 95 | | 2 | Rue des Lilas…

Un cinéma de quartier gère la relation FILM.

id titre realisateur annee duree
1 Le Phare Dubois 2015 95
2 Rue des Lilas Lemaire 2018 110
3 Nuit blanche Dubois 2020 88
4 Le Grand Marché Garnier 2018 102
5 Terres rouges Lemaire 2021 125

La durée est exprimée en minutes. Donner le résultat de chacune des requêtes suivantes.

  1. SELECT titre FROM FILM WHERE annee = 2018;

  2. SELECT titre, duree FROM FILM WHERE realisateur = 'Dubois' ORDER BY duree;

  3. SELECT COUNT(*) FROM FILM WHERE annee >= 2018;

  4. SELECT AVG(duree) FROM FILM;

  5. Écrire une requête qui renvoie les titres des films dont la durée est strictement supérieure à 100 minutes, puis donner son résultat.

Résoudre

Croiser plusieurs relations : les jointures

Une information utile est souvent répartie sur plusieurs relations. Pour la reconstituer, on joint les relations en comparant la clef étrangère à la clef primaire qu'elle référence. Ajoutons VELO(id_velo, modele, id_station) :

id_velo modele id_station
1 électrique 1
2 classique 1
3 électrique 3
4 classique 2
SELECT VELO.modele, STATION.nom

FROM VELO

JOIN STATION ON VELO.id_station = STATION.id

WHERE STATION.ville = 'Nantes';

JOIN … ON … associe chaque ligne de VELO à la ligne de STATION dont la clef primaire est égale à sa clef étrangère. On préfixe les attributs par le nom de la relation (STATION.nom) pour lever toute ambiguïté. Ici, le seul vélo à Nantes est le n° 3 : le résultat est électrique | Port.

Une même relation jointe deux fois

Parfois deux clefs étrangères d'une relation pointent vers la même relation. Avec LIGNE(id_ligne, depart, arrivee), où depart et arrivee référencent STATION.id, on joint STATION deux fois, sous deux alias différents :

SELECT d.nom, a.nom

FROM LIGNE

JOIN STATION AS d ON LIGNE.depart = d.id

JOIN STATION AS a ON LIGNE.arrivee = a.id;

Pour la ligne (1, 1, 3), on obtient Gare | Port. Sans alias, le SGBD ne saurait pas de quelle « copie » de STATION on parle.

Trouver ce qui manque : IS NULL

Une valeur absente se note NULL. On ne la teste pas avec = mais avec IS NULL (ou IS NOT NULL). Par exemple, pour une relation de prêts où date_retour vaut NULL tant que le livre n'est pas rendu, WHERE date_retour IS NULL sélectionne les prêts en cours.

Entraîne-toi★★☆Pas commencé
Une médiathèque utilise une base de données composée de trois relations. LIVRE(id_livre, titre, auteur) | id_livre | titre | auteur | |---|---|---| | 1 | Les Misérables…

Une médiathèque utilise une base de données composée de trois relations.

LIVRE(id_livre, titre, auteur)

id_livre titre auteur
1 Les Misérables Hugo
2 Germinal Zola
3 Candide Voltaire
4 Bel-Ami Maupassant

ADHERENT(id_adh, nom, ville)

id_adh nom ville
1 Dupont Lyon
2 Leroy Nantes
3 Fabre Lyon

EMPRUNT(id_adh, id_livre, date_emprunt)

id_adh id_livre date_emprunt
1 2 2025-03-04
1 3 2025-03-10
2 2 2025-03-12
3 1 2025-03-15
3 2 2025-03-20
  1. Identifier les clefs étrangères de la relation EMPRUNT et les relations auxquelles elles font référence.

  2. Écrire une requête qui renvoie les noms des adhérents ayant emprunté le livre « Germinal », puis donner son résultat trié par ordre alphabétique.

  3. Écrire une requête qui renvoie, sans doublon et par ordre alphabétique, les titres des livres empruntés par des adhérents habitant Lyon, puis donner son résultat.

  4. Donner le nombre de lignes renvoyées par la requête de la question 3 si l'on supprime le mot-clef DISTINCT.

  5. Écrire une requête qui renvoie le nombre total d'emprunts, puis donner son résultat.

Résoudre
Entraîne-toi★★☆Pas commencé
Un lycée stocke les notes de ses élèves dans deux relations. ELEVE(id, nom, classe) | id | nom | classe | |---|---|---| | 1 | Martin | TG1 | | 2 | Petit | TG1 | | 3 |…

Un lycée stocke les notes de ses élèves dans deux relations.

ELEVE(id, nom, classe)

id nom classe
1 Martin TG1
2 Petit TG1
3 Moreau TG2

NOTE(id_eleve, matiere, valeur)

id_eleve matiere valeur
1 NSI 15
1 Maths 12
2 NSI 11
2 Maths 14
3 NSI 17
3 Maths 9

Pour chacune des questions suivantes, écrire la requête SQL demandée, puis donner son résultat.

  1. Calculer la moyenne des notes de NSI de l'ensemble des élèves. Arrondir au centième.

  2. Donner le nom et la note de NSI des élèves de la classe TG1, par ordre décroissant de note.

  3. Déterminer le nombre de notes strictement supérieures à 12.

  4. Déterminer la meilleure note de mathématiques.

  5. Calculer la moyenne des notes de NSI des élèves de la classe TG1.

Résoudre
Entraîne-toi★★★Pas commencé
Une médiathèque gère ses prêts avec les relations suivantes. L'attribut date_retour vaut NULL tant que le livre n'a pas été rendu, et le test se fait avec IS NULL.…

Une médiathèque gère ses prêts avec les relations suivantes. L'attribut date_retour vaut NULL tant que le livre n'a pas été rendu, et le test se fait avec IS NULL.

LIVRE(id_livre, titre, auteur)

id_livre titre auteur
1 Les Misérables Hugo
2 Germinal Zola
3 Candide Voltaire

ADHERENT(id_adh, nom, ville)

id_adh nom ville
1 Dupont Lyon
2 Leroy Nantes
3 Fabre Lyon

EMPRUNT(id_adh, id_livre, date_emprunt, date_retour)

id_adh id_livre date_emprunt date_retour
1 2 2025-03-04 2025-03-18
1 3 2025-03-10 NULL
2 2 2025-03-12 NULL
3 1 2025-03-15 2025-03-29
3 2 2025-03-20 NULL
  1. Écrire une requête qui renvoie le nom de l'adhérent et le titre du livre pour chaque emprunt non rendu, puis donner son résultat trié par nom.

  2. Écrire une requête qui renvoie, sans doublon, les noms des adhérents ayant emprunté au moins un livre de Zola, puis donner son résultat trié par ordre alphabétique.

  3. Écrire une requête qui enregistre le retour du livre 2 par l'adhérent 2 le 2025-04-01, puis donner le nombre d'emprunts non rendus après cette mise à jour.

  4. On exécute INSERT INTO EMPRUNT VALUES (4, 1, '2025-04-02', NULL);. Expliquer pourquoi un système de gestion de bases de données qui vérifie l'intégrité référentielle refuse cette insertion.

Résoudre
Entraîne-toi★★★Pas commencé
Un réseau régional de trains TER est décrit par deux relations. L'attribut duree_min est la durée du trajet en minutes. Les attributs gare_depart et gare_arrivee sont…

Un réseau régional de trains TER est décrit par deux relations. L'attribut duree_min est la durée du trajet en minutes. Les attributs gare_depart et gare_arrivee sont des clefs étrangères qui référencent GARE.

GARE(id_gare, nom, ville)

id_gare nom ville
1 Dijon-Ville Dijon
2 Beaune Beaune
3 Chalon-sur-Saône Chalon
4 Mâcon-Ville Mâcon

TRAJET(id_trajet, gare_depart, gare_arrivee, duree_min)

id_trajet gare_depart gare_arrivee duree_min
1 1 2 25
2 2 3 20
3 3 4 35
4 1 3 40
5 1 4 70
  1. Expliquer pourquoi la relation GARE doit être utilisée deux fois dans une requête qui affiche le nom de la gare de départ et le nom de la gare d'arrivée de chaque trajet.

  2. Écrire une requête qui renvoie, pour chaque trajet dont la durée est strictement inférieure à 40 minutes, le nom de la gare de départ, le nom de la gare d'arrivée et la durée. On utilisera deux alias de la relation GARE. Donner le résultat par ordre croissant de durée.

  3. Donner le résultat de SELECT SUM(duree_min) FROM TRAJET WHERE id_trajet <= 3;.

  4. Les trajets 1, 2 et 3 forment un itinéraire de Dijon-Ville à Mâcon-Ville avec arrêts. Comparer sa durée totale à celle du trajet direct 5.

  5. Écrire une requête qui supprime le trajet 4, puis donner le nombre de lignes de la relation TRAJET après cette suppression.

Résoudre

Modifier le contenu : INSERT, UPDATE, DELETE

Trois requêtes de mise à jour modifient le contenu de la base.

Action Syntaxe
Ajouter une ligne INSERT INTO STATION VALUES (5, 'Lycée', 'Lyon', 6);
Modifier des valeurs UPDATE STATION SET velos = 10 WHERE nom = 'Mairie';
Supprimer des lignes DELETE FROM STATION WHERE velos = 0;

Les valeurs de INSERT sont données dans l'ordre des attributs du schéma. UPDATE et DELETE agissent sur toutes les lignes qui vérifient le WHERE. On peut calculer une nouvelle valeur à partir de l'ancienne : SET velos = velos + 5.

Entraîne-toi★☆☆Pas commencé
Une papeterie utilise la relation PRODUIT suivante (prix en euros). | ref | nom | prix | stock | |---|---|---|---| | 1 | Cahier | 2,50 | 40 | | 2 | Stylo | 1,20 | 100 |…

Une papeterie utilise la relation PRODUIT suivante (prix en euros).

ref nom prix stock
1 Cahier 2,50 40
2 Stylo 1,20 100
3 Classeur 4,80 25

On exécute successivement les trois requêtes suivantes.

UPDATE PRODUIT SET prix = 1.50 WHERE nom = 'Stylo';

DELETE FROM PRODUIT WHERE stock < 30;

INSERT INTO PRODUIT VALUES (4, 'Règle', 0.90, 60);
  1. Donner le contenu de la relation PRODUIT après chacune de ces requêtes.

  2. Écrire une requête qui augmente de 10 unités le stock du produit de référence 1.

  3. Indiquer, parmi UPDATE, DELETE, INSERT et SELECT, celles qui modifient le contenu de la base.

Résoudre

Redondance et anomalies

Une relation unique « fourre-tout » semble pratique, mais elle répète les mêmes informations. Voici des inscriptions à des clubs de lycée :

eleve adresse club cotisation
Lina 4 rue Hugo Judo 120
Lina 4 rue Hugo Théâtre 90
Nathan 8 rue Zola Judo 120

On y voit de la redondance : l'adresse de Lina est écrite deux fois, la cotisation du judo aussi. Cette répétition provoque trois anomalies.

  • Anomalie de mise à jour : si Lina déménage, il faut modifier plusieurs lignes. Si on en oublie une, la base devient incohérente (deux adresses pour la même élève).

  • Anomalie d'insertion : pour créer un club « Échecs » sans inscrit, il faudrait inventer un élève absent, ou laisser des cases vides.

  • Anomalie de suppression : si Nathan quitte le judo et que l'on supprime sa ligne, on perd aussi son adresse.

Le remède consiste à décomposer en plusieurs relations reliées par des clefs étrangères : ELEVE(id_eleve, nom, adresse), CLUB(id_club, nom_club, cotisation) et INSCRIPTION(id_eleve, id_club). Chaque information n'est alors écrite qu'une seule fois, et il suffit d'une jointure pour la retrouver.

Entraîne-toi★★☆Pas commencé
Une boutique en ligne stocke ses commandes dans une unique relation. COMMANDE(num_cmd, client, adresse_client, produit, prix) | num_cmd | client | adresse_client |…

Une boutique en ligne stocke ses commandes dans une unique relation.

COMMANDE(num_cmd, client, adresse_client, produit, prix)

num_cmd client adresse_client produit prix
101 Martin 12 rue Pasteur Cahier 2,50
102 Martin 12 rue Pasteur Stylo 1,20
103 Leroy 5 avenue Foch Cahier 2,50
  1. Repérer les redondances présentes dans cette relation.

  2. Pour chacune des situations suivantes, décrire l'anomalie rencontrée.

    a) Mise à jour : le client Martin déménage.

    b) Insertion : on souhaite enregistrer un nouveau client qui n'a encore passé aucune commande.

    c) Suppression : on supprime la commande 103.

  3. Proposer un schéma relationnel à trois relations, CLIENT, PRODUIT et COMMANDE, qui supprime ces anomalies. Souligner les clefs primaires et indiquer les clefs étrangères.

  4. Indiquer, dans le nouveau schéma, ce que devient la mise à jour de l'adresse de Martin.

Résoudre

Ce que fait un SGBD : accès concurrents

Un SGBD (PostgreSQL, MySQL, SQLite, Oracle…) ne se contente pas d'exécuter des requêtes. Il rend quatre services principaux :

  • la persistance des données : elles survivent à l'arrêt du serveur ;

  • la gestion des accès concurrents : plusieurs utilisateurs lisent et modifient la base en même temps sans la corrompre ;

  • l'efficacité du traitement des requêtes, même sur des bases énormes ;

  • la sécurisation des accès : chaque utilisateur n'a que les droits qui lui sont attribués.

Revenons à la place de concert. Il reste stock = 1. Alice lit 1, Bob lit aussi 1 avant qu'Alice n'ait écrit. Tous deux voient « stock > 0 », calculent 1 - 1 = 0 et écrivent 0. Résultat : la même place est vendue deux fois, et le stock affiche 0 alors que deux ventes ont eu lieu.

Deux clients lisent le même stock avant que l'un d'eux ait écrit, la place est vendue deux fois Alice Bob stock lit stock = 1 lit stock = 1 écrit stock = 0 écrit stock = 0 0 0

Pour éviter cela, le SGBD regroupe les trois étapes en une transaction et gère l'accès concurrent : avec un verrou, tant qu'Alice n'a pas terminé, Bob doit attendre. Quand il lit enfin, il trouve 0 et reçoit « plus de place ». On dit que la transaction est atomique : elle s'exécute en entier ou pas du tout.

Retour au début de la page : la dernière place n'est vendue qu'une fois parce que le SGBD sérialise les deux transactions, de sorte que le second client lise stock = 0.

Entraîne-toi★★★Pas commencé
Un site de réservation de places de concert enregistre ses données dans un système de gestion de bases de données. La relation PLACE contient notamment une ligne dont…

Un site de réservation de places de concert enregistre ses données dans un système de gestion de bases de données. La relation PLACE contient notamment une ligne dont l'attribut stock vaut 1 pour la référence 7.

Deux clients, Alice et Bob, cherchent à réserver cette dernière place au même moment. Le programme de chacun exécute les trois étapes suivantes.

  1. Lire la valeur de stock pour la référence 7.

  2. Si cette valeur est supérieure à 0, calculer stock - 1.

  3. Écrire la nouvelle valeur dans la base.

Les opérations s'entrelacent ainsi : Alice exécute l'étape 1, Bob exécute l'étape 1, Alice exécute les étapes 2 et 3, puis Bob exécute les étapes 2 et 3.

  1. Donner la valeur de stock à la fin de l'exécution et le nombre de places réellement vendues. Expliquer le problème rencontré.

  2. Citer le service d'un système de gestion de bases de données qui a pour rôle d'éviter ce problème.

  3. On propose la requête unique suivante.

UPDATE PLACE SET stock = stock - 1 WHERE ref = 7 AND stock > 0;
Expliquer pourquoi son exécution par un système de gestion de bases de données qui garantit l'absence d'accès concurrents conflictuels résout le problème.
  1. La relation CLIENT du site contient les attributs nom, prenom, email, date_naissance, adresse, numero_securite_sociale et historique_navigation. Le seul usage prévu est l'envoi des billets par courriel.

    a) Indiquer les attributs qui ne sont pas nécessaires à cet usage.

    b) Justifier ce choix par un principe de minimisation des données personnelles prévu par le RGPD.

Résoudre

L'essentiel

  • Vocabulaire : relation, attribut, enregistrement, domaine, schéma relationnel. La clef primaire identifie chaque ligne ; la clef étrangère référence la clef primaire d'une autre relation. Le SGBD refuse les violations de ces contraintes.

  • Consultation : SELECT … FROM … WHERE … ORDER BY …, avec DISTINCT et les agrégats COUNT, SUM, AVG, MIN, MAX. Chaînes entre apostrophes, IS NULL pour tester l'absence de valeur.

  • Jointure : JOIN … ON clef étrangère = clef primaire ; on utilise des alias pour joindre deux fois une même relation.

  • Mise à jour : INSERT INTO … VALUES, UPDATE … SET … WHERE, DELETE FROM … WHERE. Sans WHERE, toutes les lignes sont touchées.

  • Redondance : recopier une même information crée des anomalies de mise à jour, d'insertion et de suppression. On les évite en décomposant en relations reliées par des clefs étrangères.

  • SGBD : persistance, gestion des accès concurrents (transactions, verrous), efficacité et sécurisation des accès.

Voir tous les exercices de cette partie