MySQL COUNT(DISTINCT) expliqué : comment compter efficacement les valeurs uniques

目次

1. Introduction

Lorsque vous gérez une base de données, vous pouvez rencontrer des situations telles que : « Combien de pays différents ont été enregistrés ? » ou « Combien d’adresses e‑mail uniques existent‑il ? »
Dans ces cas, vous pouvez utiliser COUNT(DISTINCT column_name) de MySQL pour obtenir le nombre d’enregistrements tout en éliminant les doublons.

Cet article explique en détail les sujets suivants :

  • Les bases de COUNT() et DISTINCT
  • L’utilisation correcte de COUNT(DISTINCT column_name)
  • Comment compter des valeurs uniques sur plusieurs colonnes
  • Comment améliorer les performances de COUNT(DISTINCT)

Même les débutants peuvent facilement comprendre ce guide, car nous expliquons tout avec des exemples pratiques et des requêtes SQL. Assurez‑vous de lire jusqu’à la fin.

2. Bases du comptage de données dans MySQL (COUNT)

Lors de l’analyse de données dans une base, la fonction la plus fondamentale est COUNT().
Commençons par comprendre comment fonctionne COUNT().

2.1 Différence entre COUNT(*) et COUNT(column_name)

La fonction COUNT() de MySQL peut être utilisée de deux manières :

COUNT FunctionDescription
COUNT(*)Counts all records in the table (including NULL values)
COUNT(column_name)Counts non-NULL values in a specific column

2.2 Exemples de base de COUNT()

Ici, nous utiliserons la table users suivante comme exemple :

idnameemailcountry
1Tarotaro@example.comJapan
2Hanakohanako@example.comJapan
3JohnNULLUnited States
4Tanakatanaka@example.comJapan

① Récupérer le nombre total d’enregistrements dans la table

SELECT COUNT(*) FROM users;

→ Résultat : 4 (nombre total d’enregistrements)

② Récupérer le nombre de valeurs non NULL dans une colonne spécifique

SELECT COUNT(email) FROM users;

→ Résultat : 3 (nombre de valeurs email non NULL)

💡 Points clés :

  • COUNT(*) récupère le nombre total d’enregistrements y compris les valeurs NULL.
  • COUNT(email) exclut les valeurs NULL lors du comptage.

3. Récupérer des données sans doublons (DISTINCT)

Lors d’une agrégation de données, il arrive souvent que vous ne souhaitiez récupérer que des valeurs uniques.
Dans ces situations, DISTINCT est très utile.

3.1 Bases de DISTINCT

DISTINCT sert à éliminer les données dupliquées d’une colonne spécifiée et à renvoyer des résultats uniques.

Syntaxe de base

SELECT DISTINCT column_name FROM table_name;

3.2 Exemple d’utilisation de DISTINCT

En exécutant la requête SQL suivante, vous pouvez obtenir la liste des noms de pays uniques enregistrés par les utilisateurs.

SELECT DISTINCT country FROM users;

→ Résultat :

country
Japan
United States

3.3 Différence entre DISTINCT et GROUP BY

FeatureDISTINCTGROUP BY
PurposeRetrieve unique valuesPerform aggregation by group
UsageSELECT DISTINCT column_nameSELECT column_name, COUNT(*) GROUP BY column_name
ExampleRetrieve unique countriesCount users per country

💡 Points clés :

  • DISTINCT supprime simplement les données dupliquées.
  • GROUP BY regroupe les données et est utilisé avec les fonctions d’agrégation.

4. Comment utiliser COUNT(DISTINCT column_name)

En utilisant COUNT(DISTINCT column_name), vous pouvez obtenir le nombre de valeurs uniques.

4.1 Bases de COUNT(DISTINCT)

Syntaxe de base

SELECT COUNT(DISTINCT column_name) FROM table_name;

4.2 Exemple de COUNT(DISTINCT)

SELECT COUNT(DISTINCT country) FROM users;

→ Résultat : 2 (deux types : « Japan » et « United States »)

4.3 Utiliser COUNT(DISTINCT) avec des conditions

SELECT COUNT(DISTINCT email) FROM users WHERE country = 'Japan';

→ Résultat : 2 (nombre d’adresses e‑mail uniques enregistrées au Japon)

💡 Points clés :

  • COUNT(DISTINCT column_name) exclut les valeurs NULL et ne compte que les données uniques.
  • En ajoutant une clause WHERE, vous pouvez compter les enregistrements qui répondent à des conditions spécifiques.

5. Utiliser COUNT(DISTINCT) avec plusieurs colonnes

Dans MySQL, COUNT(DISTINCT column1, column2) ne peut pas être utilisé directement. À la place, une solution courante consiste à combiner les colonnes avec CONCAT() et à les traiter comme une seule valeur.

