sql >> Base de Datos >  >> RDS >> Mysql

Uso de funciones agregadas (SUM, AVG, MAX, MIN, COUNT, DISTINCT) en MySQL

A menudo necesitábamos realizar cálculos en varias filas para obtener los datos con fines analíticos, estadísticos y de informes. En tales casos, las funciones de agregación disponibles en MySQL son útiles y debemos ser conscientes del uso de estas funciones para obtener los datos deseados. Estas funciones incluyen SUM, AVG, MAX, MIN, COUNT y DISTINCT.

El resto de la sección de este tutorial explica el uso de estas funciones de agregación.

Datos de prueba

Puede utilizar las consultas mencionadas a continuación para preparar los datos de prueba para seguir las secciones posteriores. Cree la base de datos y las tablas de la escuela (usuario y puntaje) para comprender las funciones de agregación.

# Create the database
CREATE SCHEMA `school` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

# Create the user table
CREATE TABLE `school`.`user` (
`user_id` BIGINT NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(45) NOT NULL,
`last_name` VARCHAR(45) NULL,
`section` SMALLINT(6) NULL,
`active` TINYINT(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`user_id`));

# Create the score table
CREATE TABLE `school`.`score` (
`score_id` BIGINT NOT NULL AUTO_INCREMENT,
`user_id` BIGINT NOT NULL,
`section` SMALLINT(6) NOT NULL DEFAULT 1,
`subject` VARCHAR(45) NOT NULL,
`score` SMALLINT(6) NOT NULL DEFAULT 0,
PRIMARY KEY (`score_id`));

Ahora agregue los datos de prueba a la tabla de usuarios como se muestra a continuación.

# User data
INSERT INTO `user` ( `user_id`, `first_name`, `last_name`, `section`, `active` ) VALUES
( 1, 'John', 'Smith', 1, 1 ),
( 2, 'Rick', 'Jones', 1, 1 ),
( 3, 'Catherine', 'Ponting', 2, 1 ),
( 4, 'Harsh', 'Upadhyay', 2, 1 ),
( 5, 'Tajwinder', 'Singh', 2, 0 );

La consulta anterior inserta 5 usuarios para las secciones 1 y 2. Además, inserte los datos de puntaje usando la consulta como se muestra a continuación.

# Score data
INSERT INTO `school`.`score` (`score_id`, `user_id`, `section`, `subject`, `score`) VALUES
('1', '1', '1', 'Maths', '86'),
('2', '1', '1', 'Physics', '75'),
('3', '1', '1', 'Chemistry', '90'),
('4', '2', '1', 'Maths', '64'),
('5', '2', '1', 'Physics', '98'),
('6', '2', '1', 'Chemistry', '56'),
('7', '3', '1', 'Maths', '48'),
('8', '3', '1', 'Physics', '69'),
('9', '3', '1', 'Chemistry', '54'),
('10', '3', '2', 'Maths', '82'),
('11', '3', '2', 'Physics', '85'),
('12', '3', '2', 'Chemistry', '91'),
('13', '4', '2', 'Maths', '65'),
('14', '4', '2', 'Physics', '74'),
('15', '4', '2', 'Chemistry', '84');

Hemos insertado la puntuación de los alumnos activos. Además, tenga en cuenta que el puntaje para el estudiante con id 1 y 2 se agrega para la sección 1 para las 3 materias. La consulta anterior también inserta los datos de puntaje del estudiante con id 3 para las secciones 1 y 2. El estudiante que tiene id 4 obtuvo los datos de puntaje para la sección 2. Ahora tenemos buenos datos de prueba para comenzar a aprender las funciones agregadas.

SUMA

Esta sección explica el uso de la suma de la función agregada para obtener el puntaje de los usuarios por sección para obtener el puntaje total de todos los temas para todas las secciones como se muestra a continuación.

# SUM - Total Score of the Users for each section
SELECT `user`.`first_name`, `user`.`last_name`, `score`.`section`, SUM(`score`) AS total_score FROM `user`, `score`
WHERE `user`.`user_id` = `score`.`user_id`
GROUP BY `score`.`user_id`, `score`.`section`;

