Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Usando funções agregadas (SUM, AVG, MAX, MIN, COUNT, DISTINCT) no MySQL


Muitas vezes, exigimos cálculos em várias linhas para obter os dados para fins estatísticos e analíticos. Nesses casos, as funções de agregação disponíveis no MySQL são úteis e devemos estar atentos ao uso dessas funções para buscar os dados desejados. Essas funções incluem SUM, AVG, MAX, MIN, COUNT e DISTINCT.



O restante da seção deste tutorial explica o uso dessas funções de agregação.


Dados de teste




Você pode usar as consultas mencionadas abaixo para preparar os dados de teste para seguir as seções subsequentes. Crie o banco de dados e as tabelas da escola (usuário e pontuação) para entender as funções de agregação.


# 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`));



Agora adicione os dados de teste à tabela de usuário conforme mostrado abaixo.


# 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 );



A consulta acima insere 5 usuários para as seções 1 e 2. Além disso, insira os dados de pontuação usando a consulta conforme mostrado abaixo.


# 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');



Inserimos a pontuação dos alunos ativos. Além disso, observe que a pontuação do aluno com id 1 e 2 é adicionada para a seção 1 para todas as 3 disciplinas. A consulta acima também insere os dados de pontuação do aluno com id 3 para as seções 1 e 2. O aluno com id 4 obteve os dados de pontuação para a seção 2. Agora temos bons dados de teste para começar a aprender as funções agregadas.


SOMA




Esta seção explica o uso da soma da função agregada para obter a pontuação por seção dos usuários para obter a pontuação total de todos os assuntos para todas as seções, conforme mostrado abaixo.


# 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



Os resultados da consulta acima podem ser usados ​​para apresentar o relatório mostrando a pontuação total de todos os usuários para cada seção que estudaram na escola.


AVG




A função agregada AVG pode ser usada para obter o valor médio das colunas qualificadas para a agregação com base nas condições WHERE e no agrupamento aplicado por nós.



Podemos obter as notas médias por seção em cada disciplina, conforme mostrado abaixo.


# 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



Agora podemos usar os dados acima para gerar o relatório mostrando a pontuação média obtida pelos usuários para cada seção.


MÁX.




A função agregada MAX pode ser usada para descobrir o valor máximo das colunas qualificadas para a agregação com base nas condições WHERE e no agrupamento aplicado por nós.



Podemos obter as notas máximas por seção em cada assunto, conforme mostrado abaixo.


# 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


MIN




A função agregada MIN pode ser usada para descobrir o valor mínimo das colunas qualificadas para a agregação com base nas condições WHERE e no agrupamento aplicado por nós.



Podemos obter as notas mínimas por seção em cada assunto, conforme mostrado abaixo.


# 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


CONTAGEM




A função agregada COUNT pode ser usada para obter o número total de valores nas colunas especificadas.



Usando os dados de teste, podemos obter o total de usuários ativos por seção, conforme mostrado abaixo.


# 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 a palavra-chave DISTINCT para omitir registros duplicados. Em nosso cenário, podemos obter os dados do usuário que obtiveram pontuação para pelo menos um assunto usando a consulta conforme mostrado abaixo.


# 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 o usuário inativo que não pontuou nenhuma vez é omitido dos resultados da consulta.



É assim que podemos usar as funções agregadas para obter os dados para fins de relatório e análise. Essas funções também são importantes para que as atividades gerenciais tomem decisões da organização utilizando os dados acumulados ao longo do tempo.