Modelado físico avanzado relacional de bases de datos
Curso sobre Funciones de Agregación en SQL
Las funciones de agregación en SQL permiten realizar cálculos sobre un conjunto de valores y devolver un solo valor resumido. Estas funciones se utilizan comúnmente con la cláusula GROUP BY para agrupar resultados.
Esta es la tabla con las que vamos a ver los ejemplos:
1CREATE TABLE empleado ( 2 id INT AUTO_INCREMENT PRIMARY KEY, 3 nombre VARCHAR(100) NOT NULL, 4 apellido VARCHAR(100) NOT NULL, 5 salario DECIMAL(10,2) NOT NULL CHECK (salario >= 0), 6 departamento VARCHAR(100) NOT NULL, 7 fecha_contratacion DATE NOT NULL, 8 correo VARCHAR(150) UNIQUE NOT NULL, 9 telefono VARCHAR(20), 10 direccion TEXT, 11 hijos INT 12); 13 14INSERT INTO empleado (nombre, apellido, salario, departamento, fecha_contratacion, correo, telefono, direccion, hijos) VALUES 15('Juan', 'Pérez', 2500.00, 'IT', '2020-05-15', 'juan.perez@email.com', '123456789', 'Calle 123, Ciudad A', 2), 16('María', 'González', 3200.00, 'Recursos Humanos', '2018-09-10', 'maria.gonzalez@email.com', '987654321', 'Avenida 45, Ciudad B', 2), 17('Carlos', 'Rodríguez', 2800.00, 'Marketing', '2019-07-21', 'carlos.rodriguez@email.com', '456789123', 'Calle 10, Ciudad C', 0), 18('Ana', 'López', 3100.00, 'Ventas', '2017-03-05', 'ana.lopez@email.com', '159753486', 'Avenida 89, Ciudad D', 1), 19('Luis', 'Fernández', 2700.00, 'IT', '2021-11-12', 'luis.fernandez@email.com', '753951258', 'Calle 77, Ciudad E', 1), 20('Sofía', 'Martínez', 3300.00, 'Finanzas', '2016-02-20', 'sofia.martinez@email.com', '852741963', 'Calle 15, Ciudad F', 1), 21('David', 'Ramírez', 2900.00, 'Marketing', '2019-10-30', 'david.ramirez@email.com', '369258147', 'Avenida 12, Ciudad G', 1), 22('Laura', 'Hernández', 3400.00, 'Recursos Humanos', '2015-06-18', 'laura.hernandez@email.com', '741852963', 'Calle 98, Ciudad H', 0), 23('Pedro', 'Torres', 2600.00, 'IT', '2022-01-25', 'pedro.torres@email.com', '258369147', 'Avenida 23, Ciudad I', 3), 24('Elena', 'Díaz', 3150.00, 'Ventas', '2018-04-14', 'elena.diaz@email.com', '159357486', 'Calle 36, Ciudad J', 9);
| Nombre | Apellido | Salario | Departamento | Fecha Contratación | Correo | Teléfono | Dirección | Hijos |
|---|---|---|---|---|---|---|---|---|
| Juan | Pérez | 2500.00 | IT | 2020-05-15 | juan.perez@email.com | 123456789 | Calle 123, Ciudad A | 2 |
| María | González | 3200.00 | Recursos Humanos | 2018-09-10 | maria.gonzalez@email.com | 987654321 | Avenida 45, Ciudad B | 2 |
| Carlos | Rodríguez | 2800.00 | Marketing | 2019-07-21 | carlos.rodriguez@email.com | 456789123 | Calle 10, Ciudad C | 0 |
| Ana | López | 3100.00 | Ventas | 2017-03-05 | ana.lopez@email.com | 159753486 | Avenida 89, Ciudad D | 1 |
| Luis | Fernández | 2700.00 | IT | 2021-11-12 | luis.fernandez@email.com | 753951258 | Calle 77, Ciudad E | 1 |
| Sofía | Martínez | 3300.00 | Finanzas | 2016-02-20 | sofia.martinez@email.com | 852741963 | Calle 15, Ciudad F | 1 |
| David | Ramírez | 2900.00 | Marketing | 2019-10-30 | david.ramirez@email.com | 369258147 | Avenida 12, Ciudad G | 1 |
| Laura | Hernández | 3400.00 | Recursos Humanos | 2015-06-18 | laura.hernandez@email.com | 741852963 | Calle 98, Ciudad H | 0 |
| Pedro | Torres | 2600.00 | IT | 2022-01-25 | pedro.torres@email.com | 258369147 | Avenida 23, Ciudad I | 3 |
| Elena | Díaz | 3150.00 | Ventas | 2018-04-14 | elena.diaz@email.com | 159357486 | Calle 36, Ciudad J | 9 |
1. COUNT() - Contar Filas
La función COUNT() se usa para contar el número de filas en una tabla o en un grupo de datos.
Ejemplo:
1SELECT COUNT(*) FROM empleados;
Este código cuenta todas las filas en la tabla empleados.
Para contar solo valores distintos en una columna específica:
1SELECT COUNT(DISTINCT departamento) FROM empleados;
Esto contará los departamentos únicos en la tabla empleados.
2. SUM() - Sumar Valores
La función SUM() calcula la suma de una columna numérica.
Ejemplo:
1SELECT SUM(salario) FROM empleados; 2-- Si no hay filas, el resultado será NULL, no 0. 3SELECT COALESCE(SUM(salario), 0) FROM empleados;
Esto devuelve la suma de todos los salarios en la tabla empleados.
Se puede combinar con GROUP BY:
1SELECT departamento, SUM(salario) FROM empleados GROUP BY departamento;
Agrupa los salarios por departamento y calcula la suma de los salarios en cada uno.
3. AVG() - Promedio
La función AVG() devuelve el promedio de los valores en una columna numérica.
Ejemplo:
1SELECT AVG(salario) FROM empleados;
Esto devuelve el salario promedio de todos los empleados.
Para obtener el promedio por departamento:
1SELECT departamento, AVG(salario) FROM empleados GROUP BY departamento;
Agrupa por departamento y calcula el promedio de los salarios.
Ejemplo:
Vamos a calcular que empleados cobran por encima de la media
1select nombre, apellido,salario from empleado where salario > ( select avg(salario) from empleado )
Ejemplo:
Muestra el nombre y apellidos del empleado y un mensaje idicando si esta por encima o por debajo de la media
1select nombre, apellido, 2 case when salario > ( select avg(salario) from empleado ) 3 then 'por encima de la media' 4 else 'por debajo de la media' 5 end as situacion 6from empleado
Ejemplo:
¿Cuánto hijos de media suelen tener mis empleados?
1select avg(hijos) from empleado
Ejemplo:
¿Cuál es la moda de hijos (el valor que más se repite) ?
1select hijos as moda, count(hijos) as frecuencia 2from empleado 3group by hijos 4order by frecuencia desc 5limit 1
4. MIN() y MAX() - Valor Mínimo y Máximo
Las funciones MIN() y MAX() devuelven el valor mínimo y máximo de una columna, respectivamente.
Ejemplo:
1SELECT MIN(salario) FROM empleados; 2SELECT MAX(salario) FROM empleados;
Esto devuelve el salario más bajo y el más alto en la tabla empleados.
Para obtener estos valores por departamento:
1SELECT departamento, MIN(salario), MAX(salario) FROM empleados GROUP BY departamento;
Ejemplo:
Muestra el empleado que más cobra
1select nombre, apellido from empleado where salario = (select max(salario) from empleado)
5. GROUP_CONCAT() / STRING_AGG() / LISTAGG() - Concatenación de Valores
Estas funciones concatenan valores de una columna en un solo resultado.
Ejemplo:
1SELECT GROUP_CONCAT(nombre) FROM empleados;
Esto devuelve una lista de nombres separados por comas.
Ejemplo:
Obtén todos los emails de los empleados separados por comas
1SELECT GROUP_CONCAT(email SEPARATOR ', ') AS CORREOS FROM empleado;
6. STDDEV() y VARIANCE() - Desviación Estándar y Varianza
Estas funciones se usan para cálculos estadísticos.
- STDDEV(salario): devuelve la desviación estándar muestral del salario.
- VARIANCE(salario): devuelve la varianza muestral del salario.
Ejemplo:
1SELECT STDDEV(salario) FROM empleados; 2SELECT VARIANCE(salario) FROM empleados;
Para calcular por departamento:
1SELECT departamento, STDDEV(salario), VARIANCE(salario) 2FROM empleados 3GROUP BY departamento;
7. MEDIAN() - Mediana
1SELECT APPROX_PERCENTILE(0.5, salario) AS mediana FROM empleados;
Esto devuelve la mediana de los salarios.