SQL Pratique
UPDATE en SQL : modifier vos données sans erreur
8 min de lecture

UPDATE en SQL : modifier vos données sans erreur

Maîtrisez la commande UPDATE en SQL : syntaxe, clauses WHERE, JOIN et cas pièges. Guide pratique pour éviter les erreurs en entretien et en production.

Avatar de Thomas LeroyThomas Leroy

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

  • UPDATE sans clause WHERE modifie toutes les lignes de la table
  • On peut combiner UPDATE avec JOIN pour modifier selon des données d'une autre table
  • Les sous-requêtes dans UPDATE permettent des mises à jour dynamiques et puissantes
  • Toujours tester avec un SELECT équivalent avant d'exécuter un UPDATE critique

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

RETURNING : récupérer les lignes modifiées

PostgreSQL et SQL Server proposent une clause qui renvoie les lignes après modification. C'est extrêmement utile pour tracer les changements ou alimenter une table d'audit.

-- PostgreSQL
UPDATE utilisateurs
SET statut = 'inactif'
WHERE derniere_connexion < NOW() - INTERVAL '1 year'
RETURNING id, email, statut;

La clause RETURNING fonctionne comme un SELECT sur les lignes touchées, après l'application du SET. Sur SQL Server, l'équivalent s'appelle OUTPUT.

UPDATE avec CASE WHEN : logique conditionnelle

Il est possible d'appliquer des valeurs différentes selon des conditions, sans multiplier les requêtes, grâce à CASE WHEN dans le SET.

UPDATE produits
SET categorie_prix = CASE
    WHEN prix < 10  THEN 'économique'
    WHEN prix < 50  THEN 'standard'
    ELSE 'premium'
END
WHERE categorie_prix IS NULL;

Cette technique permet de classifier ou recalibrer des données en une seule passe, ce qui est bien plus performant que 3 requêtes UPDATE séparées. C'est un pattern fréquemment évalué dans les tests techniques data.

Les erreurs classiques à éviter avec UPDATE

Voici les 4 erreurs les plus fréquentes observées en entretien et en code de production :

  • Oublier le WHERE : toute la table est mise à jour. Toujours relire la requête avant exécution.
  • Confondre les alias en MySQL : en MySQL, l'alias de table dans UPDATE ... JOIN doit être déclaré après le nom de la table, pas avant.
  • Modifier une colonne de jointure : mettre à jour la colonne utilisée dans le ON de la jointure peut produire des comportements inattendus.
  • Ignorer les contraintes : un UPDATE peut violer une contrainte FOREIGN KEY ou CHECK et déclencher une erreur. Anticipez les dépendances avant d'exécuter.

💡 Bon à savoir

Avant tout UPDATE complexe, transformez mentalement votre requête en SELECT : remplacez UPDATE table SET col = val par SELECT col FROM table avec le même WHERE. Si le SELECT retourne les bonnes lignes, votre UPDATE est correct.


Questions fréquentes

Comment annuler un UPDATE déjà exécuté ?

Si vous êtes dans une transaction ouverte avec BEGIN, utilisez ROLLBACK pour annuler. Hors transaction, le UPDATE est définitif — il faut restaurer depuis une sauvegarde ou un journal de transactions (WAL en PostgreSQL, binlog en MySQL). C'est pour cette raison qu'on recommande systématiquement d'envelopper les UPDATE critiques dans une transaction.

Peut-on faire un UPDATE sur une vue SQL ?

Oui, sous conditions. La vue doit être "updatable" : elle ne doit pas contenir de GROUP BY, DISTINCT, d'agrégats, ni de jointures complexes qui rendraient la source ambiguë. En PostgreSQL, il est possible de créer des règles ou des triggers INSTEAD OF pour rendre n'importe quelle vue modifiable.

Quelle est la différence entre UPDATE et UPSERT ?

UPDATE modifie uniquement les lignes existantes. Un UPSERT (INSERT ON CONFLICT en PostgreSQL, MERGE en SQL Server) insère la ligne si elle n'existe pas, ou la met à jour si elle existe déjà. C'est le pattern idéal pour les synchronisations de données ou les chargements ETL.

Est-ce qu'un UPDATE verrouille la table ?

Cela dépend du moteur et du niveau d'isolation. En MySQL InnoDB et PostgreSQL, UPDATE pose un verrou de ligne (row-level lock) sur les lignes modifiées, pas sur toute la table. En SQLite, le verrou est plus large. Des transactions longues avec UPDATE sur de nombreuses lignes peuvent créer des blocages (deadlocks) à surveiller.

Comment limiter le nombre de lignes mises à jour ?

MySQL supporte nativement UPDATE ... LIMIT n. En PostgreSQL, il faut passer par une CTE ou une sous-requête avec ctid pour cibler un sous-ensemble de lignes. Cette technique est utile pour les mises à jour par lots (batching) qui évitent de surcharger la base en production.


Conclusion

La commande UPDATE est fondamentale, mais elle concentre une grande partie des incidents en base de données. Maîtriser sa syntaxe de base ne suffit pas : il faut comprendre les jointures, les sous-requêtes, les variantes selon les moteurs, et surtout adopter les bons réflexes de sécurité — transaction, test en SELECT, vérification des contraintes. Ces notions sont systématiquement évaluées dans les entretiens data. Pour continuer votre préparation et vous entraîner sur des cas réels, rendez-vous sur SQL Pratique et testez vos requêtes directement dans notre environnement en ligne.

Prêt à vous entraîner ?

50 exercices SQL interactifs avec éditeur en ligne, chronomètre et feedback IA.

Voir les exercices