AVG(columna) devuelve el promedio de los valores no nulos de una columna: suma esos valores y divide entre cuántos son. Se usa en el SELECT, se combina con WHERE para promediar solo algunas filas y con GROUP BY para promediar por categoría. Si ninguna fila cumple la condición, el resultado es NULL, no cero.
Sintaxis
SELECT AVG(columna) FROM tabla;
SELECT AVG(columna) FROM tabla WHERE condicion;
SELECT AVG(DISTINCT columna) FROM tabla; -- solo valores distintos
SELECT ROUND(AVG(columna), 2) AS promedio FROM tabla;
AVG es estándar: la misma consulta funciona en MySQL, PostgreSQL, SQL Server, Oracle y SQLite. La columna debe ser numérica; en algunos motores, una columna de texto con números se convierte sola y en otros da error.
Paso a paso
- Identifica la tabla y la columna numérica que quieres promediar.
- Escribe
SELECT AVG(columna) AS promedio FROM tabla. El aliasASle da un nombre legible a la columna del resultado. - Si solo te interesan algunas filas, agrega
WHEREantes de agrupar o promediar. - Redondea con
ROUND(AVG(columna), 2)si vas a mostrar el resultado. - Si quieres un promedio por categoría, agrega
GROUP BY; está en AVG con GROUP BY.
Tabla de ejemplo:
CREATE TABLE ventas (
id INTEGER PRIMARY KEY,
sucursal VARCHAR(20),
vendedor VARCHAR(20),
fecha DATE,
importe DECIMAL(10, 2)
);
INSERT INTO ventas (sucursal, vendedor, fecha, importe) VALUES
('Centro', 'Ana', '2026-10-01', 1250.00),
('Centro', 'Ana', '2026-10-02', 980.50),
('Centro', 'Beto', '2026-10-02', 1430.00),
('Norte', 'Carla', '2026-10-01', 2100.00),
('Norte', 'Carla', '2026-10-03', 1875.25),
('Norte', 'Dani', '2026-10-03', 640.00),
('Sur', 'Eli', '2026-10-02', 1500.00),
('Sur', 'Eli', '2026-10-04', 1500.00);
Ejemplos resueltos
Ejemplo 1: promedio de toda la tabla y de una sucursal
SELECT AVG(importe) AS promedio FROM ventas;
SELECT ROUND(AVG(importe), 2) AS promedio_norte
FROM ventas
WHERE sucursal = 'Norte';
| promedio | promedio_norte |
|---|---|
| 1409.46875 | 1538.42 |
Las 8 ventas suman 11,275.75; entre 8 da 1,409.46875. Las tres del Norte suman 4,615.25 y su promedio, 1,538.4166…, se redondea a 1,538.42. SQL Server mostraría el primer resultado como 1409.468750, porque el promedio de un DECIMAL(10,2) es un DECIMAL(38,6).
Ejemplo 2: resumen de un periodo con varias funciones
SELECT COUNT(*) AS n,
ROUND(AVG(importe), 2) AS promedio,
MIN(importe) AS minimo,
MAX(importe) AS maximo
FROM ventas
WHERE fecha BETWEEN '2026-10-02' AND '2026-10-03';
| n | promedio | minimo | maximo |
|---|---|---|---|
| 5 | 1285.15 | 640 | 1875.25 |
Mostrar n, mínimo y máximo junto al promedio da contexto: con solo 5 ventas y un rango de 640 a 1,875.25, el promedio de 1,285.15 esconde mucha variación. BETWEEN incluye ambos extremos.
Ejemplo 3: AVG con DISTINCT
SELECT AVG(importe) AS promedio,
AVG(DISTINCT importe) AS promedio_distintos
FROM ventas;
| promedio | promedio_distintos |
|---|---|
| 1409.46875 | 1396.5357142857142 |
Eli tiene dos ventas de 1,500.00. DISTINCT cuenta ese importe una sola vez y divide entre 7 valores distintos. Casi nunca es lo que quieres para importes; sirve, por ejemplo, para promediar los precios distintos de un catálogo con filas repetidas.
Qué devuelve AVG en cada motor
| Motor | Columna entera | Columna decimal | Sin filas |
|---|---|---|---|
| PostgreSQL | numeric (con decimales) | numeric | NULL |
| MySQL | DECIMAL (con decimales) | DECIMAL | NULL |
| SQL Server | int: trunca los decimales | decimal(38, s) con s de al menos 6 | NULL |
| SQLite | Punto flotante | Punto flotante | NULL |
El caso de SQL Server con enteros es la trampa más común; lo explicamos en AVG con enteros.
Errores comunes
- Esperar 0 cuando no hay filas.
SELECT AVG(importe) FROM ventas WHERE sucursal = 'Oeste'devuelveNULL. UsaCOALESCE(AVG(importe), 0)si tu aplicación necesita un número. - Mezclar AVG con columnas sueltas.
SELECT vendedor, AVG(importe) FROM ventasfalla en PostgreSQL, SQL Server y en MySQL conONLY_FULL_GROUP_BY(activo por omisión desde MySQL 5.7), porquevendedorno está agrupado. SQLite lo acepta y devuelve un vendedor cualquiera, lo que es peor: no avisa. AgregaGROUP BY vendedor. - Usar AVG en el WHERE.
WHERE AVG(importe) > 1000no es válido: las funciones de agregado se filtran conHAVING. Ver HAVING y filas sobre el promedio. ROUNDsobredouble precisionen PostgreSQL.ROUND(x, 2)solo existe paranumeric; si la columna esdouble precisionoreal, escribeROUND(AVG(x)::numeric, 2).- Contar los NULL como cero.
AVGlos ignora. Si un valor faltante debe valer 0, mira AVG y los valores NULL.
Fuentes
- PostgreSQL, funciones de agregado. avg y tipos de resultado. Consultado el 11 de noviembre de 2026.
- Microsoft Learn, AVG (Transact-SQL). Tipos de retorno por tipo de columna. Consultado el 11 de noviembre de 2026.
- SQLite, funciones de agregado. avg siempre devuelve un valor de punto flotante. Consultado el 11 de noviembre de 2026.