Apprenez en lisant dans l'ordre

UPDATE et DELETE — mettre à jour et supprimer des lignes

Apprends SQL UPDATE et DELETE depuis les bases. Couvre les mises à jour multi-colonnes avec SET, les suppressions ciblées avec WHERE, et ce qui se passe quand tu oublies WHERE — tout s'exécute en direct dans ton navigateur.

UPDATE — réécrire des lignes existantes

INSERT servait à « ajouter de nouvelles lignes ». UPDATE est l'opération pour réécrire les valeurs de lignes qui existent déjà. Changer le statut d'un membre, réviser le prix d'un produit, mettre à jour un compteur d'achats — UPDATE fait partie du quotidien de toute app de production.

La forme de base est UPDATE nom_table SET col = val WHERE condition;. SET dit « quelle colonne reçoit quelle valeur », et WHERE dit « quelles lignes sont affectées ».

-- Réécrit le status du customer où id = 1 à 'active'
UPDATE customer SET status = 'active' WHERE id = 1;

-- Vérifie le résultat
SELECT * FROM customer;
Structure d'une instruction UPDATE
UPDATE tableSET col = valWHERE conditionTable ciblecustomerChangementstatus = 'active'Ligne cibleid = 1Table cibleRéécris une colonneRéduis les lignes
UPDATE nom_table est la table cible, SET col = val est le changement, et WHERE condition réduit la liste des lignes. Visualise la position et le rôle de chacun.

Oublier WHERE met à jour toutes les lignes

Retire le WHERE de UPDATE customer SET status = 'active' WHERE id = 1; (ça devient UPDATE customer SET status = 'active';) et chaque ligne de customer voit son status réécrit à 'active'. Aucune erreur n'est levée, et c'est exactement ce qui en fait un moyen facile de corrompre silencieusement des données de production.

