Numérique et sciences informatiques (spécialité) · TerminaleBac
SQL : jointures et mises à jour, exercices corrigés de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Une jointure relie deux tables :
JOIN ... ONindique l'égalité entre la clé étrangère et la clé primaire. - Quand une colonne existe dans plusieurs tables, préfixe-la par le nom de la table (
livre.id_auteur). WHEREfiltre les lignes après la jointure ; combine les conditions avecAND,ORet des parenthèses.UPDATE ... SET ... WHERE ...modifie des lignes existantes ; sansWHERE, toute la table est modifiée.INSERT INTO ... VALUES ...ajoute une ligne ; la valeur de la clé étrangère doit correspondre à une ligne existante.
Comment utiliser ces exercices
Ces exercices portent sur la partie « bases de données » du programme de Terminale en spécialité NSI. Le programme demande de savoir écrire des requêtes avec les opérateurs logiques AND et OR, de réaliser des jointures avec JOIN ... ON, et de construire des requêtes d'insertion et de mise à jour, notamment avec UPDATE 2. À l'épreuve écrite, un exercice sur les bases de données relationnelles et le langage SQL figure parmi les exercices proposés, et la calculatrice n'est pas autorisée 1. Tu dois donc savoir dérouler une requête à la main, sur une petite table, sans machine.
La base de données utilisée
Tous les exercices utilisent la même petite base de bibliothèque, composée de quatre tables. Les clés primaires sont id_auteur, id_livre, id_lecteur et id_emprunt. Les clés étrangères sont livre.id_auteur, emprunt.id_livre et emprunt.id_lecteur.
Table auteur
| id_auteur | nom | pays |
|---|---|---|
| 1 | Hugo | France |
| 2 | Zola | France |
| 3 | Orwell | Royaume-Uni |
| 4 | Nothomb | Belgique |
Table livre
| id_livre | titre | annee | id_auteur | prix |
|---|---|---|---|---|
| 1 | Les Misérables | 1862 | 1 | 12.50 |
| 2 | Germinal | 1885 | 2 | 8.00 |
| 3 | 1984 | 1949 | 3 | 9.50 |
| 4 | Notre-Dame de Paris | 1831 | 1 | 10.00 |
| 5 | La Bête humaine | 1890 | 2 | 7.50 |
Table lecteur
| id_lecteur | nom | ville |
|---|---|---|
| 1 | Alice | Lyon |
| 2 | Bilal | Paris |
| 3 | Chloé | Lyon |
Table emprunt
| id_emprunt | id_livre | id_lecteur |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 3 | 1 |
| 3 | 2 | 2 |
| 4 | 1 | 3 |
| 5 | 3 | 2 |
Les exercices
Exercice 1 Première jointure : livres et auteurs
On souhaite afficher, pour chaque livre, son titre et le nom de son auteur.
- Écris la requête SQL qui réalise cette jointure entre
livreetauteur. - Combien de lignes contient le résultat ? Explique pourquoi l'auteure Nothomb n'y figure pas.
Indice 1
La clé étrangère est livre.id_auteur, elle désigne la clé primaire auteur.id_auteur.
Indice 2
Compte, auteur par auteur, le nombre de livres qui lui sont rattachés dans la table livre.
Voir la correction pas à pas
On place la table
livredans leFROM, puis on ajouteJOIN auteur.On écrit la condition de jointure :
ON livre.id_auteur = auteur.id_auteur.On choisit les colonnes à afficher :
livre.titreetauteur.nom.Requête complète :
SELECT livre.titre, auteur.nom FROM livre JOIN auteur ON livre.id_auteur = auteur.id_auteur;Pour compter les lignes, on associe chaque livre à son auteur : Hugo a 2 livres, Zola en a 2, Orwell en a 1. Total : 2 + 2 + 1 = 5 lignes.
Nothomb n'a aucun livre : aucune ligne de
livren'aid_auteur = 4. La conditionONn'est vraie pour aucune paire contenant cette auteure, qui disparaît du résultat.
Une jointure produit une ligne par couple de lignes qui vérifient la condition ON. Une ligne sans correspondance (ici Nothomb) n'apparaît pas.
Exercice 2 Jointure et filtre : auteurs français
On veut les titres des livres écrits par un auteur dont le pays est « France » et dont le prix est strictement supérieur à 8.
- Écris la requête.
- Combien de lignes obtiens-tu ?
Indice 1
Le pays est dans la table auteur, le prix dans la table livre : il faut donc une jointure.
Indice 2
Les deux conditions doivent être vraies en même temps : quel opérateur logique utiliser ?
Voir la correction pas à pas
On joint
livreetauteuravecON livre.id_auteur = auteur.id_auteur.On ajoute le filtre :
WHERE auteur.pays = 'France' AND livre.prix > 8.Requête complète :
SELECT livre.titre FROM livre JOIN auteur ON livre.id_auteur = auteur.id_auteur WHERE auteur.pays = 'France' AND livre.prix > 8;On parcourt les livres d'auteurs français : Les Misérables (12.50) et Notre-Dame de Paris (10.00) de Hugo, Germinal (8.00) et La Bête humaine (7.50) de Zola.
Germinal vaut exactement 8.00 : la condition
> 8est fausse, ce livre est exclu. La Bête humaine (7.50) est exclue aussi.Il reste 2 lignes : Les Misérables et Notre-Dame de Paris.
Avec AND, une ligne est gardée seulement si les deux conditions sont vraies. Fais attention à l'inégalité stricte : un prix égal à 8 ne vérifie pas > 8.
Exercice 3 Trois tables : qui a emprunté quoi ?
On veut afficher le titre de chaque livre emprunté et le nom du lecteur, mais seulement pour les lecteurs qui habitent à Lyon.
- Écris la requête, en partant de la table
emprunt. - Combien de lignes obtiens-tu ?
Indice 1
La table emprunt ne contient que des numéros : il faut deux jointures, une vers livre et une vers lecteur.
Indice 2
Filtre sur lecteur.ville dans le WHERE, après avoir écrit les deux jointures.
Voir la correction pas à pas
On part de
empruntdans leFROM.Première jointure, vers les livres :
JOIN livre ON emprunt.id_livre = livre.id_livre.Seconde jointure, vers les lecteurs :
JOIN lecteur ON emprunt.id_lecteur = lecteur.id_lecteur.On filtre :
WHERE lecteur.ville = 'Lyon'.Requête complète :
SELECT livre.titre, lecteur.nom FROM emprunt JOIN livre ON emprunt.id_livre = livre.id_livre JOIN lecteur ON emprunt.id_lecteur = lecteur.id_lecteur WHERE lecteur.ville = 'Lyon';Les lecteurs lyonnais sont Alice (emprunts 1 et 2) et Chloé (emprunt 4). Cela donne 2 + 1 = 3 lignes : Les Misérables et 1984 pour Alice, Les Misérables pour Chloé.
Chaque jointure supplémentaire ajoute une ligne JOIN ... ON. Un même livre peut apparaître plusieurs fois s'il a été emprunté par plusieurs lecteurs.
Exercice 4 Mise à jour des prix avec UPDATE
La bibliothèque augmente de 10 % le prix de tous les livres parus avant 1900.
- Écris la requête de mise à jour.
- Quel est le nouveau prix des Misérables (en euros) ?
- Le prix de 1984 change-t-il ? Justifie.
Indice 1
Le nouveau prix est l'ancien prix multiplié par 1,10.
Indice 2
Sans clause WHERE, quelles lignes seraient modifiées ?
Voir la correction pas à pas
On modifie la table
livre:UPDATE livre.On indique la nouvelle valeur de la colonne :
SET prix = prix * 1.10.On restreint aux livres anciens :
WHERE annee < 1900.Requête complète :
UPDATE livre SET prix = prix * 1.10 WHERE annee < 1900;Les Misérables datent de 1862, donc ils sont concernés : 12.50 × 1,10 = 13.75 euros.
1984 date de 1949, ce qui n'est pas inférieur à 1900 : la condition du
WHEREest fausse, son prix reste 9.50.
UPDATE agit sur toutes les lignes qui vérifient le WHERE, et sur elles seules. Le membre de droite du SET peut utiliser l'ancienne valeur de la colonne.
Exercice 5 Insérer une ligne puis la retrouver
On ajoute le roman Au bonheur des dames (paru en 1883, prix 9.00, écrit par Zola) à la table livre avec le numéro 6.
- Écris la requête d'insertion.
- Écris une requête qui affiche tous les titres de Zola avec une jointure.
- Combien de lignes obtiens-tu après l'insertion ?
Indice 1
Dans VALUES, respecte l'ordre des colonnes que tu as listées après le nom de la table.
Indice 2
Quel numéro faut-il mettre dans id_auteur pour que la jointure retrouve Zola ?
Voir la correction pas à pas
Le numéro de Zola dans la table
auteurest 2 : c'est la valeur de la clé étrangère à saisir.Requête d'insertion :
INSERT INTO livre (id_livre, titre, annee, id_auteur, prix) VALUES (6, 'Au bonheur des dames', 1883, 2, 9.00);Requête de recherche :
SELECT livre.titre FROM livre JOIN auteur ON livre.id_auteur = auteur.id_auteur WHERE auteur.nom = 'Zola';Avant l'insertion, Zola a 2 livres (Germinal, La Bête humaine). Le nouveau livre s'ajoute : 2 + 1 = 3 lignes.
Une insertion doit respecter les liens entre tables : avec une clé étrangère inexistante (par exemple id_auteur = 9), la contrainte de référence n'est pas respectée et le SGBD refuse l'insertion.
Exercice 6 Corriger trois requêtes fausses
Chaque requête ci-dessous contient une erreur. Pour chacune, explique l'erreur et propose la version corrigée.
a)
SELECT titre, nom FROM livre JOIN auteur;
b)
SELECT titre FROM livre
JOIN auteur ON livre.id_auteur = auteur.id_auteur
WHERE id_auteur = 1;
c) On veut passer à 11 euros le prix de Germinal uniquement.
UPDATE livre SET prix = 11;
Indice 1
Pour a), relis la structure d'une jointure : que manque-t-il après le nom de la seconde table ?
Indice 2
Pour b), dans quelles tables trouve-t-on une colonne id_auteur ?
Indice 3
Pour c), combien de lignes cette requête modifie-t-elle ?
Voir la correction pas à pas
a) Il manque la condition de jointure. Sans
ON, le SGBD ne sait pas comment relier les lignes. Correction :SELECT titre, nom FROM livre JOIN auteur ON livre.id_auteur = auteur.id_auteur;.b) La colonne
id_auteurexiste danslivreet dansauteur: le nom est ambigu dans leWHERE. Correction :WHERE livre.id_auteur = 1(ouauteur.id_auteur = 1, qui donne le même résultat ici grâce à la jointure).c) Il manque le
WHERE: la requête fixe le prix de tous les livres à 11. Correction :UPDATE livre SET prix = 11 WHERE titre = 'Germinal';.Conséquence de c) : sur les cinq livres de la table, les cinq prix seraient écrasés, et les anciens prix perdus.
Trois réflexes évitent ces erreurs : toujours un ON après un JOIN, toujours préfixer une colonne présente dans plusieurs tables, toujours relire le WHERE d'un UPDATE avant de l'exécuter.
Exercice 7 Combiner AND, OR et quatre tables
On revient à la base de départ (sans les modifications des exercices précédents). On veut les titres des livres empruntés et les noms des lecteurs, en gardant seulement les emprunts où l'auteur est français ET (le lecteur habite Lyon OU le titre est 1984).
- Écris la requête avec les jointures nécessaires.
- Détermine à la main les emprunts retenus et donne leur nombre.
- Explique le rôle des parenthèses.
Indice 1
Il faut relier emprunt à livre, lecteur, puis livre à auteur.
Indice 2
Examine chaque emprunt (1 à 5) un par un : l'auteur est-il français ? Puis la seconde condition est-elle vraie ?
Voir la correction pas à pas
On part de
empruntet on le relie àlivre, puis àlecteur, puis on relielivreàauteur.Requête complète :
SELECT livre.titre, lecteur.nom FROM emprunt JOIN livre ON emprunt.id_livre = livre.id_livre JOIN lecteur ON emprunt.id_lecteur = lecteur.id_lecteur JOIN auteur ON livre.id_auteur = auteur.id_auteur WHERE auteur.pays = 'France' AND (lecteur.ville = 'Lyon' OR livre.titre = '1984');Emprunt 1 : Les Misérables (Hugo, France), Alice de Lyon. Retenu.
Emprunt 2 : 1984 d'Orwell (Royaume-Uni). L'auteur n'est pas français : rejeté, même si Alice habite Lyon.
Emprunt 3 : Germinal (Zola, France), Bilal de Paris, titre différent de 1984. La parenthèse est fausse : rejeté.
Emprunt 4 : Les Misérables, Chloé de Lyon. Retenu.
Emprunt 5 : 1984 d'Orwell. Auteur non français : rejeté. Il reste 2 emprunts : les numéros 1 et 4.
Les parenthèses regroupent les deux conditions alternatives pour que
AND auteur.pays = 'France's'applique à l'ensemble. Sans elles,ANDserait évalué avantOR: les emprunts de 1984 (n° 2 et n° 5) seraient retenus en plus, alors que l'auteur n'est pas français.
Mélange AND et OR ? Mets toujours des parenthèses : elles rendent la requête lisible et fixent sans ambiguïté ce que tu veux. Pour une requête compliquée, déroule-la ligne par ligne sur la table des emprunts.
Exercice 8 Mettre à jour grâce à des repères connus
Imagine qu'une erreur de saisie ait rattaché La Bête humaine (livre numéro 5) à Hugo, avec id_auteur = 1. On souhaite la rattacher de nouveau à Zola (numéro 2), puis réaliser un contrôle.
- Écris la requête
UPDATEqui fixeid_auteurà 2 pour le livre numéro 5, sans toucher aux autres. - Écris la requête de contrôle qui affiche titre et nom d'auteur pour ce seul livre.
- Quelle serait la conséquence d'un
WHERE id_livre = 50?
Indice 1
Le livre est identifié par sa clé primaire : c'est le critère le plus sûr pour un WHERE.
Indice 2
Si aucune ligne ne vérifie le WHERE, que fait UPDATE ?
Voir la correction pas à pas
On cible la table
livreet on modifie uniquement la clé étrangère.Requête de mise à jour :
UPDATE livre SET id_auteur = 2 WHERE id_livre = 5;Requête de contrôle :
SELECT livre.titre, auteur.nom FROM livre JOIN auteur ON livre.id_auteur = auteur.id_auteur WHERE livre.id_livre = 5;Le résultat attendu est une seule ligne : La Bête humaine et Zola.
Avec
WHERE id_livre = 50, aucune ligne ne vérifie la condition : la requête s'exécute sans erreur mais ne modifie rien. Le contrôle montre alors l'ancienne valeur, d'où l'intérêt de vérifier après chaque mise à jour.
Utilise la clé primaire dans le WHERE d'un UPDATE pour viser une seule ligne. Une requête qui ne modifie rien n'est pas forcément signalée comme une erreur : contrôle toujours le résultat avec un SELECT.
Les questions qu'on se pose
Pourquoi écrire `livre.id_auteur` plutôt que `id_auteur` ?
Dans une jointure, plusieurs tables peuvent avoir une colonne portant le même nom, comme id_auteur ici. Le SGBD ne sait alors pas laquelle tu désignes et refuse la requête. En préfixant par le nom de la table, tu lèves toute ambiguïté. Prends l'habitude de préfixer toutes les colonnes dès que tu fais une jointure : c'est aussi plus clair à la lecture.
Comment vérifier une requête SQL sans calculatrice ni machine ?
À l'épreuve écrite, la calculatrice n'est pas autorisée 1, mais tu n'en as pas besoin : les tables sont petites. Écris les lignes de la table principale, ajoute à côté les informations venues des autres tables grâce à la condition ON, puis barre les lignes qui ne vérifient pas le WHERE. Il reste exactement le résultat de la requête, que tu peux compter.
Sources
- Spécialité NSI – Numérique et Sciences Informatiques, Éduscol STI. Consulté le 7 novembre 2026.
- Baccalauréat général 2025 – Numérique et sciences informatiques, Ministère de l'Éducation Nationale. Consulté le 7 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.