Si alguna vez intentaste calcular la nota media de exámenes o, por ejemplo, el salario promedio en un departamento, ya conoces el concepto de media aritmética. Y bueno, en realidad esto lo enseñan mucho en el cole. En SQL, cualquier tarea relacionada con el cálculo del valor promedio en un conjunto de datos se resuelve con la función AVG().
La función AVG() es una función agregada que calcula la media aritmética para una columna numérica. Suma todos los valores en la columna indicada y divide el resultado por la cantidad de esos valores. No le hace caso a NULL (y este ignore, curiosamente, nos facilita la vida, pero de eso hablamos luego).
Sintaxis de AVG()
Vamos a empezar con la sintaxis básica:
SELECT AVG(columna)
FROM tabla;
Ojo: aquí columna es la columna que contiene los valores numéricos para los que quieres sacar el promedio.
Ejemplo 1: Salario promedio de empleados
Imagina que tenemos una tabla employees donde guardamos datos de empleados y sus salarios:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | 60000 |
| 3 | Alex | 55000 |
| 4 | Anna | NULL |
| 5 | Dan | 52000 |
Consulta sencilla para calcular el salario promedio:
SELECT AVG(salary) AS average_salary
FROM employees;
Resultado:
| average_salary |
|---|
| 54250 |
¿Cómo funciona esto?
AVG()suma todos los salarios: 50000 + 60000 + 55000 + 52000 = 217000.- Divide la suma entre la cantidad de valores no nulos: 217000 / 4 = 54250.
Particularidades de AVG() con NULL
Pudiste notar que para calcular el salario promedio el valor NULL en la columna salary fue ignorado. Esta es una característica clave de AVG(). Solo tiene en cuenta los valores que no son NULL.
Probemos un ejemplo:
SELECT AVG(NULL) AS resultado;
Resultado:
| resultado |
|---|
| NULL |
Esto confirma una vez más que AVG() ignora NULL. Sin embargo, si todo el conjunto de datos es NULL, el resultado será NULL.
Pero si en la tabla hay un 0 en vez de NULL, ese resultado no se ignora.
Tabla employees
| id | salary |
|---|---|
| 1 | 1000 |
| 2 | 0 |
| 3 | NULL |
| 4 | 2000 |
Consulta SQL:
SELECT AVG(salary) AS avg_salary
FROM employees;
Resultado:
| avg_salary |
|---|
| 1000 |
¿Por qué pasa esto?
Porque AVG() calcula:
[(1000 + 0 + 2000) / 3 = 1000]
La fila con NULL se ignora al calcular el promedio.
Ejemplo: Calcular la edad promedio de estudiantes
Ahora vamos a la tabla students:
| id | name | age |
|---|---|---|
| 1 | Anna | 20 |
| 2 | Max | 22 |
| 3 | Maria | NULL |
| 4 | Otto | 21 |
Consulta:
SELECT AVG(age) AS average_age
FROM students;
Resultado:
| average_age |
|---|
| 21 |
AVG()ignora a la estudiante Maria porque su edad es NULL.- El promedio se calcula así: (20 + 22 + 21) / 3 = 21.
Redondear el resultado
A veces el resultado de AVG() devuelve un valor decimal con varios dígitos después del punto.
Si necesitas un número redondeado, puedes usar la función ROUND().
Tabla employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | NULL |
Consulta SQL
SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;
Resultado
| rounded_average_salary |
|---|
| 52333.33 |
La fila con NULL se excluye del cálculo, así que el promedio se saca sobre tres valores.
Filtrar datos antes de calcular AVG()
Si quieres calcular el promedio solo para valores que cumplen ciertas condiciones, usa WHERE.
Tabla employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | 60000 |
| 5 | NULL |
Ejemplo: Buscamos el salario promedio de empleados cuyo id > 2.
SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;
Resultado
| average_salary |
|---|
| 53500 |
Solo se tienen en cuenta los salarios con id = 3 y id = 4. La fila con NULL se excluye.
Ejemplo: Consultas complejas con AVG()
Se puede combinar la función AVG() con otras funciones agregadas y operadores.
Supón que tenemos una tabla de ventas sales:
| sale_id | product | quantity | price |
|---|---|---|---|
| 1 | Teléfono | 2 | 500 |
| 2 | Portátil | 1 | 1500 |
| 3 | Tableta | 3 | 300 |
Consulta para calcular el promedio del total de ventas:
SELECT AVG(quantity * price) AS average_total_sale
FROM sales;
Resultado:
| averagetotalsale |
|---|
| 950 |
Trucos de la vida y errores típicos
Trabajar con AVG() requiere cuidado para evitar errores comunes:
Valores NULL: a veces sorprende por qué el resultado es más bajo de lo esperado. Recuerda que AVG() salta las filas con NULL.
Mezcla de tipos de datos: si en la columna hay números y texto mezclados (lo cual ya de por sí es mala práctica), AVG() dará error.
GO TO FULL VERSION