SQL · Data Engineering

Nettoyage de grands jeux de données avec des requêtes SQL : guide pratique

Suppression des doublons, traitement des valeurs manquantes, normalisation, gestion des outliers et formatage des dates : maîtrisez toutes les techniques SQL pour nettoyer vos données efficacement.

Niveau : intermédiaire | Temps de lecture : 12 min | Mis à jour : avril 2026

Pourquoi utiliser SQL pour le nettoyage des données ?

Le nettoyage de données est une étape essentielle dans tout processus d'analyse ou de gestion de données. En particulier, lorsque vous travaillez avec de grands ensembles de données, cette tâche devient encore plus cruciale et complexe. Les données peuvent être erronées, incomplètes ou dupliquées, et ces imperfections peuvent biaiser les résultats ou rendre les analyses inefficaces.

Définition

SQL (Structured Query Language) est un langage puissant pour manipuler et nettoyer les données directement dans les bases de données relationnelles. Il permet d'interagir directement avec la base sans déplacer les données.

+73%
de temps gagné par rapport aux nettoyages hors base
Étude DBTA, 2025
10x
plus rapide que Python sur les très gros volumes
Benchmark, 2026

Avantages de l'utilisation de SQL

  • Vitesse : SQL est optimisé pour travailler avec des ensembles de données volumineux.
  • Flexibilité : Large éventail d'opérations de nettoyage (doublons, valeurs manquantes, transformations).
  • Interfaçage direct : Travaillez directement dans la base sans déplacer les données.
  • Reproductibilité : Les scripts SQL peuvent être versionnés et réexécutés.

Schéma du processus de nettoyage de données avec SQL

Workflow du nettoyage SQL

1. Suppression des doublons (5 méthodes)

Dans les grands jeux de données, il n'est pas rare de trouver des enregistrements dupliqués (erreurs d'importation, mauvaise gestion des données). Voici 5 méthodes pour les identifier et les supprimer selon votre SGBD.

⚠️ Attention avant suppression :

Toujours faire un SELECT pour identifier les doublons avant de les supprimer. Une sauvegarde est recommandée.