5.1 Pourquoi COUNT(DISTINCT column1, column2) ne peut pas être utilisé

Dans MySQL, vous ne pouvez pas appliquer directement COUNT(DISTINCT) à plusieurs colonnes de cette façon : COUNT(DISTINCT column1, column2).
C’est une limitation propre à MySQL.

5.2 Comment compter les combinaisons uniques sur plusieurs colonnes

Pour compter les combinaisons uniques de plusieurs colonnes, l’approche typique consiste à combiner les colonnes en utilisant CONCAT() puis appliquer COUNT(DISTINCT) au résultat.

Exemple : Compter les combinaisons uniques de Pays et Ville

SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;

💡 Points clés :

  • Utiliser CONCAT(colonne1, '-', colonne2) vous permet de combiner plusieurs colonnes en une seule valeur unique.
  • COUNT(DISTINCT CONCAT(...)) vous permet de récupérer le nombre de combinaisons uniques sur plusieurs colonnes.

6. Optimisation des performances pour COUNT(DISTINCT)

COUNT(DISTINCT) peut impacter les performances, il peut donc être nécessaire d’optimiser.
Lors du travail avec de grands ensembles de données, il est recommandé d’envisager l’utilisation d’index ou d’approches alternatives.

6.1 Pourquoi COUNT(DISTINCT) peut être lent

  • MySQL parcourt souvent tous les enregistrements pour appliquer DISTINCT.
  • Si les index ne sont pas correctement configurés, l’exécution de la requête devient plus lente.
  • Un volume élevé de données dupliquées augmente la charge de calcul.

6.2 Optimisation des index pour accélérer COUNT(DISTINCT)

Lors du traitement de grandes quantités de données, vous pouvez améliorer les performances des requêtes en ajoutant un index à la colonne cible.

Comment ajouter un index

ALTER TABLE users ADD INDEX (country);

Vérifier le plan d’exécution de la requête en utilisant un index

EXPLAIN SELECT COUNT(DISTINCT country) FROM users;

💡 Points clés :

  • L’utilisation de EXPLAIN vous permet de vérifier comment MySQL traite une requête.
  • L’application d’un index peut aider à éviter les scans complets de table et améliorer les performances de recherche.

6.3 Méthode alternative : GROUP BY + COUNT

Selon les besoins d’agrégation, l’utilisation de GROUP BY peut offrir de meilleures performances.

Exemple : Compter les données uniques avec GROUP BY

SELECT country, COUNT(*) FROM users GROUP BY country;

💡 Points clés :

  • GROUP BY peut offrir de meilleures performances comparées à COUNT(DISTINCT) dans certains cas.
  • Il est particulièrement utile lorsque vous devez regrouper et agréger les données simultanément.

7. Erreurs courantes et solutions pour COUNT(DISTINCT)

Lors de l’utilisation de COUNT(DISTINCT), vous pouvez rencontrer plusieurs erreurs courantes.
Ici, nous présentons les problèmes typiques et leurs solutions.

7.1 Erreur 1 : COUNT(DISTINCT column1, column2) ne peut pas être utilisé

Cause de l’erreur

Dans MySQL, COUNT(DISTINCT column1, column2) n’est pas pris en charge lorsqu’on cible plusieurs colonnes.
Utiliser cette syntaxe directement entraînera une erreur.

Solution : Utiliser CONCAT()

Vous pouvez éviter cette erreur en combinant plusieurs colonnes et en appliquant COUNT(DISTINCT) au résultat.

SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;

💡 Points clés :

  • Utiliser CONCAT(colonne1, '-', colonne2) vous permet de créer des valeurs uniques à partir de plusieurs colonnes.
  • COUNT(DISTINCT CONCAT(...)) vous permet de récupérer les valeurs uniques pour chaque combinaison.

7.2 Erreur 2 : Résultats inattendus lorsque des valeurs NULL sont incluses

Cause de l’erreur

  • COUNT(DISTINCT nom_colonne) ignore les valeurs NULL, ce qui peut entraîner des résultats inattendus si la colonne contient des NULL.

Solution : Utiliser IFNULL()

Vous pouvez remplacer NULL par une autre valeur par défaut (par ex., '' ou 'unknown') pour assurer un comptage correct.

SELECT COUNT(DISTINCT IFNULL(email, 'unknown')) FROM users;

💡 Points clés :

  • En utilisant IFNULL(nom_colonne, 'valeur_par_defaut'), vous pouvez gérer les valeurs NULL de manière appropriée.

7.3 Erreur 3 : COUNT(DISTINCT) est lent

