MySQL Funciones de agregación: SUMA, CONTAR, AVG y MAX
⚡ Resumen inteligente
Funciones agregadas en MySQL realizar un cálculo en muchas filas de una sola columna y devolver un valor resumido. Las cinco funciones estándar ISO: CONTAR, SUMA, AVG, MIN y MAX: son la base de casi todos los informes que produce una base de datos.
¿Qué son las funciones agregadas en MySQL?
An función agregada Lee varias filas de una sola columna y las combina en un solo valor. Las funciones de agregación se centran en:
- Realizar cálculos en varias filas
- De una sola columna de una tabla
- Y devolviendo un valor único.
La norma ISO define cinco (5) funciones agregadas, a saber:
- COUNT
- SUM
- AVG
- MIN
- MAX
Una regla se aplica a los cinco: Las funciones de agregación ignoran los valores NULL.COUNT(*) es la única excepción, y veremos por qué a continuación.
Por qué utilizar funciones agregadas
Los distintos niveles organizativos tienen diferentes necesidades de información. Los directivos de alto nivel suelen estar interesados en las cifras globales, no en los detalles individuales.
Las funciones agregadas nos permiten producir fácilmente datos resumidos de nuestra base de datos.
Por ejemplo, a partir de nuestra base de datos de myflix, la gerencia puede requerir los siguientes informes:
- Películas menos alquiladas.
- Películas más alquiladas.
- Número promedio de veces que se alquila cada película al mes.
Todos los informes anteriores provienen de funciones de agregación. Analicemos cada uno en detalle.
Función COUNT
La función COUNT devuelve el número total de valores en el campo especificado, tanto para tipos de datos numéricos como no numéricos. Al igual que cualquier función de agregación, COUNT(columna) excluye los valores NULL.
COUNT(*) es una forma especial que devuelve el recuento de todas las filas en una tabla. También cuenta NULLs y duplicados, porque cuenta filas en lugar de valores.
La tabla movierentals contiene los siguientes datos:
| número de referencia | Fecha de Transacción | Fecha de regreso | número de socio | id_película | película_ devuelta |
|---|---|---|---|---|---|
| 11 | 20-06-2012 | NULL | 1 | 1 | 0 |
| 12 | 22-06-2012 | 25-06-2012 | 1 | 2 | 0 |
| 13 | 22-06-2012 | 25-06-2012 | 3 | 2 | 0 |
| 14 | 21-06-2012 | 24-06-2012 | 2 | 2 | 0 |
| 15 | 23-06-2012 | NULL | 3 | 3 | 0 |
Supongamos que queremos obtener el número de veces que se ha alquilado la película con ID 2.
SELECT COUNT(`movie_id`) FROM `movierentals` WHERE `movie_id` = 2;
Ejecutar esto en MySQL Banco de trabajo La consulta contra myflixdb devuelve 3, porque tres filas contienen movie_id 2.
| CONTAR(`movie_id`) |
|---|
| 3 |
Palabra clave DISTINTA
COUNT responde “cuántos”. La siguiente pregunta suele ser “cuántos”. una experiencia diferente unos”, y para eso sirve DISTINCT.
La palabra clave DISTINCT omite duplicados de nuestros resultados por grupo.ping valores idénticos juntos, exactamente como sugiere la ilustración anterior.
Primero, ejecutemos una consulta sencilla.
SELECT `movie_id` FROM `movierentals`;
| id_película |
|---|
| 1 |
| 2 |
| 2 |
| 2 |
| 3 |
Ahora la misma consulta con la palabra clave DISTINCT:
SELECT DISTINCT `movie_id` FROM `movierentals`;
DISTINCT omite los registros duplicados:
| id_película |
|---|
| 1 |
| 2 |
| 3 |
COUNT vs COUNT(*) vs COUNT(DISTINCT): ¿Cuál debería usar?
DISTINCT también se puede colocar interior una función agregada, y aquí es donde la mayoría de los principiantes pierden track de las cuales se cuentan realmente las filas. Los cuatro formularios que aparecen a continuación se ejecutan sobre la misma tabla de cinco filas llamada movierentals que se mostró anteriormente, pero no todos devuelven el mismo número. La diferencia radica en dos preguntas: ¿el formulario cuenta filas o valores?, y ¿conserva los duplicados?
| Formulario | Lo que cuenta | Resultado en movierentals |
|---|---|---|
| COUNT (*) | Cada fila, incluyendo duplicados y filas que son completamente NULL | 5 |
| CONTAR(`movie_id`) | Todos los valores no nulos de la columna, incluidos los duplicados. | 5 |
| CONTAR(`fecha_de_retorno`) | Solo valores no nulos: se omiten las dos fechas de retorno nulas. | 3 |
| CONTAR(DISTINCTO `movie_id`) | Solo valores únicos que no sean nulos. | 3 |
SELECT COUNT(*) AS `all_rows`, COUNT(`return_date`) AS `returned_rows`, COUNT(DISTINCT `movie_id`) AS `unique_movies` FROM `movierentals`;
💡 Consejo: Utilice COUNT(*) para contar filas, COUNT(columna) cuando NULL signifique "no aplica" y COUNT(DISTINCT columna) para valores únicos. Lo opuesto a DISTINCT es ALL, que es el valor predeterminado y, por lo tanto, rara vez se escribe.
Función MIN
La función MÍN. devuelve el valor más pequeño en el campo de la tabla especificada.
Supongamos que queremos saber el año en que se estrenó la película más antigua de nuestra colección. MySQLLa función MIN nos da eso.
SELECT MIN(`year_released`) FROM `movies`;
Resultado:
| MÍN(`año_de_lanzamiento`) |
|---|
| 2005 |
Función MAX
Tal como sugiere el nombre, la función MAX es lo opuesto a la función MIN. Él devuelve el valor más grande del campo de tabla especificado.
Supongamos que queremos saber el año de estreno de la última película de nuestra base de datos. El siguiente ejemplo nos lo devuelve.
SELECT MAX(`year_released`) FROM `movies`;
Resultado:
| MAX(`año_de_lanzamiento`) |
|---|
| 2012 |
Función SUMA
MIN y MAX seleccionan un valor existente de una columna. SUMA y AVG Calcula un nuevo número a partir de toda la columna.
Supongamos que queremos el monto total de pagos realizados hasta el momento. MySQL SUM función Devuelve la suma de todos los valores en la columna especificada.. SUM sólo funciona en campos numéricos, y Los valores NULL se excluyen del resultado..
La siguiente tabla muestra los datos de la tabla de pagos.
| identificación_pago | número de socio | fecha de pago | description | cantidad pagada | número_de_referencia_externo |
|---|---|---|---|---|---|
| 1 | 1 | 23-07-2012 | Pago de alquiler de película | 2500 | 11 |
| 2 | 1 | 25-07-2012 | Pago de alquiler de película | 2000 | 12 |
| 3 | 3 | 30-07-2012 | Pago de alquiler de película | 6000 | NULL |
La consulta que se muestra a continuación obtiene todos los pagos realizados y los suma en un único resultado: 2500 + 2000 + 6000 = 10500.
SELECT SUM(`amount_paid`) FROM `payments`;
Resultado:
| SUMA(`cantidad_pagada`) |
|---|
| 10500 |
AVG función
El MySQL AVG función devuelve el promedio de los valores en una columna especificada. Al igual que la función SUMA, funciona sólo en tipos de datos numéricos.
Supongamos que queremos calcular el importe medio pagado. Podemos usar la siguiente consulta, que divide el total de 10500 entre las tres filas de pago que no son nulas.
SELECT AVG(`amount_paid`) FROM `payments`;
Resultado:
| AVG(`cantidad_pagada`) |
|---|
| 3500 |
⚠️ Advertencia: AVG divide por el número de filas no nulas, no por el número de filas de la tabla. Una cantidad nula se omite en lugar de contarse como cero, lo que aumenta silenciosamente el promedio. Usar AVG(IFNULL(`amount_paid`, 0)) cuando un valor faltante significa cero.
Ejemplo práctico: Combinación de funciones de agregación con GROUP BY
Cada una de las funciones anteriores devolvió una cifra para toda la tabla. Agregar una GRUPO POR La cláusula devuelve una cifra por grupo En cambio, así es como se elaboran los informes reales.
El siguiente ejemplo agrupa a los miembros por nombre y luego cuenta el número total de pagos, el importe medio de cada pago y el total general de los importes de pago para cada miembro.
SELECT m.`full_names`, COUNT(p.`payment_id`) AS `paymentscount`, AVG(p.`amount_paid`) AS `averagepaymentamount`, SUM(p.`amount_paid`) AS `totalpayments` FROM members m, payments p WHERE m.`membership_number` = p.`membership_number` GROUP BY m.`full_names`;
Ejecutando el ejemplo anterior en MySQL Workbench nos da los siguientes resultados.
La consulta une las dos tablas en la cláusula WHERE, el estilo de unión por comas más antiguo. El código moderno escribe la misma lógica como una consulta explícita. UNIÓN INTERNA … ENCENDIDA. Tenga en cuenta también que cada columna no agregada en la lista SELECT debe aparecer en GROUP BY, o MySQL 5.7 y posteriormente rechazan la consulta bajo ONLY_FULL_GROUP_BY. Consulte el oficial MySQL Referencia de función agregada.



