Aller au contenu

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 ; dans WHERE, on filtre les lignes avec AND et OR (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 UPDATE sans WHERE modifie toute la table : c'est l'erreur la plus coûteuse. Vérifie la condition avec un SELECT d'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_classe est la clé primaire.
  • eleve(id_eleve, nom, id_classe) : id_eleve est la clé primaire, et id_classe est une clé étrangère qui renvoie à classe.
Les tables eleve et classe
TableContenu (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
Les tables eleve et classe · Jeu de données inventé pour ce cours.

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 B est vrai quand les deux conditions sont vraies.
  • A OR B est 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 ?

★☆☆Environ 5 min

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
  1. On parcourt les élèves un par un : les cinq premiers ont un id_classe égal à 1 ou 2, et ces classes existent dans classe, donc chacun produit une ligne.

  2. Le sixième élève a id_classe à NULL : la condition ON n'est jamais vraie pour lui, il ne produit aucune ligne.

  3. La classe 3 n'a aucun élève, elle ne produit aucune ligne non plus.

  4. 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

★★☆Environ 8 min

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
  1. Les valeurs strictement inférieures à 10 sont 7, 9 et 8 : ce sont les seules lignes modifiées.

  2. Elles deviennent 9, 11 et 10. Les valeurs 12 et 15 ne changent pas.

  3. La somme vaut 9+11+12+15+10=579 + 11 + 12 + 15 + 10 = 57.

  4. Vérification : la somme d'origine est 51, et trois lignes ont gagné 2 points chacune, soit 51+6=5751 + 6 = 57.

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

★★★Environ 12 min

On utilise eleve(id_eleve, nom, id_classe) et classe(id_classe, intitule, salle).

  1. Écris une requête qui affiche le nom des élèves dont la classe est en salle B12 ou en salle B14, sauf l'élève nommé Bruno.
  2. Écris une requête qui ajoute l'élève numéro 8, nommé Hana, dans la classe numéro 2.
  3. Écris une requête qui change la salle de la classe T1 en B20.
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
  1. Question 1 : on relie les tables, puis on groupe le OR entre parenthèses avant le AND :

    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';
    
  2. 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);
    
  3. 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.

  1. Quelle partie d'une requête contient la condition qui relie deux tables dans une jointure ?

  2. Avec A OR B AND C, dans quel ordre le SGBD évalue-t-il les opérateurs ?

  3. Quelle requête provoque la modification de toutes les lignes de la table eleve ?

  4. Une jointure JOIN ... ON ne garde que les lignes qui ont une correspondance. Affirmation : un élève dont id_classe vaut NULL apparaît dans le résultat de la jointure avec classe.

  5. Quelles propositions sont correctes pour INSERT INTO eleve (id_eleve, nom, id_classe) VALUES (9, 'Ali', 2); ?

    Plusieurs réponses possibles.

  6. Une colonne contient les valeurs 4, 6, 10 et 20. On exécute UPDATE t SET v = v * 2 WHERE v <= 6;. Quelle est la somme des valeurs ensuite ?

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 6×3=186 \times 3 = 18 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

  1. Spécialité NSI – Numérique et Sciences Informatiques, Éduscol STI. Consulté le 7 novembre 2026.
  2. 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.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page