Funciones de agregación en SQL: COUNT, SUM, AVG, MIN, MAX, GROUP BY y HAVING


Hasta ahora cada fila aparecía de forma individual. Pero muchas veces queremos obtener resúmenes: cuántos registros hay, cuánto suman, cuál es el promedio o cuál es el valor máximo.

¿Qué es una función de agregación?

Una función de agregación recibe varias filas y devuelve un valor resumido.

Las más usadas son:

  • COUNT()
  • SUM()
  • AVG()
  • MIN()
  • MAX()

Una tabla de ejemplo

Imaginemos estos alumnos:

id | nombre | ciudad       | edad | cuota
1  | Ana    | Santa Rosa   | 20   | 10000
2  | Juan   | Santa Rosa   | 24   | 12000
3  | Lucía  | General Pico | 22   | 11000

Las funciones de agregación toman varias filas como estas y producen un resumen.

COUNT()

Cuenta filas. En el ejemplo anterior, COUNT(*) devuelve 3.

SELECT COUNT(*) AS total_alumnos
FROM alumnos;

El alias AS total_alumnos cambia el nombre de la columna del resultado.

COUNT(columna)

A diferencia de COUNT(*), ignora valores NULL.

SELECT COUNT(email)
FROM alumnos;

SUM()

Suma valores numéricos. Si las cuotas son 10000, 12000 y 11000, SUM(cuota) devuelve 33000.

SELECT SUM(cuota) AS total_cuotas
FROM alumnos;

AVG()

Calcula el promedio. Para edades 20, 24 y 22, AVG(edad) devuelve 22.

SELECT AVG(edad) AS edad_promedio
FROM alumnos;

MIN() y MAX()

Devuelven el menor y mayor valor.

SELECT MIN(edad) AS menor_edad,
       MAX(edad) AS mayor_edad
FROM alumnos;

AS: dar nombre al resultado agregado

Las expresiones como COUNT(*) o AVG(edad) pueden quedar con nombres poco cómodos. Un alias mejora la lectura:

SELECT AVG(edad) AS edad_promedio
FROM alumnos;

GROUP BY

GROUP BY divide los registros en grupos y aplica las funciones a cada grupo.

SELECT ciudad, COUNT(*) AS cantidad
FROM alumnos
GROUP BY ciudad;

Ahora ya no obtenemos un total general, sino un total por cada ciudad.

Con los datos del ejemplo, el resultado sería conceptualmente:

ciudad       | cantidad
Santa Rosa   | 2
General Pico | 1

La clave para entender GROUP BY es preguntarse: “¿por qué dimensión quiero resumir los datos?”. Puede ser por ciudad, curso, categoría, mes, cliente, etc.

Promedio por grupo

SELECT ciudad, AVG(edad) AS edad_promedio
FROM alumnos
GROUP BY ciudad;

Qué columnas pueden aparecer junto a GROUP BY

Cuando agrupamos, cada fila del resultado representa un grupo. Por eso, las columnas seleccionadas deberían ser:

  • columnas incluidas en GROUP BY; o
  • resultados de funciones de agregación.

Por ejemplo, esta consulta tiene sentido porque ciudad define el grupo y COUNT(*) resume sus filas.

WHERE antes de agrupar

WHERE elimina filas antes de formar los grupos.

SELECT ciudad, COUNT(*) AS cantidad
FROM alumnos
WHERE edad >= 22
GROUP BY ciudad;

HAVING

HAVING filtra grupos ya calculados.

SELECT ciudad, COUNT(*) AS cantidad
FROM alumnos
GROUP BY ciudad
HAVING COUNT(*) > 1;

El orden lógico: WHERE → GROUP BY → HAVING

Una forma sencilla de pensarlo es:

  1. WHERE decide qué filas entran al análisis;
  2. GROUP BY forma los grupos;
  3. las funciones calculan sus valores;
  4. HAVING decide qué grupos permanecen.

WHERE vs HAVING

  • WHERE: filtra filas antes de agrupar.
  • HAVING: filtra grupos después de agrupar.

COUNT(DISTINCT …)

Cuenta valores distintos.

SELECT COUNT(DISTINCT ciudad) AS cantidad_ciudades
FROM alumnos;

NULL en funciones de agregación

Funciones como AVG(), SUM(), MIN(), MAX() y COUNT(columna) normalmente ignoran NULL.

COUNT(*), en cambio, cuenta filas aunque alguna de sus columnas contenga NULL.

Esto importa mucho en promedios: un NULL no se interpreta como cero, simplemente no participa del cálculo.

Ejemplo completo

SELECT ciudad,
       COUNT(*) AS cantidad,
       AVG(edad) AS edad_promedio
FROM alumnos
WHERE edad > 20
GROUP BY ciudad
HAVING COUNT(*) >= 2
ORDER BY edad_promedio DESC;

Errores comunes

  • confundir WHERE con HAVING;
  • olvidar GROUP BY;
  • suponer que COUNT(columna) cuenta NULL;
  • usar SUM() sobre campos que no representan cantidades.

Ejercicios

  1. contar alumnos;
  2. calcular edad promedio;
  3. obtener edad mínima y máxima;
  4. contar por ciudad;
  5. mostrar ciudades con más de un alumno.

¿Qué sigue?

JOIN y relaciones entre tablas.

¿Te sirvió esta guía? ☕

Si este contenido te ayudó y querés apoyar a Club Programador para seguir publicando ejercicios, proyectos y guías gratuitas, podés colaborar mediante:

☕ Apoyar con Mercado Pago

🌎 Apoyar con PayPal


Ruta SQL / MySQL

Ver todos los contenidos de SQL / MySQL

← SELECT en SQL

JOIN en SQL →


Descubre más desde Club Programador

Suscríbete y recibe las últimas entradas en tu correo electrónico.

2 opiniones en “Funciones de agregación en SQL: COUNT, SUM, AVG, MIN, MAX, GROUP BY y HAVING”

Deja un comentario

Descubre más desde Club Programador

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo