DELETE – Supprimer des lignes
Bonne lecture et bon apprentissage !
Junior TSAFACK – 08/08/2026
⏱️ Temps de lecture estimé : 5 minutes
La commande DELETE en SQL permet de supprimer des lignes dans une table. En utilisant cette commande associée à WHERE, il est possible de sélectionner les lignes concernées qui seront supprimées.
Attention : Avant d’essayer de supprimer des lignes, il est recommandé d’effectuer une sauvegarde de la base de données, ou tout du moins de la table concernée par la suppression. Ainsi, s’il y a une mauvaise manipulation, il est toujours possible de restaurer les données.
Syntaxe
Section titled “Syntaxe”La syntaxe pour supprimer des lignes est la suivante :
DELETE FROM tableWHERE condition;Attention : S’il n’y a pas de condition
WHERE, alors toutes les lignes seront supprimées et la table sera alors vide. Cette opération est généralement irréversible (sauf si vous utilisez des transactions).
Exemple concret
Section titled “Exemple concret”Imaginons une table « utilisateur » qui contient des informations sur les utilisateurs d’une application.
Table « utilisateur » :
| id | nom | prenom | date_inscription |
|---|---|---|---|
| 1 | Bazin | Daniel | 2012-02-13 |
| 2 | Favre | Constantin | 2012-04-03 |
| 3 | Clerc | Guillaume | 2012-04-12 |
| 4 | Ricard | Rosemonde | 2012-06-24 |
| 5 | Martin | Natalie | 2012-07-02 |
Si l’on souhaite supprimer les utilisateurs qui se sont inscrits avant le 10 avril 2012, il faut effectuer la requête suivante :
DELETE FROM utilisateurWHERE date_inscription < '2012-04-10';La requête permettra alors de supprimer les utilisateurs Daniel (id 1) et Constantin (id 2). La table contiendra alors les données suivantes :
Résultat :
| id | nom | prenom | date_inscription |
|---|---|---|---|
| 3 | Clerc | Guillaume | 2012-04-12 |
| 4 | Ricard | Rosemonde | 2012-06-24 |
| 5 | Martin | Natalie | 2012-07-02 |
Exemples supplémentaires
Section titled “Exemples supplémentaires”Supprimer un enregistrement spécifique
Section titled “Supprimer un enregistrement spécifique”DELETE FROM utilisateurWHERE id = 3;Supprimer avec plusieurs conditions (AND / OR)
Section titled “Supprimer avec plusieurs conditions (AND / OR)”DELETE FROM utilisateurWHERE date_inscription < '2012-01-01' OR date_inscription > '2012-12-31';Supprimer avec une sous-requête
Section titled “Supprimer avec une sous-requête”Supprimer les utilisateurs qui n’ont effectué aucune commande :
DELETE FROM utilisateurWHERE id NOT IN ( SELECT DISTINCT utilisateur_id FROM commande);Remarque : Certains SGBD (comme MySQL) n’autorisent pas la suppression dans la même table que celle utilisée dans une sous-requête. Dans ce cas, on peut contourner en utilisant une table temporaire ou une syntaxe alternative.
Supprimer avec JOIN (MySQL, PostgreSQL)
Section titled “Supprimer avec JOIN (MySQL, PostgreSQL)”MySQL :
DELETE uFROM utilisateur uLEFT JOIN commande c ON u.id = c.utilisateur_idWHERE c.utilisateur_id IS NULL;PostgreSQL :
DELETE FROM utilisateurUSING commandeWHERE utilisateur.id = commande.utilisateur_idAND commande.date_achat < '2020-01-01';DELETE vs TRUNCATE
Section titled “DELETE vs TRUNCATE”| Critère | DELETE | TRUNCATE |
|---|---|---|
| Vitesse | Plus lent (suppression ligne par ligne) | Plus rapide (supprime le tableau de données) |
| Condition | Peut utiliser WHERE |
Supprime toutes les lignes sans condition |
| Transaction | Peut être annulé (ROLLBACK) | Peut être annulé (dans la plupart des SGBD) |
| Déclencheurs | Déclenche les triggers DELETE |
Ne déclenche pas les triggers |
| Compteur AUTO_INCREMENT | Ne le réinitialise pas | Le réinitialise généralement |
| Verrouillage | Verrouille les lignes une par une | Verrouille la table entière |
Bonnes pratiques
Section titled “Bonnes pratiques”1. Toujours utiliser WHERE (sauf cas exceptionnel)
Section titled “1. Toujours utiliser WHERE (sauf cas exceptionnel)”-- ❌ Dangereux : supprime TOUTES les lignesDELETE FROM utilisateur;
-- ✅ Sécurisé : ne supprime qu'un utilisateur spécifiqueDELETE FROM utilisateur WHERE id = 42;2. Tester avec SELECT avant DELETE
Section titled “2. Tester avec SELECT avant DELETE”Avant d’exécuter une requête DELETE, il est prudent de tester la condition avec un SELECT :
-- Vérifier quelles lignes vont être suppriméesSELECT * FROM utilisateur WHERE date_inscription < '2012-04-10';
-- Puis exécuter la suppressionDELETE FROM utilisateur WHERE date_inscription < '2012-04-10';3. Utiliser les transactions
Section titled “3. Utiliser les transactions”Pour les opérations critiques, utilisez les transactions pour pouvoir annuler en cas d’erreur :
START TRANSACTION;
DELETE FROM utilisateur WHERE date_inscription < '2012-04-10';
-- Vérifier le résultatSELECT * FROM utilisateur;
-- Valider si tout est correctCOMMIT;
-- Ou annuler si problème-- ROLLBACK;4. Faire une sauvegarde
Section titled “4. Faire une sauvegarde”Avant une suppression massive, il est recommandé de faire une sauvegarde :
-- Créer une copie de la tableCREATE TABLE utilisateur_backup AS SELECT * FROM utilisateur;
-- Ou exporter les données avant la suppression5. Utiliser RETURNING (PostgreSQL) pour voir les suppressions
Section titled “5. Utiliser RETURNING (PostgreSQL) pour voir les suppressions”DELETE FROM utilisateurWHERE date_inscription < '2012-04-10'RETURNING *;Erreurs courantes
Section titled “Erreurs courantes”| Erreur | Cause | Solution |
|---|---|---|
Oubli de WHERE |
Toutes les lignes sont supprimées | Toujours spécifier WHERE sauf exception |
| Violation de contrainte de clé étrangère | La ligne est référencée dans une autre table | Supprimer d’abord les références ou utiliser ON DELETE CASCADE |
| Erreur de syntaxe | Oubli de FROM ou WHERE |
Vérifier la syntaxe de la requête |
Prochain chapitre
Section titled “Prochain chapitre”Vous savez désormais comment supprimer des lignes avec DELETE. Mais que faire si vous souhaitez vider complètement une table tout en conservant sa structure ?
👉 Chapitre 24 : MERGE (UPSERT) – INSERT ou UPDATE (Standard SQL)
Bonne continuation !
Junior TSAFACK – 08/08/2026