COUNT(*) VS COUNT(COLUMNA) EN MYSQL

Una de las confusiones mas comunes, en MySQL, al trabajar con agregaciones es la diferencia entre "COUNT(*)" y "COUNT(columna)". Aunque ambos cuentan filas, el comportamiento frente a valores "NULL" es completamente distinto y puede cambiar el resultado de tus consultas de forma significativa.

¿Qué hace cada uno?

Función Comportamiento ¿Cuenta los NULL?
"COUNT(*)" Cuenta todas las filas de la tabla (o del resultado filtrado)
"COUNT(columna)" Cuenta únicamente las filas donde la columna especificada no es NULL No

Ejemplo práctico

En la base de datos existe la tabla "empleados":

ID Nombre Edad
1 Ana 25
2 Luis NULL
3 Pedro 30
En la columna Edad hay un valor "NULL, que es la clave de la diferencia.

Consulta usando COUNT(*)

SELECT COUNT(*) 
FROM empleados;
Cuenta las 3 filas de la tabla, sin importar si alguna columna tiene "NULL".

Consulta usando COUNT(*)

SELECT COUNT(Edad) 
FROM empleados;
Solo cuenta las filas donde Edad tiene un valor distinto de "NULL".

Resumen

  • "COUNT(*)" cuenta todas las filas
  • "COUNT(columna)" cuenta las filas con valor "NOT NULL" en esa columna

Recomendaciones en MySQL

  • Usar "COUNT(*)" cuando quieras saber el número total de registros incluso si tienen nulos.
  • Usar "COUNT(columna)" cuando necesites saber cuántos valores válidos (no nulos) tiene una columna concreta.
  • Si quieres contar valores distintos no nulos, usar "COUNT(DISTINCT columna)".
  • En tablas grandes," COUNT(*)" suele ser muy eficiente porque MySQL puede usar información del motor de almacenamiento especialmente con InnoDB y MyISAM.

Ejemplo

-- Total de empleados
SELECT COUNT(*) AS total_empleados FROM empleados;

-- Empleados con edad registrada
SELECT COUNT(Edad) AS empleados_con_edad FROM empleados;

-- Empleados sin edad registrada
SELECT COUNT(*) - COUNT(Edad) AS empleados_sin_edad FROM empleados;
Pequeños detalles como este en SQL y especialmente en MySQL pueden generar grandes diferencias en los resultados de reportes y análisis.