Aller au contenu principal

Informatique · Terminale · 6 min de lecture

Modifier une base de données avec SQL

Construire des requêtes d'insertion (INSERT INTO … VALUES), de modification (UPDATE … SET … WHERE) et de suppression (DELETE FROM … WHERE) ; une requête de mise à jour doit respecter les contraintes d'intégrité (clé primaire unique, clé étrangère existante, domaine).

Chapitre du programme : Numérique et sciences informatiques (spécialité)

Bloc 1 sur 7 · Comprendre

Comprendre : insérer, modifier, supprimer

Toute la leçon part des deux tables suivantes, créées ainsi :

CREATE TABLE classes (nom TEXT PRIMARY KEY, salle TEXT);
CREATE TABLE eleves (prenom TEXT PRIMARY KEY, classe TEXT REFERENCES classes(nom), note INTEGER, age INTEGER);
Tableau : prenom, classe, note, age
prenomclassenoteage
AliceA1416
BilalB917
ChloéA1716
DavidC1218
EmmaB1516
FarahC817

La table classes contient les classes A (salle B12), B (C04) et C (B07). Trois requêtes modifient les données. Chaque requête de cette leçon est exécutée sur ces tables de départ, et non à la suite des précédentes :

Insérer une ligne avec INSERT INTO … VALUES :

INSERT INTO eleves VALUES ('Gabin', 'B', 11, 16);
SELECT COUNT(prenom) FROM eleves;

La table compte alors 7 lignes.

Modifier des lignes avec UPDATE … SET … WHERE : seules les lignes qui vérifient la condition changent.

UPDATE eleves SET note = note + 2 WHERE classe = 'C';
SELECT prenom, note FROM eleves WHERE classe = 'C';
Tableau : prenom, note
prenomnote
David14
Farah10

Supprimer des lignes avec DELETE FROM … WHERE :

DELETE FROM eleves WHERE note < 10;
SELECT prenom FROM eleves;

Sur la table de départ, Bilal (9) et Farah (8) sont supprimés : il reste Alice, Chloé, David et Emma.

Attention à l'ordre. Si l'on exécute réellement les trois requêtes à la suite (INSERT, puis UPDATE, puis DELETE), Farah a déjà 10 quand le DELETE arrive : seul Bilal est supprimé, et il reste Alice, Chloé, David, Emma, Farah et Gabin. Chaque requête porte sur la table telle que l'ont laissée les précédentes.

Bloc 2 sur 7 · Approfondir

Approfondir : les contraintes d'intégrité

On peut nommer les colonnes à remplir, dans l'ordre que l'on veut :

INSERT INTO eleves (prenom, classe, note, age) VALUES ('Hugo', 'A', 13, 17);
SELECT * FROM eleves WHERE classe = 'A';
Tableau : prenom, classe, note, age
prenomclassenoteage
AliceA1416
ChloéA1716
HugoA1317

Une mise à jour doit respecter les contraintes d'intégrité de la base ; sinon, le système de gestion de bases de données la refuse.

Clé primaire unique. prenom est la clé primaire : on ne peut pas insérer un second « Alice ».

INSERT INTO eleves VALUES ('Alice', 'C', 11, 17);
UNIQUE constraint failed: eleves.prenom

Clé étrangère existante. La colonne classe fait référence à la clé primaire de classes : la classe D n'existe pas, et l'on ne peut pas non plus supprimer la classe B tant que des élèves y sont inscrits. Dans SQLite, ce contrôle doit être activé par PRAGMA foreign_keys = ON (sans cette ligne, SQLite accepte l'insertion d'Inès en classe D).

PRAGMA foreign_keys = ON;
INSERT INTO eleves VALUES ('Inès', 'D', 13, 16);
FOREIGN KEY constraint failed
PRAGMA foreign_keys = ON;
DELETE FROM classes WHERE nom = 'B';
FOREIGN KEY constraint failed

Contrainte de domaine. Chaque colonne a un domaine, l'ensemble des valeurs permises (ici le type TEXT ou INTEGER). Un système de gestion de bases de données refuse en principe une valeur hors du domaine. SQLite fait exception : son typage est souple, et il accepte le texte 'abc' dans la colonne note de type INTEGER de cette leçon. Il ne refuse une valeur hors du domaine que si la table est déclarée STRICT, ou si une contrainte CHECK exclut cette valeur :

CREATE TABLE notes (prenom TEXT PRIMARY KEY, note INTEGER) STRICT;
INSERT INTO notes VALUES ('Jade', 'abc');
cannot store TEXT value in INTEGER column notes.note
CREATE TABLE notes (prenom TEXT PRIMARY KEY, note INTEGER CHECK (note BETWEEN 0 AND 20));
INSERT INTO notes VALUES ('Jade', 25);
CHECK constraint failed: note BETWEEN 0 AND 20

Bloc 3 sur 7 · Exemple

Exemple guidé : l'effet d'une mise à jour

Énoncé. Sur la table eleves de départ (somme des notes : 14 + 9 + 17 + 12 + 15 + 8 = 75), on exécute :

UPDATE eleves SET note = note + 3
WHERE note >= 12 AND classe = 'A';
SELECT SUM(note) FROM eleves;

Méthode.

  1. Quelles lignes la clause WHERE désigne-t-elle ? Classe A et note au moins 12 : Alice (14) et Chloé (17).
  2. Effet de la mise à jour : leurs notes augmentent de 3 ; les autres lignes ne changent pas.
  3. Requête d'interrogation, sur la table APRÈS mise à jour : 75 + 2 × 3 = 81.

Variante avec DELETE.

DELETE FROM eleves
WHERE NOT classe = 'C' AND age >= 17;
SELECT COUNT(prenom) FROM eleves;

Seul Bilal n'est pas en classe C et a au moins 17 ans : une ligne supprimée, il en reste 6 − 1 = 5.

Bloc 4 sur 7 · Visualiser

Voir : les trois requêtes de mise à jour

Tableau : Requête, Forme, Lignes touchées, Effet sur le nombre de lignes
RequêteFormeLignes touchéesEffet sur le nombre de lignes
InsertionINSERT INTO table VALUES (…)une nouvelle ligne+ 1
ModificationUPDATE table SET colonne = valeur WHERE conditioncelles qui vérifient la conditioninchangé
SuppressionDELETE FROM table WHERE conditioncelles qui vérifient la condition− nombre de lignes touchées

Sans clause WHERE, UPDATE et DELETE touchent toutes les lignes de la table.

Continuez sur votre lancée

Vous avez découvert l’essentiel et un exemple. Retrouvez la suite du cours et les points à retenir, puis passez à l’entraînement guidé dans votre compte.

  • Les formules et les repères à retenir
  • Les erreurs fréquentes expliquées
  • Un exercice avec des aides et sa correction

L’accès gratuit comprend les cours et exercices de votre niveau choisi.

Sources

  • BO spécial n°8 du 25 juillet 2019 — programme de spécialité numérique et sciences informatiques de terminale générale, annexe (https://eduscol.education.fr/document/30010/download) — rubrique « Bases de données », langage SQL : requêtes de mise à jour
  • ISO/IEC 9075, Information technology — Database languages — SQL
  • Documentation de SQLite — SQL As Understood By SQLite, « INSERT », « UPDATE », « DELETE » (https://www.sqlite.org/lang.html) et « SQLite Foreign Key Support » (https://www.sqlite.org/foreignkeys.html)

Vous pensez avoir trouvé une erreur dans cette leçon ? Signalez-la par e-mail.

Explorer les autres cours

Accès rapide