Lesión 4.1 · Tiempo de lectura: ~8 minutos
Las funciones de agregación SQL ayudan a transformar conjuntos de filas en métricas resumidas: conteo, suma, promedio, mínimo y máximo. En esta lección, trabajarás con las agregaciones más comunes utilizando ejemplos de Sakila y aprenderás a elegir el enfoque de conteo correcto para cada tarea. Al final de la lección, usarás con confianza COUNT, SUM, AVG, MIN y MAX en SQL analítico.
Funciones de Agregación Básicas en SQL
En lecciones anteriores, te enfocaste en seleccionar filas individuales. Ahora pasamos al siguiente paso importante: calcular valores resumidos a partir de los datos.
Las funciones de agregación son esenciales en informes y análisis porque responden rápidamente a preguntas como "¿cuántos?", "¿cuánto en total?" y "¿cuál es el promedio?".
Funciones de Agregación Fundamentales
COUNT() - cuenta filas
Sintaxis básica:
COUNT(expresión)
Ejemplo:
SELECT COUNT(*) AS total_pagamentos
FROM payment;
Resultado: la consulta devuelve el número total de filas en la tabla de pagos.
COUNT(column) vs COUNT(*)
Estas formas se ven similares pero se comportan de manera diferente:
COUNT(*)cuenta todas las filas en el conjunto de resultados.COUNT(column)cuenta solo las filas dondecolumnno esNULL.
Si una columna contiene NULL, COUNT(column) puede ser menor que COUNT(*).
SELECT
COUNT(*) AS total_alquileres,
COUNT(return_date) AS alquileres_devueltos
FROM rental;
Explicación: total_alquileres cuenta todos los alquileres, mientras que alquileres_devueltos cuenta solo las filas donde return_date está completado.
COUNT(DISTINCT ...) - cuenta valores únicos
Cuando necesitas el número de valores únicos, no solo el número de filas, usa COUNT(DISTINCT column).
SELECT COUNT(DISTINCT customer_id) AS clientes_unicos
FROM payment;
Resultado: la consulta devuelve cuántos clientes únicos realizaron pagos, incluso si un cliente tiene muchas filas de pago.
En la práctica, esto es importante para preguntas como "¿cuántos clientes diferentes compraron?", donde un simple COUNT(*) contaría en exceso debido a filas repetidas.
SUM() - calcula un total
SELECT SUM(amount) AS total_monto
FROM payment;
Resultado: devuelve la suma total de la columna amount.
SUM(amount) ignora NULL. Si todos los valores son NULL, el resultado es NULL.
AVG() - calcula un promedio
SELECT AVG(amount) AS promedio_monto
FROM payment;
Resultado: devuelve el promedio de la cantidad sobre filas no NULL.
Si necesitas que las filas con NULL afecten el denominador, usa uno de estos enfoques:
SELECT
AVG(amount) AS avg_ignorar_null,
AVG(COALESCE(amount, 0)) AS avg_incluir_null_como_cero,
SUM(amount) / COUNT(*) AS avg_suma_div_todas_las_filas
FROM payment;
MAX() - encuentra el valor máximo
SELECT MAX(amount) AS max_monto
FROM payment;
Resultado: devuelve el valor más grande en amount.
MIN() - encuentra el valor mínimo
SELECT MIN(amount) AS min_monto
FROM payment;
Resultado: devuelve el valor más pequeño en amount.
Tanto MIN() como MAX() ignoran NULL. Si todos los valores son NULL, devuelven NULL.
MIN(column) vs ORDER BY ... LIMIT 1
No siempre son equivalentes.
SELECT MIN(column_name)
FROM table_name;
SELECT column_name
FROM table_name
ORDER BY column_name
LIMIT 1;
MIN(column_name)encuentra el mínimo entre los valores noNULL.ORDER BY ... LIMIT 1devuelve la primera fila después de ordenar.- Si tu SGBD ordena
NULLprimero, la segunda consulta puede devolverNULL, mientras queMIN()sigue devolviendo el valor mínimo noNULL.
Un equivalente confiable a MIN():
SELECT column_name
FROM table_name
WHERE column_name IS NOT NULL
ORDER BY column_name
LIMIT 1;
Uso Práctico
Contar clientes
SELECT COUNT(*) AS total_clientes
FROM customer;
Ventas totales por miembro del personal
SELECT
staff_id,
SUM(amount) AS total_staff
FROM payment
GROUP BY staff_id;
Promedio de pago por cliente
SELECT
customer_id,
AVG(amount) AS avg_pago
FROM payment
GROUP BY customer_id;
Contar clientes únicos que pagaron
SELECT COUNT(DISTINCT customer_id) AS clientes_pagadores
FROM payment;
Preguntas Frecuentes
¿Cuál es la diferencia entre COUNT(*) y COUNT(column)?
COUNT(*) cuenta todas las filas del resultado. COUNT(column) cuenta solo las filas donde la columna especificada no es NULL.
¿Cuándo debo usar COUNT(DISTINCT ...)?
Úsalo cuando necesites el número de valores únicos en lugar del total de filas, por ejemplo, clientes únicos en lugar de pagos totales.
¿Por qué puede AVG devolver un valor inesperado?
Porque AVG(column) ignora NULL. Si deseas que esas filas afecten el denominador, usa COALESCE o divide SUM(column) por COUNT(*).
Preguntas de Entrevista
¿Qué son las funciones de agregación en SQL?
Son funciones que calculan un resumen sobre múltiples filas, como conteo (COUNT), suma (SUM) o promedio (AVG). Devuelven un valor por grupo o por conjunto de resultados completo.
¿Cuál es la diferencia entre COUNT(*), COUNT(column) y COUNT(DISTINCT column)?
COUNT(*) cuenta todas las filas, COUNT(column) cuenta los valores no NULL en esa columna, y COUNT(DISTINCT column) cuenta los valores únicos no NULL.
¿Cómo pueden MIN y ORDER BY ... LIMIT 1 devolver resultados diferentes?
Si una columna contiene NULL y el SGBD ordena NULL primero, ORDER BY ... LIMIT 1 puede devolver NULL, mientras que MIN() devuelve el valor mínimo no NULL.
Puntos clave de esta lección:
- Las funciones de agregación proporcionan métricas resumidas rápidamente.
COUNT(*),COUNT(column)yCOUNT(DISTINCT ...)resuelven diferentes tareas de conteo.SUM,AVG,MINyMAXgeneralmente ignoranNULL, lo que afecta el análisis.COUNT(DISTINCT ...)es esencial cuando necesitas entidades únicas en lugar de totales de filas.- El manejo correcto de
NULLimpacta directamente en la precisión de los informes.
En la próxima lección, estudiaremos GROUP BY y aprenderemos a construir agregados por categorías.