Imagine que tu fais passer un client (Alice) de pending à active. (Exécute correctement et l'explication apparaîtra.)

① Exécute d'abord SELECT name, status FROM customer WHERE id = 1; et confirme que le status d'Alice est 'pending' (pas encore active).

② Mets à jour la colonne status à 'active' pour la ligne de customer`id = 1` (Alice).

③ Enfin, exécute SELECT * FROM customer; et confirme que seul le status d'Alice est passé à 'active', tandis que Bob et Carol sont inchangés.

(WHERE utilise ici la même syntaxe de filtre que celle vue dans l'article SELECT.)

Éditeur SQL

Exécutez une requête pour voir les résultats

Mettre à jour plusieurs colonnes d'un coup

En listant des paires `col = val` séparées par des virgules dans la clause SET, tu peux mettre à jour plusieurs colonnes d'un coup : SET col1 = val1, col2 = val2, ....

Le côté droit peut aussi être une expression qui inclut la colonne elle-même. SET price = price + 100 veut dire « réécris le price de la ligne cible à son price actuel plus 100 ».

Variantes de la clause SET
Colonne uniqueSET status = 'active'Plusieurs colonnes(séparées par des virgules)SET price = 200, stock = 100Expression(réfère à elle-même)SET price = price + 100CombinaisonSET price = price + 100, stock = stock - 10
SET peut contenir une seule paire col = val ou plusieurs séparées par des virgules, et le côté droit peut aussi être une expression.
-- Met à jour plusieurs colonnes à des valeurs absolues d'un coup
UPDATE inventory SET price = 200, stock = 100 WHERE id = 2;

-- Met à jour avec des expressions (en référençant les valeurs existantes)
UPDATE inventory SET price = price + 100, stock = stock - 10 WHERE id = 2;

Imagine un écran d'inventaire où tu veux réviser le prix et le stock de la gomme.

① Pour la ligne d'inventory`id = 2` (Gomme), mets à jour price à 200 et stock à 100 en même temps.

② Enfin, exécute SELECT * FROM inventory; et confirme que seul id=2 a été mis à jour avec les nouvelles valeurs, tandis que id=1 (Crayon) et id=3 (Cahier) sont inchangés.

Éditeur SQL

Exécutez une requête pour voir les résultats

Imagine : « augmente le prix du crayon (id=1) de 100 et réduis son stock de 10 ». Mettre une expression qui référence la colonne elle-même côté droit de SET te permet de faire des changements relatifs à la valeur actuelle.

① Pour la ligne d'inventory`id = 1` (Crayon), mets à jour les deux colonnes d'un coup avec `price = price + 100` et `stock = stock - 10`.

② Enfin, exécute SELECT * FROM inventory WHERE id = 1; et confirme que le price du crayon est 180 et que stock est 190.

Éditeur SQL

Exécutez une requête pour voir les résultats

DELETE — supprimer des lignes

DELETE est l'opération pour supprimer des lignes d'une table. La forme de base est DELETE FROM nom_table WHERE condition;, avec WHERE qui réduit les lignes cibles. Contrairement à SELECT, il n'y a pas de liste de colonnes (SELECT col1, col2) — DELETE supprime des lignes entières.

La définition de la table (la structure des colonnes) reste en place, donc tu peux faire des INSERT dans la même table après suppression. Pour supprimer la table elle-même, utilise DROP TABLE / TRUNCATE (couvert dans le prochain article).

Structure d'une instruction DELETE
DELETE FROM tableWHERE conditionTable ciblesubscriptionLignes à retirerstatus = 'expired'Table cibleRéduis les lignes
DELETE FROM nom_table est la table cible ; WHERE condition décide quelles lignes retirer. Il n'y a pas d'équivalent à la liste de colonnes de SELECT ni à la clause SET d'UPDATE dans DELETE.
-- Supprime tous les abonnements expirés (status = 'expired')
DELETE FROM subscription WHERE status = 'expired';

-- Vérifie le résultat (seules les lignes survivantes restent)
SELECT * FROM subscription;

Imagine que tu nettoies en masse les abonnements expirés.

① Depuis subscription, supprime toutes les lignes où `status` vaut `'expired'`.

② Enfin, exécute SELECT * FROM subscription; et confirme que les seuls survivants sont les 2 lignes où status = 'active' (Bob / Dave).

(Toute ligne correspondant à la condition WHERE est ciblée — sans préciser l'id, plusieurs lignes correspondantes disparaissent d'un coup.)

Éditeur SQL

Exécutez une requête pour voir les résultats

Attention au WHERE manquant — le piège de l'update/delete sur toutes les lignes

Oublier WHERE est l'accident le plus fréquent avec UPDATE et DELETE. Sans WHERE, la syntaxe reste légale — et la cible s'étend à chaque ligne de la table. UPDATE table SET col = val; réécrit chaque ligne à la même valeur ; DELETE FROM table; vide la table.

Même si tu remarques tout de suite, tu ne peux pas annuler après que le changement a été commité. La règle opérationnelle de base en production est de toujours exécuter le même WHERE en `SELECT` d'abord pour confirmer visuellement les lignes cibles avant de réécrire.

Avec WHERE vs. sans WHERE
DELETE FROM cache_entry WHERE id = 1;→ Supprime seulement id=1(sûr — restreint par WHERE)DELETE FROM cache_entry;→ Toutes les lignes supprimées(la table devient vide)UPDATE customer SET status = 'active' WHERE id = 1;→ Met à jour seulement id=1(les autres customers inchangés)UPDATE customer SET status = 'active';→ Status de chaque ligne à 'active'(chaque customer devient active)
Le simple fait d'avoir ou non WHERE bascule l'opération entre « agir sur une ligne ciblée » et « agir sur toutes les lignes d'un coup ». Le rayon d'impact d'un oubli est, littéralement, toute la table.

En production, confirme les lignes cibles avec SELECT d'abord

Pour un UPDATE / DELETE sur une base de production, exécute d'abord le même WHERE en SELECT et confirme visuellement que les lignes cibles sont bien celles attendues avant de basculer en réécriture. La procédure en deux étapes :

1. Exécute SELECT * FROM nom_table WHERE condition; pour confirmer les lignes cibles (le nombre de lignes et les valeurs correspondent-ils à ce que tu attendais ?)

2. Si tout a l'air bon, transforme le même WHERE en UPDATE nom_table SET col = val WHERE condition; ou DELETE FROM nom_table WHERE condition; et exécute

Comme la clause WHERE est réutilisée par copier-coller, ça réduit aussi le genre d'accident où WHERE est accidentellement supprimé lors de la réécriture.

Imagine : « vide le cache et reconstruis-le depuis zéro ». La table cache_entry commence l'article avec 3 lignes mises en cache.

Sans écrire de WHERE, exécute un DELETE qui supprime toutes les lignes de cache_entry.

② Enfin, exécute SELECT * FROM cache_entry; et confirme que le résultat est 0 ligne (table vide).

(DELETE sans WHERE est une recette à accidents en production — il est ici délibérément placé en dernier exercice pour que tu en ressentes le comportement de première main.)

Éditeur SQL

Exécutez une requête pour voir les résultats
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Lequel décrit correctement les rôles de SET et WHERE dans une instruction UPDATE ?

Question 2Quelle est la bonne manière de mettre à jour à la fois name et email pour la ligne de customer où id = 1 en même temps ?

Question 3Que se passe-t-il quand tu exécutes DELETE FROM product; sans WHERE ?