# Result

first_name last_name section total_score
----------------------------------------------------
John Smith 1 251
Rick Jones 1 218
Catherine Ponting 1 171
Catherine Ponting 2 258
Harsh Upadhyay 2 223

Los resultados de la consulta anterior se pueden utilizar para presentar el informe que muestra la puntuación total de todos los usuarios para cada sección que han estudiado en la escuela.

PROMEDIO

La función de agregación AVG se puede utilizar para obtener el valor promedio de las columnas calificadas para la agregación en función de las condiciones DONDE y la agrupación aplicada por nosotros.

Podemos obtener las calificaciones promedio por sección en cada materia como se muestra a continuación.

# AVG - Section wise average score in each subject
SELECT `score`.`section`, `score`.`subject`, AVG(`score`) AS avg_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;

# Result

section subject avg_score
--------------------------------------------
1 Maths 66.0000
1 Physics 80.6667
1 Chemistry 66.6667
2 Maths 73.5000
2 Physics 79.5000
2 Chemistry 87.5000

Ahora podemos usar los datos anteriores para generar el informe que muestra el puntaje promedio obtenido por los usuarios para cada sección.

MÁXIMO

La función agregada MAX se puede utilizar para averiguar el valor máximo de las columnas calificadas para la agregación en función de las condiciones DONDE y la agrupación aplicada por nosotros.

Podemos obtener las notas máximas por secciones en cada materia como se muestra a continuación.

# MAX - Section wise maximum score in each subject
SELECT `score`.`section`, `score`.`subject`, MAX(`score`) AS max_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;

# Result

section subject max_score
--------------------------------------------
1 Maths 86
1 Physics 98
1 Chemistry 90
2 Maths 82
2 Physics 85
2 Chemistry 91

MÍN

La función agregada MIN se puede utilizar para averiguar el valor mínimo de las columnas calificadas para la agregación en función de las condiciones WHERE y la agrupación aplicada por nosotros.

Podemos obtener las notas mínimas por secciones en cada materia como se muestra a continuación.

# MIN - Section wise minimum score in each subject
SELECT `score`.`section`, `score`.`subject`, MIN(`score`) AS min_score FROM `score`
GROUP BY `score`.`section`, `score`.`subject`;

# Result

section subject max_score
--------------------------------------------
1 Maths 48
1 Physics 69
1 Chemistry 54
2 Maths 65
2 Physics 74
2 Chemistry 84

CONTAR

La función agregada COUNT se puede usar para obtener el número total de valores en las columnas especificadas.

Usando los datos de prueba, podemos obtener el total de usuarios activos por sección como se muestra a continuación.

# COUNT - Total active users in each section
SELECT `user`.`section`, COUNT(`user_id`) AS active_users FROM `user`
WHERE `user`.`active` = 1
GROUP BY `user`.`section`;

# Result
section active_user
--------------------
1 2
2 2

DISTINTO

Podemos usar la palabra clave DISTINCT para omitir registros duplicados. En nuestro escenario, podemos obtener los datos del usuario que obtuvo puntuación para al menos un tema usando la consulta como se muestra a continuación.

# DISTINCT - Get list of users who got score
SELECT DISTINCT `user`.`user_id`, `user`.`first_name`, `user`.`last_name` FROM `user`, `score`
WHERE `user`.`user_id` = `score`.`user_id`;

# Result

user_id first_name last_name
--------------------------------------------
1 John Smith
2 Rick Jones
3 Catherine Ponting
4 Harsh Upadhyay

Podemos ver que el usuario inactivo que no puntuó ni una sola vez se omite de los resultados de la consulta.

Así es como podemos usar las funciones agregadas para obtener los datos con fines de informes y análisis. Estas funciones también son importantes para las actividades gerenciales para tomar decisiones de la organización utilizando los datos acumulados a lo largo del tiempo.