レポート、統計、分析の目的でデータを取得するために、複数の行で計算を実行する必要があることがよくありました。このような場合、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 );
上記のクエリは、セクション1と2に5人のユーザーを挿入します。また、以下に示すように、クエリを使用してスコアデータを挿入します。
# 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');
アクティブな学生のスコアを挿入しました。また、ID 1と2の学生のスコアは、3つの科目すべてのセクション1に追加されることに注意してください。上記のクエリは、セクション1と2のID3の学生のスコアデータも挿入します。ID4の学生は、セクション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を使用して、重複レコードを省略することができます。このシナリオでは、
# 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
一度も得点しなかった非アクティブなユーザーがクエリ結果から除外されていることがわかります。
これは、集計関数を使用して、レポートおよび分析の目的でデータを取得する方法です。これらの機能は、管理活動が時間の経過とともに蓄積されたデータを使用して組織の意思決定を行うためにも重要です。