sql >> データベース >  >> RDS >> Mysql

MySQLでの集計関数(SUM、AVG、MAX、MIN、COUNT、DISTINCT)の使用

    レポート、統計、分析の目的でデータを取得するために、複数の行で計算を実行する必要があることがよくありました。このような場合、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を使用して、重複レコードを省略することができます。このシナリオでは、スコア> 以下に示すように、クエリを使用して少なくとも1つのサブジェクトに対して。

    # 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. Windowsでxamppのコマンドラインにアクセスする方法

    2. PHP7.0上のLaravel5.4:PDO例外-ドライバーが見つかりませんでした(MySQL)

    3. 指定された文字列を分割し、caseステートメントを準備します

    4. 一般的なクエリを列として保存しますか?