COUNT(DISTINCT) de MySQL explicado: cómo contar valores únicos de forma eficiente

目次

1. Introducción

Al administrar una base de datos, puedes encontrarte con situaciones como: “¿Cuántos países diferentes se han registrado?” o “¿Cuántas direcciones de correo electrónico únicas existen?”
En esos casos, puedes usar COUNT(DISTINCT column_name) de MySQL para obtener el número de registros eliminando los duplicados.

Este artículo explica los siguientes temas en detalle:

  • Los conceptos básicos de COUNT() y DISTINCT
  • El uso correcto de COUNT(DISTINCT column_name)
  • Cómo contar valores únicos en varias columnas
  • Cómo mejorar el rendimiento de COUNT(DISTINCT)

Incluso los principiantes pueden entender fácilmente esta guía, ya que explicamos todo con ejemplos prácticos y consultas SQL. Asegúrate de leer hasta el final.

2. Conceptos básicos de conteo de datos en MySQL (COUNT)

Al analizar datos en una base de datos, la función más fundamental es COUNT().
Primero comprendamos cómo funciona COUNT().

2.1 Diferencia entre COUNT(*) y COUNT(column_name)

La función COUNT() en MySQL se puede usar de las siguientes dos maneras:

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 Ejemplos básicos de COUNT()

Aquí utilizaremos la siguiente tabla users como ejemplo:

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

① Obtener el número total de registros en la tabla

SELECT COUNT(*) FROM users;

→ Resultado: 4 (Número total de registros)

② Obtener el número de valores no nulos en una columna específica

SELECT COUNT(email) FROM users;

→ Resultado: 3 (Número de valores email no nulos)

💡 Puntos clave:

  • COUNT(*) devuelve el número total de registros incluyendo valores NULL.
  • COUNT(email) excluye los valores NULL al contar.

3. Recuperar datos sin duplicados (DISTINCT)

Al agregar datos, a menudo se desea obtener solo valores únicos.
En esas situaciones, DISTINCT es muy útil.

3.1 Conceptos básicos de DISTINCT

DISTINCT se usa para eliminar datos duplicados de la columna especificada y devolver resultados únicos.

Sintaxis básica

SELECT DISTINCT column_name FROM table_name;

3.2 Ejemplo de uso de DISTINCT

Al ejecutar la siguiente consulta SQL, puedes obtener una lista de nombres de países únicos registrados por los usuarios.

SELECT DISTINCT country FROM users;

→ Resultado:

country
Japan
United States

3.3 Diferencia entre DISTINCT y 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

💡 Puntos clave:

  • DISTINCT simplemente elimina los datos duplicados.
  • GROUP BY agrupa los datos y se usa junto con funciones de agregación.

4. Cómo usar COUNT(DISTINCT column_name)

Al usar COUNT(DISTINCT column_name), puedes obtener el número de valores únicos.

4.1 Conceptos básicos de COUNT(DISTINCT)

Sintaxis básica

SELECT COUNT(DISTINCT column_name) FROM table_name;

4.2 Ejemplo de COUNT(DISTINCT)

SELECT COUNT(DISTINCT country) FROM users;

→ Resultado: 2 (Dos tipos: “Japón” y “Estados Unidos”)

4.3 Usar COUNT(DISTINCT) con condiciones

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

→ Resultado: 2 (Número de valores email únicos registrados en Japón)

💡 Puntos clave:

  • COUNT(DISTINCT column_name) excluye los valores NULL y cuenta solo datos únicos.
  • Al usar una cláusula WHERE, puedes contar los registros que cumplen condiciones específicas.

5. Usar COUNT(DISTINCT) con múltiples columnas

En MySQL, no se puede usar directamente COUNT(DISTINCT column1, column2). En su lugar, una solución común es combinar columnas con CONCAT() y tratarlas como un solo valor.

5.1 Por qué COUNT(DISTINCT column1, column2) no se puede usar

