Mysql
 sql >> база данни >  >> RDS >> Mysql

Използване на агрегатни функции (SUM, AVG, MAX, MIN, COUNT, DISTINCT) в MySQL

Често се налага да извършваме изчисления на множество редове, за да получим данните за отчетни, статистически и аналитични цели. В такива случаи функциите за агрегиране, налични в MySQL, са удобни и трябва да сме наясно с използването на тези функции за извличане на желаните данни. Тези функции включват SUM, AVG, MAX, MIN, COUNT и DISTINCT.

Останалата част от този урок обяснява използването на тези функции за агрегиране.

Тестови данни

Можете да използвате посочените по-долу заявки, за да подготвите тестовите данни, за да следвате следващите раздели. Създайте училищната база данни и таблици (потребител и резултат), за да разберете функциите за агрегиране.

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

Сега добавете тестовите данни към потребителската таблица, както е показано по-долу.

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

Горната заявка вмъква 5 потребители за секции 1 и 2. Също така вмъкнете данните за резултата, като използвате заявката, както е показано по-долу.

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

Вмъкнахме оценката на активните ученици. Също така имайте предвид, че резултатът за ученика с идентификатор 1 и 2 се добавя за раздел 1 за всичките 3 предмета. Горната заявка също така вмъква данните за резултата на ученик с идентификатор 3 за секции 1 и 2. Студентът с идентификатор 4 получи данните за резултата за раздел 2. Сега имаме добри тестови данни, за да започнем да изучаваме агрегатните функции.

SUM

Този раздел обяснява използването на сумата на обобщената функция, за да получите оценката на потребителите по раздели, за да получите общия резултат от всички предмети за всички раздели, както е показано по-долу.

# 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

Резултатите от заявката по-горе могат да се използват за представяне на отчета, показващ общия резултат на всички потребители за всеки раздел, който са изучавали в училището.

AVG

Обобщаващата функция AVG може да се използва за получаване на средната стойност на колоните, квалифицирани за агрегиране въз основа на условията WHERE и групирането, приложено от нас.

Можем да получим средните оценки по раздели за всеки предмет, както е показано по-долу.

# 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

Сега можем да използваме горните данни, за да генерираме отчет, показващ средния резултат, получен от потребителите за всяка секция.

MAX

Обобщаващата функция MAX може да се използва за намиране на максималната стойност на колоните, квалифицирани за агрегиране въз основа на условията WHERE и групирането, приложено от нас.

Можем да получим максималните оценки по раздели във всеки предмет, както е показано по-долу.

# 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

Обобщаващата функция MIN може да се използва за намиране на минималната стойност на колоните, квалифицирани за агрегиране въз основа на условията WHERE и групирането, приложено от нас.

Можем да получим минималните оценки по раздели за всеки предмет, както е показано по-долу.

# 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

БРОЙ

Обобщаващата функция COUNT може да се използва за получаване на общия брой стойности в посочените колони.

Използвайки тестовите данни, можем да получим общия брой активни потребители по раздели, както е показано по-долу.

# 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

РАЗЛИЧЕН

Можем да използваме ключовата дума DISTINCT, за да пропуснем дублиращи се записи. В нашия сценарий можем да получим потребителските данни, които са получили резултат за поне един обект, като използвате заявката, както е показано по-долу.

# 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

Можем да видим, че неактивният потребител, който не е отбелязал нито веднъж, е пропуснат от резултатите от заявката.

Ето как можем да използваме агрегатните функции, за да получим данните за отчитане и анализ. Тези функции също са важни за управленските дейности за вземане на организационни решения, използвайки данните, натрупани във времето.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MyCLI – MySQL/MariaDB клиент с автоматично довършване и подчертаване на синтаксиса

  2. Функция MySQL GREATEST() – Намерете най-големия аргумент в списък с аргументи

  3. Как да извлека две последователни цифри от текстово поле в MySQL?

  4. Грешка в незаконен микс от съпоставяне в MySql

  5. Как работи функцията REGEXP_LIKE() в MySQL