La commande UPDATE est l'une des plus utilisées en SQL — et l'une des plus dangereuses si elle est mal maîtrisée. Mettre à jour une seule ligne ou des millions de lignes repose sur la même syntaxe de base, mais les erreurs de WHERE oublié ou mal ciblé peuvent avoir des conséquences immédiates en base de production. Dans cet article, vous apprenez à utiliser UPDATE correctement : syntaxe complète, mise à jour conditionnelle, jointure, et pièges classiques à éviter absolument en entretien technique.
📌 Ce qu'il faut retenir
UPDATEsans clauseWHEREmodifie toutes les lignes de la table- On peut combiner
UPDATEavecJOINpour modifier selon des données d'une autre table - Les sous-requêtes dans
UPDATEpermettent des mises à jour dynamiques et puissantes - Toujours tester avec un
SELECTéquivalent avant d'exécuter unUPDATEcritique
La syntaxe de base d'UPDATE en SQL
La structure minimale d'un UPDATE repose sur 3 éléments : la table cible, la ou les colonnes à modifier, et la condition de filtre.
UPDATE nom_table
SET colonne1 = valeur1,
colonne2 = valeur2
WHERE condition;
La clause SET accepte plusieurs colonnes séparées par des virgules. La clause WHERE est techniquement facultative, mais son absence signifie que chaque ligne de la table sera modifiée. C'est le piège numéro 1 en entretien et en production.
Exemple concret : corriger l'e-mail d'un utilisateur spécifique.
UPDATE utilisateurs
SET email = 'nouveau@exemple.com'
WHERE id = 42;
Ce UPDATE ne touche que la ligne dont l'identifiant vaut 42. La condition WHERE id = 42 agit comme un filtre exact, ce qui protège les autres lignes.
⚠️ Attention
Un UPDATE sans WHERE est irréversible si vous n'êtes pas dans une transaction. Avant toute mise à jour en production, encapsulez votre requête dans un BEGIN / ROLLBACK pour pouvoir annuler en cas d'erreur. Consultez notre guide sur les transactions SQL ACID pour maîtriser ce réflexe.
Mettre à jour plusieurs colonnes simultanément
UPDATE supporte nativement la modification de plusieurs colonnes dans une seule instruction. C'est plus performant que d'enchaîner plusieurs requêtes distinctes, et cela garantit l'atomicité de l'opération.
UPDATE produits
SET prix = 29.99,
stock = stock - 1,
mis_a_jour_le = NOW()
WHERE id_produit = 105;
Notez l'utilisation de stock = stock - 1 : on peut référencer la valeur actuelle de la colonne dans l'expression de mise à jour. Cette technique est très courante pour les compteurs, les soldes ou les horodatages.
L'expression NOW() (ou CURRENT_TIMESTAMP selon le moteur) permet de tracer automatiquement la date de modification, une bonne pratique de modélisation de données.
UPDATE avec JOIN : modifier selon une autre table
La forme la plus avancée d'UPDATE consiste à conditionner la mise à jour sur les données d'une table liée. La syntaxe varie légèrement selon les moteurs SQL.
Syntaxe MySQL et PostgreSQL (avec FROM)
-- PostgreSQL
UPDATE commandes c
SET statut = 'validée'
FROM clients cl
WHERE c.id_client = cl.id
AND cl.premium = TRUE
AND c.statut = 'en_attente';
-- MySQL
UPDATE commandes c
JOIN clients cl ON c.id_client = cl.id
SET c.statut = 'validée'
WHERE cl.premium = TRUE
AND c.statut = 'en_attente';
Ces 2 requêtes produisent le même résultat : toutes les commandes en attente appartenant à un client premium passent au statut "validée". C'est exactement le type de question posé dans les exercices SQL d'entretien.
💡 Bon à savoir
En PostgreSQL, la clause FROM dans un UPDATE se comporte comme un INNER JOIN implicite. Si aucune ligne de la table jointe ne correspond, la ligne source n'est pas mise à jour. Pour un comportement de LEFT JOIN, utilisez une sous-requête corrélée dans le SET.
UPDATE avec sous-requête
Les sous-requêtes permettent de calculer dynamiquement la valeur à affecter, ou de filtrer les lignes à mettre à jour selon un résultat agrégé.
Sous-requête dans SET
UPDATE employes
SET salaire = (
SELECT AVG(salaire) * 1.10
FROM employes
WHERE departement = 'Engineering'
)
WHERE poste = 'Junior Engineer';
Ici, on calcule la moyenne des salaires du département Engineering et on l'augmente de 10 % pour tous les Junior Engineers. La sous-requête est réévaluée une seule fois, puis la valeur est appliquée à toutes les lignes correspondantes.
Sous-requête dans WHERE
UPDATE produits
SET visible = FALSE
WHERE id_produit IN (
SELECT id_produit
FROM lignes_commande
GROUP BY id_produit
HAVING COUNT(*) = 0
);
Cette requête masque tous les produits qui n'ont jamais été commandés. La sous-requête dans WHERE avec IN est un pattern classique — pour comprendre les nuances entre IN et EXISTS, consultez notre article EXISTS vs IN en SQL.
Comparatif des syntaxes UPDATE selon les moteurs
| Fonctionnalité | MySQL | PostgreSQL | SQL Server | SQLite |
|---|---|---|---|---|
| UPDATE simple | ✅ | ✅ | ✅ | ✅ |
| UPDATE multi-colonnes | ✅ | ✅ | ✅ | ✅ |
| UPDATE avec JOIN | ✅ (syntaxe JOIN) | ✅ (syntaxe FROM) | ✅ (syntaxe FROM) | ❌ (sous-requête) |
| UPDATE avec RETURNING | ❌ | ✅ | ✅ (OUTPUT) | ✅ (depuis 3.35) |
| UPDATE avec CTE | ❌ | ✅ | ✅ | ❌ |