En MySQL, no puedes aplicar directamente COUNT(DISTINCT) a varias columnas de esta forma: COUNT(DISTINCT column1, column2).
Esto se debe a una limitación de MySQL.

5.2 Cómo contar combinaciones únicas en varias columnas

Para contar combinaciones únicas de múltiples columnas, el enfoque típico es combinar las columnas usando CONCAT() y luego aplicar COUNT(DISTINCT) al resultado.

Ejemplo: Contar combinaciones únicas de País y Ciudad

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

💡 Puntos clave:

  • Usar CONCAT(columna1, '-', columna2) permite combinar múltiples columnas en un único valor único.
  • COUNT(DISTINCT CONCAT(...)) permite obtener el número de combinaciones únicas entre varias columnas.

6. Optimización de rendimiento para COUNT(DISTINCT)

COUNT(DISTINCT) puede afectar el rendimiento, por lo que puede ser necesario optimizar.
Al trabajar con conjuntos de datos grandes, se recomienda considerar usar índices o enfoques alternativos.

6.1 Por qué COUNT(DISTINCT) puede ser lento

  • MySQL a menudo escanea todos los registros para aplicar DISTINCT.
  • Si los índices no están configurados correctamente, la ejecución de la consulta se vuelve más lenta.
  • Un gran volumen de datos duplicados incrementa la carga computacional.

6.2 Optimización de índices para acelerar COUNT(DISTINCT)

Al manejar grandes cantidades de datos, puedes mejorar el rendimiento de la consulta añadiendo un índice a la columna objetivo.

Cómo añadir un índice

ALTER TABLE users ADD INDEX (country);

Verificar el plan de ejecución de la consulta usando un índice

EXPLAIN SELECT COUNT(DISTINCT country) FROM users;

💡 Puntos clave:

  • Usar EXPLAIN permite verificar cómo MySQL procesa una consulta.
  • Aplicar un índice puede ayudar a evitar escaneos completos de tabla y mejorar el rendimiento de búsqueda.

6.3 Método alternativo: GROUP BY + COUNT

Dependiendo del requisito de agregación, usar GROUP BY puede ofrecer mejor rendimiento.

Ejemplo: Contar datos únicos usando GROUP BY

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

💡 Puntos clave:

  • GROUP BY puede ofrecer mejor rendimiento comparado con COUNT(DISTINCT) en algunos casos.
  • Es especialmente útil cuando necesitas agrupar y agregar datos simultáneamente.

7. Errores comunes y soluciones para COUNT(DISTINCT)

Al usar COUNT(DISTINCT), puedes encontrarte con varios errores comunes.
A continuación, presentamos los problemas típicos y sus soluciones.

7.1 Error 1: COUNT(DISTINCT column1, column2) no se puede usar

Causa del error

En MySQL, COUNT(DISTINCT column1, column2) no es compatible cuando se apunta a múltiples columnas.
Usar esta sintaxis directamente producirá un error.

Solución: usar CONCAT()

Puedes evitar este error combinando varias columnas y aplicando COUNT(DISTINCT) al resultado.

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

💡 Puntos clave:

  • Usar CONCAT(columna1, '-', columna2) permite crear valores únicos a partir de múltiples columnas.
  • COUNT(DISTINCT CONCAT(...)) permite obtener valores únicos para cada combinación.

7.2 Error 2: Resultados inesperados cuando se incluyen valores NULL

Causa del error

  • COUNT(DISTINCT nombre_columna) ignora los valores NULL, lo que puede generar resultados inesperados si la columna contiene NULLs.

Solución: usar IFNULL()

Puedes reemplazar NULL con otro valor predeterminado (p. ej., '' o 'unknown') para asegurar un conteo correcto.

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

💡 Puntos clave:

  • Al usar IFNULL(nombre_columna, 'valor_predeterminado') puedes manejar los valores NULL de forma adecuada.

7.3 Error 3: COUNT(DISTINCT) es lento

