Numérique et sciences informatiques (spécialité) · TerminaleBac
SQL : jointures et mises à jour, cours de Terminale NSI
Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur
L'essentiel
- Une jointure (
JOIN ... ON) recolle les lignes de deux tables quand la clé étrangère de l'une est égale à la clé primaire de l'autre. - Dans
ON, on écrit la condition de raccordement ; dansWHERE, on filtre les lignes avecANDetOR(parenthèses si on mélange les deux). - Quand deux tables ont une colonne de même nom, on la préfixe :
eleve.id_classe. Les alias (FROM eleve AS e) allègent l'écriture. INSERT INTO ... VALUES ...ajoute une ligne ;UPDATE ... SET ... WHERE ...modifie des lignes existantes.- Un
UPDATEsansWHEREmodifie toute la table : c'est l'erreur la plus coûteuse. Vérifie la condition avec unSELECTd'abord.
Pourquoi joindre des tables ?
Dans une base de données relationnelle, on évite de recopier la même information à plusieurs endroits. Au lieu d'écrire l'intitulé d'une classe sur chaque ligne d'élève, on met l'intitulé une seule fois dans une table classe, et chaque élève porte seulement le numéro de sa classe. Les données sont mieux rangées, mais pour afficher « le nom de l'élève et sa classe » il faut recoller deux tables. C'est le rôle de la jointure.
Tu connais déjà le modèle relationnel et les requêtes SELECT ... FROM ... WHERE. Ce cours ajoute deux compétences : relier plusieurs tables dans une même requête, puis modifier le contenu d'une base avec des requêtes d'insertion et de mise à jour.
Le programme de la spécialité NSI en Terminale prévoit de savoir utiliser les opérateurs logiques AND et OR ainsi que JOIN ... ON, et de construire des requêtes d'insertion et de mise à jour avec UPDATE 2. Ces notions reviennent à l'épreuve écrite : l'un des trois exercices proposés porte sur les bases de données relationnelles et le langage SQL, sans calculatrice 1. Il vaut donc la peine de les écrire à la main, sans aide.
Les tables utilisées dans tout le cours
Pour que les résultats soient faciles à vérifier à la main, on travaille sur une base minuscule, inventée pour ce cours. Elle contient deux tables.
classe(id_classe, intitule, salle):id_classeest la clé primaire.eleve(id_eleve, nom, id_classe):id_eleveest la clé primaire, etid_classeest une clé étrangère qui renvoie àclasse.
| Table | Contenu (lignes) |
|---|---|
| eleve (id_eleve, nom, id_classe) | 1 Alice 1 ; 2 Bruno 1 ; 3 Chloé 2 ; 4 David 2 ; 5 Emma 2 ; 6 Farid NULL |
| classe (id_classe, intitule, salle) | 1 T1 B12 ; 2 T2 B14 ; 3 T3 C03 |
La jointure avec JOIN ... ON
Pour lire une jointure sans se tromper, imagine le raisonnement du SGBD : il parcourt les lignes de la première table, et pour chacune il garde les lignes de la seconde qui vérifient la condition ON. Si une ligne de gauche a deux correspondants, elle apparaît deux fois dans le résultat. Ce cas arrive quand on joint, par exemple, une classe avec ses élèves : la classe T2 sort trois fois, une par élève.
Préfixes, alias et ambiguïtés
Les deux tables contiennent une colonne id_classe. Si tu écris seulement id_classe, le SGBD ne sait pas laquelle tu désignes et la requête est refusée. On lève l'ambiguïté en écrivant table.colonne. Pour les colonnes dont le nom n'existe que dans une table (nom, intitule), le préfixe est facultatif, mais l'écrire rend la requête plus lisible.
Combiner des conditions avec AND et OR
Après une jointure, on veut souvent ne garder qu'une partie des lignes. On ajoute alors une clause WHERE et on combine les conditions avec les opérateurs logiques AND et OR 2.
A AND Best vrai quand les deux conditions sont vraies.A OR Best vrai quand au moins une des deux est vraie.
Joindre plus de deux tables
On peut enchaîner plusieurs JOIN. Imaginons une table note(id_note, id_eleve, matiere, valeur) où id_eleve est une clé étrangère vers eleve. Pour afficher le nom de l'élève, son intitulé de classe et ses notes, on relie les trois tables l'une après l'autre :
SELECT e.nom, c.intitule, n.matiere, n.valeur
FROM note AS n
JOIN eleve AS e ON n.id_eleve = e.id_eleve
JOIN classe AS c ON e.id_classe = c.id_classe
WHERE n.valeur >= 10;
Ajouter des données avec INSERT INTO
Le programme demande aussi de construire des requêtes d'insertion 2. Une requête INSERT INTO ajoute une nouvelle ligne dans une table.
Modifier des données avec UPDATE
La requête UPDATE modifie des lignes qui existent déjà 2. Elle comporte trois parties : la table concernée, les nouvelles valeurs avec SET, et la condition qui désigne les lignes à changer avec WHERE.
Démonstration · Pourquoi un UPDATE ne s'applique pas deux fois à la même ligne
Le SGBD examine chaque ligne de la table une fois. Pour une ligne donnée, il évalue la condition du WHERE sur les valeurs actuelles de cette ligne ; si elle est vraie, il calcule la nouvelle valeur à partir de l'ancienne et la range. Il passe ensuite à la ligne suivante. Chaque ligne est donc traitée au plus une fois par requête : une ligne à 9 devient 11, et la requête ne la revoit pas.
Méthode générale et erreurs à éviter au Bac
Exercices corrigés
Exercice 1 Combien de lignes pour la jointure ?
On reprend les tables eleve et classe du cours : six élèves dont les valeurs de id_classe sont 1, 1, 2, 2, 2 et NULL, et trois classes numérotées 1, 2 et 3.
On exécute :
SELECT e.nom, c.intitule
FROM eleve AS e
JOIN classe AS c ON e.id_classe = c.id_classe;
Combien de lignes contient le résultat ?
Indice 1
Une ligne d'élève est conservée seulement si elle trouve une classe correspondante.
Indice 2
Que vaut la comparaison entre NULL et un numéro de classe ?
Voir la correction pas à pas
On parcourt les élèves un par un : les cinq premiers ont un
id_classeégal à 1 ou 2, et ces classes existent dansclasse, donc chacun produit une ligne.Le sixième élève a
id_classeàNULL: la conditionONn'est jamais vraie pour lui, il ne produit aucune ligne.La classe 3 n'a aucun élève, elle ne produit aucune ligne non plus.
Le résultat contient donc 5 lignes.
Une jointure JOIN ... ON ne garde que les lignes qui ont un partenaire. Le nombre de lignes du résultat peut donc être inférieur à celui de la table de départ.
Exercice 2 Somme des valeurs après un UPDATE
Une table note contient une colonne valeur avec les cinq valeurs suivantes : 7, 9, 12, 15 et 8.
On exécute :
UPDATE note
SET valeur = valeur + 2
WHERE valeur < 10;
Quelle est la somme des cinq valeurs après la requête ?
Indice 1
Détermine d'abord quelles lignes vérifient valeur < 10, en utilisant les valeurs d'origine.
Indice 2
Chaque ligne n'est modifiée qu'une seule fois.
Voir la correction pas à pas
Les valeurs strictement inférieures à 10 sont 7, 9 et 8 : ce sont les seules lignes modifiées.
Elles deviennent 9, 11 et 10. Les valeurs 12 et 15 ne changent pas.
La somme vaut .
Vérification : la somme d'origine est 51, et trois lignes ont gagné 2 points chacune, soit .
Pour prévoir l'effet d'un UPDATE, repère d'abord les lignes qui vérifient le WHERE dans l'état initial, puis applique la modification à chacune.
Exercice 3 Écrire des requêtes sur la base du lycée
On utilise eleve(id_eleve, nom, id_classe) et classe(id_classe, intitule, salle).
- Écris une requête qui affiche le nom des élèves dont la classe est en salle
B12ou en salleB14, sauf l'élève nomméBruno. - Écris une requête qui ajoute l'élève numéro 8, nommé
Hana, dans la classe numéro 2. - Écris une requête qui change la salle de la classe
T1enB20.
Indice 1
Pour la question 1, une jointure est nécessaire car la salle est dans classe. Pense aux parenthèses.
Indice 2
Pour la question 3, la condition porte sur l'intitulé, pas sur le numéro.
Voir la correction pas à pas
Question 1 : on relie les tables, puis on groupe le
ORentre parenthèses avant leAND:SELECT e.nom FROM eleve AS e JOIN classe AS c ON e.id_classe = c.id_classe WHERE (c.salle = 'B12' OR c.salle = 'B14') AND e.nom <> 'Bruno';Question 2 : on donne les colonnes puis les valeurs dans le même ordre :
INSERT INTO eleve (id_eleve, nom, id_classe) VALUES (8, 'Hana', 2);Question 3 : on modifie une seule ligne, désignée par son intitulé :
UPDATE classe SET salle = 'B20' WHERE intitule = 'T1';
Les trois requêtes suivent la même logique : choisir les tables, écrire la condition qui relie ou désigne les lignes, puis vérifier que seules les lignes voulues sont concernées.
Quiz
6 questions · correction immédiate · ton score reste sur ton appareil.
-
La condition de raccordement s'écrit après
ON, par exempleeleve.id_classe = classe.id_classe2.SETappartient àUPDATEetVALUESàINSERT. LeSELECTne fait que choisir les colonnes affichées, il ne relie rien. -
ANDest prioritaire surOR, comme la multiplication sur l'addition. L'erreur tentante est de lire de gauche à droite, ce qui donnerait(A OR B) AND C. Pour ce sens-là, il faut des parenthèses. -
Sans
WHERE, la mise à jour s'applique à chaque ligne. La deuxième requête ne vise que l'élève 6. L'insertion ajoute une ligne sans toucher aux autres, et leSELECTne modifie rien. -
Faux : la comparaison avec
NULLn'est jamais vraie, donc la conditionONéchoue pour cet élève et sa ligne disparaît. On croit parfois queNULLserait traité comme une valeur ordinaire égale à elle-même, ce qui n'est pas le cas. -
Le programme demande de savoir écrire des requêtes d'insertion 2. Une insertion crée une nouvelle ligne, avec des valeurs rangées dans l'ordre des colonnes annoncées, et les textes entre apostrophes. Modifier une ligne existante est le rôle de
UPDATE, pas d'INSERT. -
Les valeurs 4 et 6 vérifient
v <= 6: elles deviennent 8 et 12. Les valeurs 10 et 20 restent. Somme : . Si tu as trouvé 40, tu as probablement additionné les valeurs d'origine sans appliquer la modification ; si tu as trouvé 80, tu as doublé toutes les lignes comme s'il n'y avait pas deWHERE.
Les questions qu'on se pose
Quelle est la différence entre ON et WHERE ?
ON exprime la liaison entre deux tables (clé étrangère égale à clé primaire). WHERE exprime un filtre sur les lignes du résultat, avec AND et OR 2. Pour une jointure simple comme celles du programme, garde cette répartition : elle rend la requête lisible et évite d'oublier la liaison.
Pourquoi ma jointure renvoie-t-elle un nombre de lignes énorme ?
Très souvent, la condition de liaison est absente ou fausse : chaque ligne d'une table est alors associée à chaque ligne de l'autre. Avec 6 élèves et 3 classes, on obtient lignes. Vérifie que chaque JOIN est suivi de son ON, et que les deux colonnes comparées sont bien la clé étrangère et la clé primaire qu'elle désigne.
Comment éviter de modifier trop de lignes avec UPDATE ?
Écris d'abord un SELECT avec la même condition WHERE et regarde les lignes renvoyées. Si elles sont bien celles que tu veux modifier, remplace le SELECT par UPDATE ... SET ... en gardant le WHERE. Au Bac, relis toujours ton WHERE et compte les lignes qu'il désigne sur l'exemple de l'énoncé.
Qu'est-ce qui tombe au Bac sur ce chapitre ?
L'épreuve écrite comporte un exercice consacré aux bases de données relationnelles et au langage SQL, sans calculatrice 1. On y attend des requêtes de sélection avec jointure, des conditions AND et OR, ainsi que des requêtes d'insertion et de mise à jour 2. Les questions demandent souvent de donner le résultat d'une requête sur des données fournies : entraîne-toi à le faire à la main.
Faut-il mettre des parenthèses autour des conditions ?
Dès que tu mélanges AND et OR, oui. AND est évalué avant OR, donc sans parenthèses ta condition peut signifier autre chose que ce que tu penses. Les parenthèses ne changent rien quand elles sont inutiles, et sauvent la requête quand elles sont nécessaires.
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.