Cause de l’erreur

  • COUNT(DISTINCT) scanne toutes les données, ce qui peut entraîner des performances lentes avec de grands ensembles de données.

Solution : Utiliser des index

ALTER TABLE users ADD INDEX (country);

💡 Points clés :

  • Ajouter des index peut améliorer les performances des requêtes.
  • Utilisez EXPLAIN pour vérifier l’état d’optimisation de la requête.
    EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
    

En appliquant ces mesures, vous pouvez améliorer la praticité de COUNT(DISTINCT) et éviter les problèmes de performance.

8. Questions fréquemment posées (FAQ)

Voici quelques questions fréquemment posées concernant COUNT(DISTINCT).

8.1 Quelle est la différence entre COUNT(*) et COUNT(DISTINCT column_name) ?

Principales différences

FunctionDescription
COUNT(*)Counts all records (including NULL values)
COUNT(DISTINCT column_name)Counts unique values (excluding NULL values)

Exemple d’utilisation

SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT email) FROM users;

💡 Points clés :

  • COUNT(*) compte tous les enregistrements.
  • COUNT(DISTINCT column_name) renvoie le nombre de valeurs uniques (excluant NULL).

8.2 Quelle est la différence entre DISTINCT et GROUP BY ?

FeatureDISTINCTGROUP BY
PurposeRetrieve unique valuesPerform aggregation by group
UsageSELECT DISTINCT column_nameSELECT column_name, COUNT(*) GROUP BY column_name
ExampleRetrieve unique countriesCount users per country

Exemple d’utilisation

-- Using DISTINCT
SELECT DISTINCT country FROM users;

-- Using GROUP BY
SELECT country, COUNT(*) FROM users GROUP BY country;

💡 Points clés :

  • DISTINCT supprime simplement les données dupliquées.
  • GROUP BY regroupe les données et peut être combiné avec des fonctions d’agrégation.

8.3 COUNT(DISTINCT) est‑il lent ?

Problème

  • COUNT(DISTINCT) scanne toutes les données, ainsi les performances peuvent se dégrader avec de grands ensembles de données.

Solution : Utiliser des index

ALTER TABLE users ADD INDEX (country);

Approche alternative : Utiliser GROUP BY

SELECT country, COUNT(*) FROM users GROUP BY country;

💡 Points clés :

  • L’application d’index peut améliorer les performances de recherche.
  • L’utilisation de GROUP BY peut produire des résultats plus rapides que COUNT(DISTINCT) dans certains cas.

8.4 Comment utiliser COUNT(DISTINCT column1, column2) ?

Problème

  • Dans MySQL, COUNT(DISTINCT column1, column2) n’est pas pris en charge.

Solution : Utiliser CONCAT()

SELECT COUNT(DISTINCT CONCAT(country, '-', city)) FROM users;

💡 Points clés :

  • Utiliser CONCAT(column1, '-', column2) vous permet de créer des valeurs uniques sur plusieurs colonnes.
  • COUNT(DISTINCT CONCAT(...)) vous permet de récupérer des combinaisons uniques.

En vous référant à ces questions, vous pouvez utiliser COUNT(DISTINCT) plus efficacement.

9. Conclusion

Dans cet article, nous avons expliqué en détail comment utiliser la fonction COUNT(DISTINCT) de MySQL.
Passons en revue les points clés.

9.1 Ce que vous avez appris dans cet article

Comment compter les enregistrements dans MySQL

  • COUNT(*) récupère le nombre total d’enregistrements
  • COUNT(column_name) compte les valeurs en excluant NULL
  • COUNT(DISTINCT column_name) récupère le nombre de valeurs uniques

La différence entre DISTINCT et COUNT(DISTINCT)

  • DISTINCT récupère les données avec les doublons supprimés
  • COUNT(DISTINCT column_name) compte le nombre de valeurs uniques

Comment utiliser COUNT(DISTINCT) avec plusieurs colonnes

  • Puisque MySQL ne supporte pas directement COUNT(DISTINCT column1, column2), utilisez CONCAT() à la place

Techniques d’optimisation des performances

  • Appliquer des index pour améliorer les performances de recherche
  • Utiliser GROUP BY + COUNT pour des requêtes plus rapides lorsque c’est approprié

9.2 Ce que vous pouvez faire avec ces connaissances

En appliquant ces connaissances, vous pouvez réaliser les types d’agrégation de données suivants :
🔹 Compter les utilisateurs uniques
🔹 Récupérer le nombre d’enregistrements selon des conditions spécifiques
🔹 Compter les données uniques sur plusieurs colonnes
🔹 Optimiser les requêtes pour de grands ensembles de données

Lorsque vous effectuez des agrégations de données et des optimisations dans MySQL, assurez‑vous d’utiliser ce guide comme référence !