Trouver les doublons en SQL peut être une tâche fastidieuse, mais c’est une compétence essentielle pour quiconque travaille avec des bases de données. Les doublons peuvent causer des erreurs, des écarts et des incohérences dans vos données, conduisant à des résultats incorrects et de mauvaises performances. Par conséquent, il est crucial d’identifier et de supprimer les doublons de vos tables pour garantir l’intégrité et l’exactitude des données.
SQL offre plusieurs façons de trouver les doublons dans vos données, selon vos besoins et la structure de vos tables. Vous pouvez utiliser les clauses GROUP BY et HAVING pour regrouper les enregistrements par une colonne particulière et filtrer les doublons en fonction d’un comptage ou d’une condition. Alternativement, vous pouvez utiliser le mot-clé DISTINCT pour sélectionner uniquement les valeurs uniques et les comparer avec la table originale pour identifier les doublons. Il existe également des fonctions et opérateurs spécialisés, tels que COUNT(), EXISTS et JOIN, qui peuvent vous aider à trouver des doublons dans des scénarios plus complexes.
Tout au long de ce guide, vous trouverez des exercices SQL interactifs qui vous permettent de pratiquer la recherche de doublons dans votre navigateur — aucune configuration de base de données requise. Écrivez des requêtes, obtenez un retour instantané et voyez si vos résultats correspondent à la sortie attendue.
Dans cet article, nous explorerons diverses techniques pour trouver des doublons en SQL, des requêtes simples aux méthodes avancées, et fournirons des exemples et des bonnes pratiques pour vous aider à maîtriser cette compétence. Que vous soyez débutant ou développeur SQL expérimenté, ce guide vous aidera à améliorer la qualité et l’efficacité de vos données en détectant et en éliminant les doublons de vos tables. Pour pratiquer ces requêtes, pensez à utiliser un éditeur SQL moderne comme l’éditeur SQL de Beekeeper Studio, qui offre la coloration syntaxique et des fonctionnalités d’autocomplétion.
Trouver les Doublons avec les Clauses GROUP BY et HAVING
Une façon de trouver des valeurs en double en SQL est d’utiliser les clauses GROUP BY et HAVING. Ces clauses vous permettent de regrouper les lignes qui ont les mêmes valeurs dans une ou plusieurs colonnes, puis de filtrer les groupes en fonction de certains critères. Voici comment cela fonctionne :
- Commencez par sélectionner les colonnes que vous voulez vérifier pour les doublons en utilisant l’instruction SELECT.
- Utilisez la clause GROUP BY pour regrouper les lignes par les colonnes sélectionnées.
- Utilisez la fonction COUNT dans la clause HAVING pour filtrer les groupes qui ont plus d’une ligne. Ce sont les groupes qui contiennent des doublons.
Par exemple, supposons que vous ayez une table appelée “customers” avec des colonnes pour “name” et “email”. Vous voulez trouver tous les clients qui se sont inscrits avec la même adresse email. Voici à quoi ressemblerait la requête SQL :
SELECT name, email, COUNT(*)
FROM customers
GROUP BY email
HAVING COUNT(*) > 1;
Cette requête regroupe les clients par leurs adresses email puis compte le nombre de clients dans chaque groupe. La clause HAVING filtre les groupes qui n’ont qu’un seul client, ne laissant que les groupes avec des adresses email en double.
Essayez par vous-même :
[[ testData.title ]]
Interrogez la table users pour trouver toutes les adresses email qui apparaissent plus d’une fois. Retournez l’email et le count du nombre de fois où chaque email en double apparaît.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Il est important de noter que la clause GROUP BY doit inclure toutes les colonnes que vous sélectionnez sauf celles qui utilisent une fonction d’agrégation comme COUNT. Sinon, la requête retournera une erreur.
Une autre chose à garder à l’esprit est que la fonction COUNT compte toutes les lignes dans chaque groupe, pas seulement les uniques. Donc si vous avez plusieurs lignes avec le même nom et la même adresse email, elles seront toutes comptées comme des doublons.
En plus d’utiliser les clauses GROUP BY et HAVING, vous pouvez également utiliser d’autres instructions SQL comme ORDER BY, WHERE et JOIN pour affiner davantage votre recherche de doublons. Vous pouvez également utiliser des contraintes uniques pour empêcher l’insertion de valeurs en double dans une table en premier lieu.
Dans l’ensemble, trouver des doublons en SQL peut être un outil puissant pour nettoyer des données non traitées ou identifier des erreurs humaines potentielles ou des bugs d’application. En utilisant les bons critères de recherche et en présentant les résultats de manière claire et concise, vous pouvez rapidement identifier les lignes ou valeurs en double et prendre des mesures pour les corriger.
Utilisation de la Fonction COUNT
Une façon de trouver des doublons en SQL est d’utiliser la fonction COUNT. La fonction COUNT est une fonction d’agrégation qui compte le nombre de lignes dans une table qui répondent à une certaine condition. En utilisant la fonction COUNT, vous pouvez compter le nombre d’occurrences d’une valeur particulière dans une colonne et identifier les doublons.
Pour utiliser la fonction COUNT pour trouver des doublons, vous devrez regrouper les lignes par la colonne que vous voulez vérifier pour les doublons. La clause GROUP BY est utilisée pour regrouper les lignes en fonction des valeurs dans une colonne spécifique. Par exemple, si vous voulez trouver des doublons dans la colonne “email” d’une table “users”, vous regrouperiez les lignes par la colonne “email”.
Voici un exemple de requête qui utilise la fonction COUNT pour trouver des doublons dans la colonne “email” d’une table “users” :
SELECT email, COUNT(email) as count
FROM users
GROUP BY email
HAVING COUNT(email) > 1;
Dans cette requête, la clause GROUP BY regroupe les lignes par la colonne “email”, et la fonction COUNT compte le nombre d’occurrences de chaque adresse email. La clause HAVING filtre les résultats pour n’afficher que les adresses email qui ont plus d’une occurrence.
Le résultat de cette requête sera une table montrant les adresses email qui ont des doublons et le nombre d’occurrences de chaque adresse email. Vous pouvez utiliser cette information pour identifier et supprimer les lignes en double de la table.
Utiliser la fonction COUNT est une manière simple et efficace de trouver des doublons en SQL. Elle vous permet d’identifier rapidement les valeurs en double dans une colonne et de prendre des mesures pour les supprimer de la table.
Utilisation de la Clause INNER JOIN
L’une des façons les plus courantes de trouver des doublons en SQL est d’utiliser la clause INNER JOIN. Cette clause vous permet de combiner deux ou plusieurs tables basées sur une colonne commune et de retourner uniquement les lignes qui ont des valeurs correspondantes dans les deux tables.
Pour utiliser la clause INNER JOIN pour trouver des doublons, vous devrez identifier les colonnes qui contiennent les données en double. Une fois que vous avez identifié ces colonnes, vous pouvez utiliser la clause INNER JOIN pour joindre la table sur ces colonnes.
Voici un exemple de comment utiliser la clause INNER JOIN pour trouver des doublons dans une table appelée “orders” :
SELECT o1.order_id, o2.order_id
FROM orders o1
INNER JOIN orders o2
ON o1.customer_id = o2.customer_id
AND o1.order_date = o2.order_date
AND o1.order_id <> o2.order_id;
Dans cet exemple, la clause INNER JOIN est utilisée pour joindre la table “orders” à elle-même, en utilisant les colonnes “customer_id” et “order_date” comme critères de jointure. L’opérateur “AND” est utilisé pour spécifier que les trois colonnes doivent correspondre pour qu’une ligne soit retournée. La dernière ligne de la requête, “AND o1.order_id <> o2.order_id”, assure que la requête ne retourne pas de lignes où les deux valeurs “order_id” sont identiques.
Le résultat de cette requête sera une liste de toutes les commandes qui ont le même ID client et la même date de commande, mais des IDs de commande différents. Ce sont les commandes en double qui doivent être examinées plus en détail.
Pratiquez avec les self-joins :
[[ testData.title ]]
Interrogez la table products pour trouver tous les enregistrements de produits en double (même product_name et category). Retournez le product_id, product_name, category et price uniquement pour les doublons (pas la première occurrence).
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Utiliser la clause INNER JOIN de cette manière peut être un outil puissant pour trouver des doublons en SQL. Cependant, il est important d’être prudent lors de l’utilisation de cette méthode, car il peut être facile de retourner accidentellement des faux positifs ou de manquer des doublons qui sont répartis sur plusieurs tables. C’est toujours une bonne idée de vérifier deux fois vos résultats et d’utiliser d’autres méthodes, comme les clauses GROUP BY et HAVING, pour confirmer vos conclusions.
Essayez par vous-même :
[[ testData.title ]]
Interrogez la table customers pour retourner les enregistrements complets des clients (name et email) dont l’email apparaît plus d’une fois. Utilisez une sous-requête pour identifier les emails en double.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Trouver des Paires en Double avec les Self-Joins
Une autre technique puissante pour trouver des doublons est d’utiliser des self-joins pour identifier des paires d’enregistrements qui partagent des caractéristiques communes. Cette approche est particulièrement utile quand vous voulez trouver des paires en double exactes plutôt que simplement identifier que des doublons existent.
Un self-join implique de joindre une table à elle-même en utilisant des alias différents. En joignant sur les colonnes qui définissent les doublons et en s’assurant de ne pas faire correspondre un enregistrement avec lui-même, vous pouvez identifier efficacement les paires en double.
Par exemple, si vous avez une table de transactions et que vous voulez trouver des paires de transactions avec le même ID client et le même montant mais des IDs de transaction différents, vous pouvez utiliser un self-join comme ceci :
SELECT t1.transaction_id as transaction_id1,
t2.transaction_id as transaction_id2,
t1.customer_id,
t1.amount
FROM transactions t1
INNER JOIN transactions t2
ON t1.customer_id = t2.customer_id
AND t1.amount = t2.amount
AND t1.transaction_id < t2.transaction_id;
Les points clés dans cette requête sont :
-
t1ett2sont des alias pour la même table - Les conditions de jointure spécifient ce qui rend les enregistrements “en double” (
customer_idetamount) -
t1.transaction_id < t2.transaction_idassure que nous obtenons chaque paire une seule fois et ne faisons pas correspondre un enregistrement avec lui-même
Essayez par vous-même :
[[ testData.title ]]
Interrogez la table transactions pour trouver les paires de transactions qui ont le même customer_id et amount mais des transaction_id différents. Retournez transaction_id1, transaction_id2, customer_id et amount pour chaque paire en double. Affichez chaque paire une seule fois (évitez d’afficher à la fois A-B et B-A).
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Trouver des Doublons avec les Common Table Expressions (CTE)
L’une des façons de trouver des doublons en SQL est d’utiliser les Common Table Expressions (CTE). Une CTE est un ensemble de résultats temporaire qui est défini dans la portée d’exécution d’une seule instruction SELECT, INSERT, UPDATE, DELETE ou CREATE VIEW.
Pour trouver des doublons en utilisant CTE, on peut utiliser la fonction ROW_NUMBER(), qui attribue un numéro séquentiel unique à chaque ligne dans une partition d’un ensemble de résultats. La clause PARTITION BY spécifie les colonnes utilisées pour définir la partition, et la clause ORDER BY spécifie l’ordre des lignes dans chaque partition.
Voici un exemple d’utilisation de CTE pour trouver des doublons :
WITH CTE AS (
SELECT column1, column2, column3, ROW_NUMBER() OVER(PARTITION BY column1, column2, column3 ORDER BY column1, column2, column3) AS RowNumber
FROM table_name
)
SELECT *
FROM CTE
WHERE RowNumber > 1
Dans cet exemple, la CTE est définie avec les colonnes à vérifier pour les doublons. La fonction ROW_NUMBER() est utilisée pour générer un numéro de séquence pour chaque ligne dans une partition de l’ensemble de résultats, où la partition est définie par les colonnes spécifiées dans la clause PARTITION BY. L’ensemble de résultats est ensuite filtré pour n’afficher que les lignes où le RowNumber est supérieur à 1, indiquant qu’il y a des doublons.
Il est important de noter que la clause ORDER BY dans la fonction ROW_NUMBER() doit correspondre à la clause ORDER BY dans l’instruction SELECT principale, sinon les résultats peuvent ne pas être précis.
Utiliser CTE pour trouver des doublons peut être particulièrement utile dans SQL Server 2017, qui a introduit le support pour le traitement de graphes en utilisant les Common Table Expressions. Cela permet des requêtes plus complexes impliquant des relations entre les données.
Dans l’ensemble, utiliser CTE pour trouver des doublons en SQL peut être un outil puissant pour l’analyse et la gestion des données.
Essayez par vous-même :
[[ testData.title ]]
Interrogez la table products en utilisant une Common Table Expression (CTE) pour trouver les noms de produits en double. La CTE doit regrouper par nom de produit et compter les occurrences, puis sélectionner les produits avec un compte > 1.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Trouver des Doublons avec les Fonctions de Fenêtre
Quand il s’agit de trouver des doublons en SQL, l’une des façons les plus efficaces est d’utiliser les fonctions de fenêtre. Les fonctions de fenêtre sont un outil puissant qui peut être utilisé pour effectuer des calculs sur un ensemble de lignes qui sont liées à la ligne courante.
Pour trouver des doublons en utilisant les fonctions de fenêtre, vous pouvez utiliser la fonction ROW_NUMBER() en combinaison avec une clause PARTITION BY. La fonction ROW_NUMBER() attribue un numéro unique à chaque ligne dans une partition, et la clause PARTITION BY regroupe les lignes en partitions basées sur une colonne spécifique ou un ensemble de colonnes.
Par exemple, supposons que vous ayez une table d’utilisateurs qui inclut des colonnes pour user_id, username et email. Pour trouver tous les utilisateurs qui ont des emails en double, vous pouvez utiliser l’instruction select suivante :
SELECT user_id, username, email
FROM (
SELECT user_id, username, email,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY user_id) AS row_num
FROM users
) AS subquery
WHERE row_num > 1;
Dans cet exemple, la clause PARTITION BY partitionne les lignes par la colonne email, et la fonction ROW_NUMBER() attribue un numéro unique à chaque ligne dans la partition basé sur la colonne user_id. La clause WHERE filtre toutes les lignes sauf celles avec un row_num supérieur à 1, qui sont les lignes avec des emails en double.
Pratiquez avec ROW_NUMBER() :
[[ testData.title ]]
Interrogez la table customers pour retourner les enregistrements complets des clients (name et email) dont l’email apparaît plus d’une fois. Utilisez une sous-requête pour identifier les emails en double.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Il est important de noter que les fonctions de fenêtre peuvent être utilisées en combinaison avec d’autres fonctions SQL, comme les instructions CASE et les fonctions d’agrégation, pour créer des requêtes plus complexes. Par exemple, vous pourriez utiliser une instruction CASE pour regrouper les lignes dans une catégorie spécifique, puis utiliser une fonction de fenêtre pour trouver des doublons dans cette catégorie.
En conclusion, utiliser les fonctions de fenêtre pour trouver des doublons en SQL peut être une méthode puissante et efficace. En utilisant la fonction ROW_NUMBER() en combinaison avec une clause PARTITION BY, vous pouvez facilement regrouper les lignes en partitions et attribuer des numéros uniques à chaque ligne dans la partition. Cela vous permet d’identifier et de supprimer rapidement les lignes en double de vos résultats.
Essayez par vous-même :
[[ testData.title ]]
Interrogez la table products pour trouver tous les enregistrements de produits en double (même product_name et category). Retournez le product_id, product_name, category et price uniquement pour les doublons (pas la première occurrence).
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tables Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Utilisation de la Fonction ROW_NUMBER() avec la Clause PARTITION BY
Lors de la recherche de doublons dans une base de données SQL, un outil utile est la fonction ROW_NUMBER() avec la clause PARTITION BY. Cette fonction attribue un numéro unique à chaque ligne dans un ensemble de résultats, basé sur les critères de partitionnement spécifiés.
La clause PARTITION BY permet à l’utilisateur de regrouper les lignes en partitions basées sur une ou plusieurs colonnes. Cela signifie que la fonction ROW_NUMBER() attribuera un numéro unique à chaque ligne dans chaque partition, plutôt que sur l’ensemble du jeu de résultats.
Par exemple, considérons une table de commandes clients avec des colonnes pour l’ID de commande, l’ID client et la date de commande. Pour trouver des commandes en double pour chaque client, on pourrait utiliser la requête suivante :
SELECT order_id, customer_id, order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id, order_date
ORDER BY order_id) AS row_num
FROM orders
Dans cette requête, la fonction ROW_NUMBER() est utilisée avec la clause PARTITION BY pour regrouper les commandes par client et date de commande. La fonction attribue ensuite un numéro unique à chaque ligne dans chaque partition, basé sur l’ID de commande.
La table résultante aura une colonne additionnelle appelée “row_num” qui contient les numéros de ligne attribués. Les doublons peuvent alors être identifiés en sélectionnant les lignes avec row_num supérieur à 1.
Utiliser la fonction ROW_NUMBER() avec la clause PARTITION BY peut être un outil puissant pour trouver des doublons dans les bases de données SQL. En regroupant les lignes en partitions basées sur des critères spécifiques, la fonction peut attribuer des numéros uniques à chaque ligne dans chaque partition, rendant plus facile l’identification des doublons.
Utilisation de l’Instruction CASE avec la Fonction ROW_NUMBER()
En SQL, la fonction ROW_NUMBER() est utilisée pour attribuer un numéro séquentiel unique à chaque ligne dans un ensemble de résultats. Cette fonction peut être utilisée conjointement avec l’instruction CASE pour identifier les enregistrements en double dans une table.
L’instruction CASE permet d’appliquer une logique conditionnelle à chaque ligne dans un ensemble de résultats. En utilisant la fonction ROW_NUMBER() dans l’instruction CASE, le nombre d’occurrences de chaque enregistrement peut être déterminé.
Par exemple, la requête SQL suivante peut être utilisée pour trouver des enregistrements en double dans une table “users” basée sur les colonnes “first_name” et “last_name” :
SELECT *,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY first_name, last_name ORDER BY id) > 1
THEN 'Doublon'
ELSE 'Unique'
END AS duplicate_status
FROM users;
La requête ci-dessus partitionne l’ensemble de résultats par les colonnes “first_name” et “last_name” et ordonne les lignes par la colonne “id”. La fonction ROW_NUMBER() attribue un numéro séquentiel unique à chaque ligne dans chaque partition.
L’instruction CASE vérifie ensuite si la valeur ROW_NUMBER() est supérieure à 1. Si oui, alors la ligne est identifiée comme un doublon. Sinon, la ligne est identifiée comme unique.
L’ensemble de résultats inclura une colonne additionnelle appelée “duplicate_status” qui affiche soit “Doublon” soit “Unique” pour chaque ligne.
| id | first_name | last_name | duplicate_status | |
|---|---|---|---|---|
| 1 | John | Smith | john@example.com | Unique |
| 2 | Jane | Doe | jane@example.com | Unique |
| 3 | John | Smith | john.smith@example.com | Doublon |
| 4 | Bob | Johnson | bob@example.com | Unique |
| 5 | Jane | Doe | jane.doe@example.com | Doublon |
Dans l’exemple ci-dessus, les lignes 1, 2 et 4 sont identifiées comme uniques, tandis que les lignes 3 et 5 sont identifiées comme des doublons basés sur les colonnes “first_name” et “last_name”.
En utilisant la fonction ROW_NUMBER() dans l’instruction CASE, les enregistrements en double peuvent être facilement identifiés et gérés dans une table SQL.
Beekeeper Studio Est Une Interface de Base de Données Gratuite et Open Source
Le meilleur outil de requêtes SQL et éditeur que j'ai jamais utilisé. Il fournit tout ce dont j'ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge de nombreuses bases de données et fonctionne très bien sur Windows, Mac et Linux.
Ce Que Les Utilisateurs Disent De Beekeeper Studio
"Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C'est rapide, intuitif et rend le travail avec les bases de données agréable à nouveau."
"J'ai essayé de nombreuses interfaces de bases de données, mais Beekeeper trouve l'équilibre parfait entre fonctionnalités et simplicité. Ça marche tout simplement."