Saltar al contenido

Mentoring

COUNT en MySQL: contar filas, valores y grupos

Aprende a contar filas en MySQL con COUNT, COUNT DISTINCT, WHERE, GROUP BY y HAVING.

Mentoring 3 min de lectura

Actualizado el

Función COUNT en MySQL

COUNT devuelve un recuento: COUNT(*) cuenta filas, mientras que COUNT(columna) ignora los valores NULL.

COUNT(*): contar todas las filas

SELECT COUNT(*)
FROM clientes;

Devuelve el número total de registros de la tabla clientes.

COUNT(columna): contar valores no nulos

COUNT(columna) cuenta solo las filas donde esa columna no es NULL.

SELECT COUNT(telefono)
FROM clientes;

Esta consulta no cuenta los clientes que tengan telefono en NULL.

Comparativa de expresiones

ExpresiónQué cuenta
COUNT(*)Todas las filas seleccionadas, aunque haya columnas con NULL.
COUNT(columna)Solo filas donde esa columna no es NULL.
COUNT(DISTINCT columna)Valores distintos y no nulos de esa columna.

Para ver ambos recuentos en la misma consulta:

SELECT
  COUNT(*) AS total_clientes,
  COUNT(telefono) AS clientes_con_telefono
FROM clientes;

COUNT(DISTINCT columna): contar valores únicos

Para contar valores únicos usa DISTINCT.

SELECT COUNT(DISTINCT ciudad)
FROM clientes;

Devuelve cuántas ciudades distintas aparecen en la tabla. COUNT(DISTINCT columna) también ignora los valores NULL.

Contar filas con WHERE

SELECT COUNT(*)
FROM clientes
WHERE ciudad = 'Madrid';

Devuelve cuántos clientes son de Madrid.

COUNT puede combinarse con el resto de cláusulas explicadas en la guía de SELECT en MySQL.

Contar por grupos con GROUP BY

SELECT ciudad, COUNT(*) AS total
FROM clientes
GROUP BY ciudad;

Devuelve el número de clientes por ciudad.

Filtrar grupos con HAVING

WHERE filtra filas antes de agrupar. HAVING filtra el resultado después de agrupar.

SELECT ciudad, COUNT(*) AS total
FROM clientes
GROUP BY ciudad
HAVING COUNT(*) > 10;

Devuelve solo las ciudades con más de 10 clientes.

Ordenar resultados por el recuento

SELECT ciudad, COUNT(*) AS total
FROM clientes
GROUP BY ciudad
ORDER BY total DESC;

Así ves primero las ciudades con más clientes.

Ejemplo real combinado

SELECT cliente_id, COUNT(*) AS pedidos_pagados
FROM pedidos
WHERE estado = 'pagado'
GROUP BY cliente_id
HAVING COUNT(*) >= 3
ORDER BY pedidos_pagados DESC;

Lista los clientes con al menos tres pedidos pagados, del que más pedidos tiene al que menos. WHERE filtra los pedidos antes de agrupar y HAVING descarta los grupos que no llegan al mínimo.

Consejos de uso

  • Usa COUNT(*) para contar filas completas.
  • Usa COUNT(columna) si quieres ignorar valores NULL.
  • Usa COUNT(DISTINCT columna) para contar valores únicos.

En InnoDB no hay un contador exacto materializado: COUNT(*) cuenta las filas visibles para la transacción. Sin WHERE, recorre el índice secundario disponible más pequeño; si no hay ninguno, escanea el índice clustered.

Con WHERE, cuenta solo las filas visibles que cumplen la condición. El optimizador elige el plan y el índice según el filtro y su selectividad; un índice adecuado puede ayudar, pero no se garantiza que se use ni que el recuento sea barato.