SELECT DISTINCT est l'une des clauses SQL les plus utilisées pour éliminer les lignes dupliquées d'un résultat. En entretien technique comme en production, savoir l'utiliser correctement — et surtout savoir quand ne pas l'utiliser — fait toute la différence. Cet article couvre la syntaxe complète, les cas d'usage réels, les pièges de performance, et les alternatives souvent plus efficaces. Que vous soyez data analyst ou développeur, vous repartirez avec une vision claire de la déduplication en SQL.
📌 Ce qu'il faut retenir
DISTINCTs'applique à toutes les colonnes duSELECT, pas seulement la première- Il peut fortement impacter les performances sur de gros volumes de données
GROUP BYest souvent une alternative plus lisible et plus contrôlable- En entretien, on attend que vous connaissiez ses limites, pas seulement sa syntaxe
La syntaxe de base de DISTINCT
La forme la plus simple s'écrit ainsi :
SELECT DISTINCT colonne
FROM ma_table;
Si vous listez plusieurs colonnes, DISTINCT s'applique à la combinaison de toutes ces colonnes, pas à chacune indépendamment :
SELECT DISTINCT pays, ville
FROM clients;
Cette requête renvoie chaque paire (pays, ville) unique. Elle ne renvoie pas les villes uniques par pays. C'est l'erreur la plus fréquente que l'on voit en entretien : confondre "distinct sur une colonne" et "distinct sur plusieurs colonnes".
⚠️ Attention
Il est impossible d'écrire SELECT colonne1, DISTINCT colonne2. DISTINCT se place immédiatement après SELECT et s'applique à toute la liste de colonnes. Toute autre syntaxe génère une erreur.
Pourquoi des doublons apparaissent-ils ?
Avant de supprimer des doublons, comprendre leur origine est essentiel. Les sources les plus courantes sont :
- Jointures mal maîtrisées : un
JOINsur une table avec plusieurs lignes correspondantes multiplie les résultats - Données sources mal nettoyées : imports CSV, pipelines ETL qui insèrent plusieurs fois la même donnée
- Absence de contraintes d'unicité : une table sans
PRIMARY KEYniUNIQUEpeut contenir des lignes identiques - Agrégations partielles : oublier une colonne dans le
GROUP BYpeut produire des pseudo-doublons
Identifier la cause du doublon vous indique si DISTINCT est la bonne solution — ou si le problème se trouve en amont dans le modèle de données. C'est une distinction que les recruteurs apprécient particulièrement lors des tests techniques SQL.
DISTINCT avec COUNT et les agrégats
DISTINCT peut s'utiliser à l'intérieur des fonctions d'agrégat, ce qui est très courant en analyse de données :
SELECT COUNT(DISTINCT client_id) AS clients_uniques
FROM commandes;
Cette requête compte le nombre de clients différents ayant passé au moins une commande, et non le nombre total de lignes. Comparez :
-- Nombre total de commandes
SELECT COUNT(client_id) FROM commandes; -- ex: 15 000
-- Nombre de clients distincts
SELECT COUNT(DISTINCT client_id) FROM commandes; -- ex: 4 200
Ce type de requête est omniprésent dans les dashboards analytiques. On l'utilise pour calculer des métriques comme le nombre d'utilisateurs actifs, le nombre de produits commandés, ou le reach d'une campagne marketing.
Vous pouvez également combiner plusieurs agrégats distincts dans la même requête :
SELECT
COUNT(DISTINCT client_id) AS clients_uniques,
COUNT(DISTINCT produit_id) AS produits_distincts,
SUM(montant) AS chiffre_affaires
FROM commandes
WHERE date_commande >= '2026-01-01';
Pour aller plus loin sur les fonctions d'agrégat, consultez notre guide sur les fonctions d'agrégat SQL : SUM, COUNT, AVG, MIN, MAX.
Impact sur les performances : ce que vous devez savoir
DISTINCT déclenche une opération de tri ou de hachage en interne pour identifier les doublons. Sur de grandes tables, cela peut devenir coûteux. Voici un tableau comparatif des approches de déduplication :
| Méthode | Lisibilité | Performance | Cas d'usage idéal |
|---|---|---|---|
SELECT DISTINCT |
Très simple | Moyenne (tri complet) | Petits volumes, exploration rapide |
GROUP BY |
Lisible | Bonne (optimisable) | Déduplication avec agrégats |
ROW_NUMBER() |
Verbeuse | Excellente (avec index) | Garder une ligne parmi N doublons |
Sous-requête + EXISTS |
Complexe | Variable | Filtres conditionnels avancés |
| CTE + déduplication | Excellente | Bonne | Pipelines de transformation de données |
