COUNT en MySQL: contar filas, valores y grupos
Aprende a contar filas en MySQL con COUNT, COUNT DISTINCT, WHERE, GROUP BY y HAVING.
Actualizado el
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ón | Qué 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 valoresNULL. - 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.