Méthode 1 : DISTINCT (création d'une nouvelle table)

Approche indirecte (tous SGBD)
CREATE TABLE temp_table AS
SELECT DISTINCT column1, column2, column3, ...
FROM table_name;

DROP TABLE table_name;

ALTER TABLE temp_table RENAME TO table_name;

Méthode 2 : Sous-requête avec MIN (tous SGBD)

Suppression par ID minimum
DELETE FROM table_name 
WHERE id NOT IN (
    SELECT MIN(id) 
    FROM table_name 
    GROUP BY column1, column2, column3
);

Méthode 3 : ROW_NUMBER (PostgreSQL, SQL Server, Oracle)

Fonction analytique
DELETE FROM table_name 
WHERE id NOT IN (
    SELECT id 
    FROM (
        SELECT id, 
               ROW_NUMBER() OVER (
                   PARTITION BY column1, column2, column3 
                   ORDER BY id
               ) AS row_num
        FROM table_name
    ) AS temp 
    WHERE row_num = 1
);

Méthode 4 : DELETE JOIN (MySQL)

MySQL
DELETE t1 FROM table_name t1
INNER JOIN table_name t2 
WHERE 
    t1.id > t2.id
    AND t1.column1 = t2.column1
    AND t1.column2 = t2.column2
    AND t1.column3 = t2.column3;

Méthode 5 : Sous-requête pour Oracle

Oracle
DELETE FROM table_name
WHERE id IN (
    SELECT id FROM (
        SELECT id, 
               ROW_NUMBER() OVER (
                   PARTITION BY column1, column2, column3 
                   ORDER BY id
               ) AS row_num
        FROM table_name
    ) WHERE row_num > 1
);
Bonnes pratiques doublons :
  • Toujours identifier les colonnes qui définissent un "duplicata".
  • Conserver la première occurrence (MIN(id)) ou la plus récente (MAX(id)).
  • Tester sur une copie avant de supprimer en production.

2. Traitement des valeurs manquantes (NULL)

Les valeurs NULL peuvent être problématiques pour les calculs statistiques ou les analyses. Voici comment les traiter.

Remplacer les NULL par une valeur par défaut

UPDATE avec valeur par défaut
UPDATE table_name 
SET column_name = 'default_value' 
WHERE column_name IS NULL;

Remplacer les NULL dans une colonne numérique

Imputation par 0 ou moyenne
-- Par 0
UPDATE table_name SET age = 0 WHERE age IS NULL;

-- Par la moyenne (sous-requête)
UPDATE table_name 
SET salary = (SELECT AVG(salary) FROM table_name WHERE salary IS NOT NULL)
WHERE salary IS NULL;

Supprimer les lignes avec des NULL (si acceptable)

DELETE conditionnel
DELETE FROM table_name 
WHERE column_name IS NULL;

-- Suppression si plusieurs colonnes NULL
DELETE FROM table_name 
WHERE column1 IS NULL OR column2 IS NULL;
Alternative : COALESCE et ISNULL

Pour les requêtes sans modification de la base :
SELECT COALESCE(column_name, 'valeur_par_defaut') FROM table_name;
SELECT ISNULL(column_name, 'valeur_par_defaut') FROM table_name; (SQL Server)

3. Normalisation des données

Les données peuvent être enregistrées sous différentes formes (ex: "Paris", "PARIS", "paris"). La normalisation assure la cohérence.

Conversion en majuscules / minuscules

UPPER / LOWER
-- Mettre en majuscules
UPDATE table_name SET city = UPPER(city);

-- Mettre en minuscules
UPDATE table_name SET city = LOWER(city);

-- Capitaliser première lettre (SQL Server)
UPDATE table_name SET city = UPPER(LEFT(city,1)) + LOWER(SUBSTRING(city,2));

Nettoyage des espaces superflus

TRIM, LTRIM, RTRIM
-- Supprimer espaces début et fin
UPDATE table_name SET column_name = TRIM(column_name);

-- Supprimer espaces multiples internes (plus complexe)
-- SQL Server
UPDATE table_name SET column_name = REPLACE(REPLACE(column_name, '  ', ' '), '  ', ' ');

Extraction / transformation spécifique

Exemple : standardisation des numéros de téléphone
-- Garder uniquement les chiffres (SQL Server)
UPDATE table_name 
SET phone = REPLACE(REPLACE(REPLACE(phone, '-', ''), ' ', ''), '.', '');

4. Identification et correction des valeurs incohérentes

Les grands jeux de données peuvent contenir des valeurs impossibles (âges négatifs, dates futures).

Détection des incohérences

SELECT conditionnel
-- Âges négatifs
SELECT * FROM table_name WHERE age < 0;

-- Dates dans le futur
SELECT * FROM table_name WHERE date_naissance > CURRENT_DATE;

-- Codes postaux invalides (ex: France, 5 chiffres)
SELECT * FROM table_name WHERE postal_code NOT REGEXP '^[0-9]{5}$';  -- MySQL

Correction des incohérences

UPDATE avec correction
-- Mettre les âges négatifs à NULL
UPDATE table_name SET age = NULL WHERE age < 0;

-- Remplacer les dates futures par la date d'aujourd'hui
UPDATE table_name 
SET date_naissance = CURRENT_DATE 
WHERE date_naissance > CURRENT_DATE;

-- Corriger les codes postaux trop longs
UPDATE table_name 
SET postal_code = LEFT(postal_code, 5) 
WHERE LENGTH(postal_code) > 5;

5. Agrégation et résumé des données

Regrouper et agréger les données permet d'obtenir des résumés pertinents et d'identifier des anomalies.

GROUP BY avec fonctions d'agrégation
-- Montant total des transactions par client
SELECT customer_id, SUM(amount) as total_amount 
FROM transactions 
GROUP BY customer_id;

-- Nombre de commandes par produit avec vente moyenne
SELECT product_id, 
       COUNT(*) as nb_commandes, 
       AVG(price) as prix_moyen,
       SUM(quantity) as quantite_totale
FROM orders 
GROUP BY product_id;

-- Détection des anomalies : doublons potentiels
SELECT column1, column2, COUNT(*) as nb
FROM table_name
GROUP BY column1, column2
HAVING COUNT(*) > 1;

6. Gestion des outliers (valeurs aberrantes)

Les valeurs aberrantes peuvent fausser les résultats des analyses. Voici comment les identifier et les traiter.

Détection des outliers

Identification par seuil
-- Transactions très élevées (seuil fixe)
SELECT * FROM transactions WHERE amount > 100000;

-- Méthode de l'écart-type (approximative)
WITH stats AS (
    SELECT AVG(amount) as mean, STDEV(amount) as std
    FROM transactions
)
SELECT * FROM transactions, stats
WHERE amount > mean + 3*std OR amount < mean - 3*std;

Traitement des outliers

Suppression ou plafonnement
-- Suppression des outliers
DELETE FROM transactions 
WHERE amount > 100000;

-- Plafonnement (winsorisation)
UPDATE transactions 
SET amount = 100000 
WHERE amount > 100000;
Attention : Ne supprimez pas les outliers sans réflexion. Parfois, ils sont les points les plus intéressants (fraudes, performances exceptionnelles).

7. Formatage des dates

Les dates posent souvent problème en raison de formats incohérents. SQL permet de les formater et convertir.

Formater les dates (selon SGBD)
-- PostgreSQL / Oracle
SELECT TO_CHAR(date_column, 'YYYY-MM-DD') FROM table_name;
SELECT TO_CHAR(date_column, 'DD/MM/YYYY') FROM table_name;

-- MySQL
SELECT DATE_FORMAT(date_column, '%Y-%m-%d') FROM table_name;

-- SQL Server
SELECT FORMAT(date_column, 'yyyy-MM-dd') FROM table_name;
SELECT CONVERT(VARCHAR, date_column, 23) FROM table_name;

-- Conversion de chaîne en date
UPDATE table_name 
SET date_column = CAST(string_column AS DATE)
WHERE string_column IS NOT NULL;

8. Suppression des données inutiles

Certaines colonnes ou lignes peuvent être jugées non pertinentes pour l'analyse.

Suppression de colonnes
ALTER TABLE table_name DROP COLUMN column_to_drop;

-- Suppression de plusieurs colonnes (MySQL)
ALTER TABLE table_name 
DROP COLUMN col1, 
DROP COLUMN col2;
Suppression conditionnelle de lignes
-- Supprimer les données antérieures à une date
DELETE FROM logs WHERE date < '2020-01-01';

-- Supprimer les données inactives depuis longtemps
DELETE FROM users WHERE last_login < DATE_SUB(CURRENT_DATE, INTERVAL 2 YEAR);

9. Création de vues propres

Après nettoyage, les vues SQL facilitent l'accès aux données propres sans dupliquer les données.

Création d'une vue de données nettoyées
CREATE VIEW clean_data AS 
SELECT column1, column2, column3 
FROM table_name 
WHERE column1 IS NOT NULL 
  AND column2 > 0
  AND column3 != '';

-- Vue avec données transformées
CREATE VIEW normalized_sales AS
SELECT 
    customer_id,
    UPPER(city) as city_normalized,
    COALESCE(amount, 0) as amount_clean,
    DATE_FORMAT(sale_date, '%Y-%m') as sale_month
FROM sales_raw
WHERE amount IS NOT NULL;
Avantage des vues :

Les vues ne stockent pas de données, elles sont une "fenêtre" sur les données nettoyées. Elles se mettent à jour automatiquement quand les données sources sont nettoyées.

Bonnes pratiques pour le nettoyage SQL

1. Toujours sauvegarder avant de supprimer

Avant tout DELETE ou UPDATE destructeur, faites une copie de la table ou utilisez une transaction (BEGIN; ... ROLLBACK;).

2. Tester sur un échantillon

Utilisez LIMIT ou WHERE pour tester vos requêtes sur un petit sous-ensemble avant de lancer sur toute la table.

3. Documenter vos transformations

Gardez une trace des règles de nettoyage (comment vous avez traité les NULL, les doublons, etc.).

4. Utiliser des transactions

Pour les opérations critiques : BEGIN TRANSACTION; ... COMMIT;. Si erreur, ROLLBACK annule tout.

5. Préférer les vues aux modifications directes

Si possible, créez des vues pour le nettoyage plutôt que de modifier les données brutes. Cela préserve la traçabilité.

Checklist avant nettoyage :
  • ✅ Avez-vous une sauvegarde ?
  • ✅ Avez-vous testé sur un échantillon ?
  • ✅ Avez-vous identifié toutes les colonnes à nettoyer ?
  • ✅ Avez-vous défini les règles de transformation ?
  • ✅ Avez-vous prévu une validation post-nettoyage ?

FAQ — Nettoyage de données SQL

Quelle est la différence entre DELETE et TRUNCATE pour le nettoyage ?

DELETE supprime des lignes une par une (plus lent, peut être annulé avec ROLLBACK). TRUNCATE supprime toutes les lignes en une fois (très rapide, ne peut pas être annulé sans sauvegarde). Pour le nettoyage ciblé, utilisez DELETE. Pour vider entièrement une table, TRUNCATE.

Comment nettoyer les données sans modifier la table originale ?

Utilisez des vues (CREATE VIEW clean_view AS SELECT ...) ou des tables temporaires (CREATE TEMP TABLE clean_data AS SELECT ...). Cela permet de garder les données brutes intactes tout en travaillant sur une version nettoyée.

Comment détecter les doublons sans les supprimer ?

Utilisez GROUP BY avec HAVING COUNT(*) > 1 : SELECT column1, column2, COUNT(*) FROM table GROUP BY column1, column2 HAVING COUNT(*) > 1; Cela liste tous les groupes dupliqués sans les supprimer.

Quelle est la meilleure méthode pour traiter les valeurs NULL ?

Cela dépend du contexte : Suppression si peu de lignes et NULL sans signification. Imputation (remplacement par moyenne/médiane/mode) si les données sont importantes. Conservation avec COALESCE dans les requêtes si l'origine du NULL est informative.

Comment nettoyer des millions de lignes sans bloquer la base ?

Utilisez des suppressions par lots (batches) : DELETE FROM table WHERE condition LIMIT 1000; en boucle. Pour PostgreSQL, utilisez DELETE FROM table WHERE id IN (SELECT id FROM table WHERE condition LIMIT 1000);. Cela évite les locks trop longs.

SQL peut-il remplacer Python/R pour le nettoyage de données ?

SQL est très efficace pour les opérations standard (doublons, NULL, agrégations). Mais pour des transformations complexes (expressions régulières avancées, ML pour imputation, transformations non linéaires), Python/R restent plus flexibles. L'idéal est de combiner les deux : SQL pour le gros du nettoyage, Python pour les cas complexes.

Faites parler vos données
Apprenez les méthodes et les outils pour extraire de la valeur stratégique : Data Science : Le guide complet des méthodes et outils.

Conclusion

Le nettoyage de grands jeux de données est une tâche incontournable pour garantir la qualité et la précision des analyses. Les requêtes SQL offrent un ensemble d'outils puissants et flexibles pour exécuter cette tâche de manière efficace, même sur des ensembles de données volumineux.

À retenir

  • SQL est optimisé pour le nettoyage sur grands volumes.
  • 5 méthodes pour supprimer les doublons selon votre SGBD.
  • NULL peut être remplacé, supprimé ou conservé via COALESCE.
  • La normalisation (UPPER/LOWER/TRIM) assure la cohérence.
  • Les vues SQL permettent un accès propre sans dupliquer les données.
  • Toujours sauvegarder et tester avant de modifier en production.
Pour aller plus loin : Découvrez notre guide complet sur la suppression en cascade pour gérer les relations entre tables lors du nettoyage.
 

Recevez la veille IA & Data qui compte vraiment

 

    Analyses claires, outils concrets et tendances IA sans bruit.     Rejoignez les lecteurs de IANA Data.