En SQL, muchas veces no solo queremos consultar datos individuales, sino también resumir información.
Por ejemplo:
- Contar cuántos empleados hay por departamento.
- Calcular el salario promedio de cada área.
- Obtener el total de ventas por mes.
Para lograr esto, SQL nos ofrece dos herramientas esenciales:
- Funciones de agregación como
COUNT,SUM,AVG,MAXyMIN. - La cláusula GROUP BY, que permite agrupar registros según un criterio.
En este artículo aprenderás:
- Cómo usar cada función de agregación.
- Cómo combinar estas funciones con
GROUP BY. - Buenas prácticas para optimizar tus consultas.
- Ejemplos listos para ejecutar en db-fiddle.com.
Funciones de agregación en SQL
Las funciones de agregación trabajan sobre conjuntos de datos y devuelven un solo valor por grupo.
| Función | Descripción | Ejemplo |
|---|---|---|
| COUNT() | Cuenta registros | COUNT(*) |
| SUM() | Suma valores numéricos | SUM(salario) |
| AVG() | Calcula el promedio | AVG(salario) |
| MAX() | Encuentra el valor máximo | MAX(salario) |
| MIN() | Encuentra el valor mínimo | MIN(salario) |
Preparando el escenario: tablas y datos
Trabajaremos con dos tablas: empleados y departamentos.
CREATE TABLE departamentos (
id_departamento INTEGER PRIMARY KEY,
nombre_departamento TEXT NOT NULL
);
CREATE TABLE empleados (
id_empleado INTEGER PRIMARY KEY,
nombre TEXT NOT NULL,
salario DECIMAL(10,2) NOT NULL,
id_departamento INTEGER
); Datos ficticios:
INSERT INTO departamentos (id_departamento, nombre_departamento) VALUES
(1, 'Recursos Humanos'),
(2, 'Ventas'),
(3, 'Tecnología');
INSERT INTO empleados (id_empleado, nombre, salario, id_departamento) VALUES
(1, 'Ana Torres', 75000, 1),
(2, 'Luis Pérez', 90000, 2),
(3, 'Carlos López', 60000, 3),
(4, 'Marta Díaz', 72000, 2),
(5, 'Pedro García', 58000, 3),
(6, 'Sofía Ruiz', 88000, 2); Estos datos estarán disponibles para practicar en db-fiddle.com.
Uso básico de GROUP BY
La sintaxis general es:
SELECT columna_agrupada, función_agregación
FROM tabla
GROUP BY columna_agrupada; 💡 Nota: todas las columnas en el
SELECTque no estén dentro de una función de agregación deben aparecer en el GROUP BY.
Ejemplo: contar empleados por departamento
Queremos saber cuántos empleados tiene cada departamento.
SELECT d.nombre_departamento, COUNT(e.id_empleado) AS total_empleados
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.id_departamento = d.id_departamento
GROUP BY d.nombre_departamento; Resultado:
| nombre_departamento | total_empleados |
|---|---|
| Recursos Humanos | 1 |
| Ventas | 3 |
| Tecnología | 2 |
Uso de otras funciones de agregación
SUM: suma de salarios por departamento
SELECT d.nombre_departamento, SUM(e.salario) AS total_salarios
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.id_departamento = d.id_departamento
GROUP BY d.nombre_departamento; | nombre_departamento | total_salarios |
|---|---|
| Recursos Humanos | 75000 |
| Ventas | 250000 |
| Tecnología | 118000 |
AVG: salario promedio por departamento
SELECT d.nombre_departamento, AVG(e.salario) AS promedio_salarios
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.id_departamento = d.id_departamento
GROUP BY d.nombre_departamento; | nombre_departamento | promedio_salarios |
|---|---|
| Recursos Humanos | 75000 |
| Ventas | 83333.33 |
| Tecnología | 59000 |
MAX y MIN: salarios extremos por departamento
SELECT d.nombre_departamento,
MAX(e.salario) AS salario_mas_alto,
MIN(e.salario) AS salario_mas_bajo
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.id_departamento = d.id_departamento
GROUP BY d.nombre_departamento; | nombre_departamento | salario_mas_alto | salario_mas_bajo |
|---|---|---|
| Recursos Humanos | 75000 | 75000 |
| Ventas | 90000 | 72000 |
| Tecnología | 60000 | 58000 |
Combinar GROUP BY con WHERE
Puedes usar WHERE para filtrar antes de agrupar.
Ejemplo: empleados con salario mayor a 60,000 agrupados por departamento.
SELECT d.nombre_departamento, COUNT(e.id_empleado) AS total
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.id_departamento = d.id_departamento
WHERE e.salario > 60000
GROUP BY d.nombre_departamento; Diferencias entre motores SQL
| Motor SQL | Comportamiento |
|---|---|
| SQL Server | Soporta todas las funciones de agregación y GROUP BY estándar. |
| MySQL | Igual que SQL Server. GROUP BY requiere columnas explícitas. |
| PostgreSQL | Soporte completo y optimización avanzada para agregaciones. |
| SQLite | Soporte completo, ideal para prácticas y proyectos ligeros. |
Buenas prácticas
- Siempre incluir las columnas agrupadas en el
GROUP BY. - Usa alias descriptivos para columnas calculadas (
total_empleados,promedio_salarios). - Filtra primero con
WHEREpara mejorar rendimiento antes de agrupar. - Evita
SELECT *en consultas con agregaciones. - Prueba tus consultas en plataformas como db-fiddle.com.
Conclusión
El uso de GROUP BY junto con funciones de agregación es fundamental para analizar y resumir datos en SQL.
Desde contar registros hasta calcular promedios y totales, estas herramientas te permiten crear reportes útiles y precisos.
Comienza a practicar los ejemplos de este artículo en db-fiddle.com y lleva tus habilidades de SQL al siguiente nivel.