La suppression de données avec JOIN en SQL permet d'effacer des enregistrements basés sur des conditions impliquant plusieurs tables. Cette technique avancée nécessite une syntaxe spécifique qui varie selon le système de gestion de base de données utilisé.
Contrairement à un simple DELETE, cette approche vous permet de supprimer des lignes d'une table en fonction de critères présents dans d'autres tables reliées. Cette fonctionnalité s'avère particulièrement utile pour maintenir la cohérence des données et effectuer des suppressions conditionnelles complexes.
La maîtrise de cette technique devient essentielle lors d'entretiens techniques, notamment pour des postes de data analyst ou développeur SQL. Les recruteurs apprécient les candidats capables de manipuler efficacement les données across multiples tables.
📌 Ce qu'il faut retenir
- La syntaxe DELETE avec JOIN varie selon le SGBD (MySQL, PostgreSQL, SQL Server)
- MySQL permet de supprimer dans plusieurs tables simultanément
- PostgreSQL et SQL Server utilisent des approches différentes avec sous-requêtes
- Les contraintes CASCADE automatisent certaines suppressions
Syntaxe de base selon les SGBD
MySQL : syntaxe directe
MySQL offre la syntaxe la plus intuitive pour combiner DELETE et JOIN. Vous pouvez spécifier directement la table à modifier après le mot-clé DELETE.
DELETE table1 FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
WHERE condition;
Cette approche permet même de supprimer des données dans plusieurs tables simultanément en listant les tables après DELETE.
DELETE table1, table2 FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
WHERE table1.status = 'inactive';
PostgreSQL : utilisation de USING
PostgreSQL adopte une approche différente avec la clause USING, plus proche de la syntaxe UPDATE standard.
DELETE FROM table1
USING table2
WHERE table1.id = table2.table1_id
AND condition;
SQL Server : sous-requêtes ou CTE
SQL Server ne supporte pas directement DELETE avec JOIN. Vous devez utiliser des sous-requêtes ou des CTE SQL pour accomplir la même tâche.
DELETE FROM table1
WHERE id IN (
SELECT table1.id
FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
WHERE condition
);
Types de JOIN avec DELETE
DELETE avec INNER JOIN
L'INNER JOIN avec DELETE supprime uniquement les enregistrements ayant une correspondance dans les deux tables. Cette approche garantit que seules les lignes avec des relations existantes sont affectées.
-- MySQL
DELETE commandes FROM commandes
INNER JOIN clients ON commandes.client_id = clients.id
WHERE clients.statut = 'suspendu';
-- PostgreSQL
DELETE FROM commandes
USING clients
WHERE commandes.client_id = clients.id
AND clients.statut = 'suspendu';
DELETE avec LEFT JOIN
Le LEFT JOIN identifie les enregistrements orphelins - ceux sans correspondance dans la table de droite. Cette technique nettoie efficacement les données incohérentes.
-- Supprimer les commandes sans client valide
DELETE commandes FROM commandes
LEFT JOIN clients ON commandes.client_id = clients.id
WHERE clients.id IS NULL;
⚠️ Attention
Testez toujours vos requêtes DELETE avec un SELECT équivalent avant l'exécution. Une erreur peut supprimer définitivement des données critiques.
Exemples pratiques courants
Nettoyage des données expirées
Supposons une application avec des sessions utilisateur temporaires. Vous devez supprimer les sessions expirées liées à des comptes inactifs.
-- MySQL
DELETE sessions FROM sessions
INNER JOIN utilisateurs ON sessions.user_id = utilisateurs.id
WHERE sessions.expire_at < NOW()
AND utilisateurs.derniere_connexion < DATE_SUB(NOW(), INTERVAL 90 DAY);
Suppression en cascade manuelle
Quand les contraintes CASCADE ne suffisent pas, vous pouvez implémenter une logique de suppression personnalisée.
-- Supprimer les commentaires des articles supprimés
DELETE commentaires FROM commentaires
INNER JOIN articles ON commentaires.article_id = articles.id
WHERE articles.statut = 'supprime'
AND articles.date_suppression < CURDATE() - INTERVAL 30 DAY;
Maintenance des tables de liaison
Les tables many-to-many accumulent souvent des relations obsolètes nécessitant un nettoyage périodique.
-- Nettoyer les relations utilisateur-rôle invalides
DELETE user_roles FROM user_roles
LEFT JOIN utilisateurs ON user_roles.user_id = utilisateurs.id
LEFT JOIN roles ON user_roles.role_id = roles.id
WHERE utilisateurs.id IS NULL OR roles.id IS NULL;
Comparaison des syntaxes par SGBD
| SGBD | Syntaxe | Multi-tables | Complexité |
|---|---|---|---|
| MySQL | DELETE table FROM table JOIN | Oui | Simple |
| PostgreSQL | DELETE FROM table USING | Non | Moyenne |
| SQL Server | DELETE FROM table WHERE IN | Non | Complexe |
| Oracle | DELETE FROM table WHERE EXISTS | Non | Complexe |
