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:

Tabla de vehiculos
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);

NombreApellidoSalarioDepartamentoFecha ContrataciónCorreoTeléfonoDirecciónHijos
JuanPérez2500.00IT2020-05-15juan.perez@email.com123456789Calle 123, Ciudad A2
MaríaGonzález3200.00Recursos Humanos2018-09-10maria.gonzalez@email.com987654321Avenida 45, Ciudad B2
CarlosRodríguez2800.00Marketing2019-07-21carlos.rodriguez@email.com456789123Calle 10, Ciudad C0
AnaLópez3100.00Ventas2017-03-05ana.lopez@email.com159753486Avenida 89, Ciudad D1
LuisFernández2700.00IT2021-11-12luis.fernandez@email.com753951258Calle 77, Ciudad E1
SofíaMartínez3300.00Finanzas2016-02-20sofia.martinez@email.com852741963Calle 15, Ciudad F1
DavidRamírez2900.00Marketing2019-10-30david.ramirez@email.com369258147Avenida 12, Ciudad G1
LauraHernández3400.00Recursos Humanos2015-06-18laura.hernandez@email.com741852963Calle 98, Ciudad H0
PedroTorres2600.00IT2022-01-25pedro.torres@email.com258369147Avenida 23, Ciudad I3
ElenaDíaz3150.00Ventas2018-04-14elena.diaz@email.com159357486Calle 36, Ciudad J9

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.