Causa del error

  • COUNT(DISTINCT) escanea todos los datos, lo que puede producir un rendimiento lento con conjuntos de datos grandes.

Solución: usar índices

ALTER TABLE users ADD INDEX (country);

💡 Puntos clave:

  • Añadir índices puede mejorar el rendimiento de la consulta.
  • Usa EXPLAIN para verificar el estado de optimización de la consulta.
    EXPLAIN SELECT COUNT(DISTINCT country) FROM users;
    

Al aplicar estas medidas, puedes mejorar la practicidad de COUNT(DISTINCT) y evitar problemas de rendimiento.

8. Preguntas frecuentes (FAQ)

A continuación, algunas preguntas frecuentes sobre COUNT(DISTINCT).

8.1 ¿Cuál es la diferencia entre COUNT(*) y COUNT(DISTINCT column_name)?

Diferencias clave

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

Ejemplo de uso

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

💡 Puntos clave:

  • COUNT(*) cuenta todos los registros.
  • COUNT(DISTINCT column_name) recupera el número de valores únicos (excluyendo NULL).

8.2 ¿Cuál es la diferencia entre DISTINCT y 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

Ejemplo de uso

-- Using DISTINCT
SELECT DISTINCT country FROM users;

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

💡 Puntos clave:

  • DISTINCT elimina simplemente los datos duplicados.
  • GROUP BY agrupa los datos y puede combinarse con funciones de agregación.

8.3 ¿Es COUNT(DISTINCT) lento?

Problema

  • COUNT(DISTINCT) escanea todos los datos, por lo que el rendimiento puede degradarse con conjuntos de datos grandes.

Solución: usar índices

ALTER TABLE users ADD INDEX (country);

Enfoque alternativo: usar GROUP BY

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

💡 Puntos clave:

  • Aplicar índices puede mejorar el rendimiento de búsqueda.
  • Usar GROUP BY puede producir resultados más rápidos que COUNT(DISTINCT) en algunos casos.

8.4 ¿Cómo puedo usar COUNT(DISTINCT column1, column2)?

Problema

  • En MySQL, COUNT(DISTINCT column1, column2) no es compatible.

Solución: usar CONCAT()

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

💡 Puntos clave:

  • Usar CONCAT(column1, '-', column2) permite crear valores únicos a través de múltiples columnas.
  • COUNT(DISTINCT CONCAT(...)) permite recuperar combinaciones únicas.

Al consultar estas preguntas, puedes usar COUNT(DISTINCT) de manera más eficiente.

9. Conclusión

En este artículo, explicamos en detalle cómo usar la función COUNT(DISTINCT) de MySQL.
Revisemos los puntos clave.

9.1 Lo que aprendiste en este artículo

Cómo contar registros en MySQL

  • COUNT(*) recupera el número total de registros
  • COUNT(column_name) cuenta los valores excluyendo NULL
  • COUNT(DISTINCT column_name) recupera el número de valores únicos

La diferencia entre DISTINCT y COUNT(DISTINCT)

  • DISTINCT recupera los datos con los duplicados eliminados
  • COUNT(DISTINCT column_name) cuenta el número de valores únicos

Cómo usar COUNT(DISTINCT) con múltiples columnas

  • Dado que MySQL no soporta directamente COUNT(DISTINCT column1, column2), usa CONCAT() en su lugar

Técnicas de optimización de rendimiento

  • Aplicar índices para mejorar el rendimiento de búsqueda
  • Usa GROUP BY + COUNT para consultas más rápidas cuando sea apropiado

9.2 Qué puedes hacer con este conocimiento

Al aplicar este conocimiento, puedes realizar los siguientes tipos de agregación de datos:
🔹 Contar usuarios únicos
🔹 Recuperar recuentos de registros basados en condiciones específicas
🔹 Contar datos únicos a través de múltiples columnas
🔹 Optimizar consultas para grandes conjuntos de datos

¡Al realizar agregación y optimización de datos en MySQL, asegúrate de usar esta guía como referencia!