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

SQLのグループ化と合計の概要

    SQLの最も強力な側面の1つは、データ集約を実行する機能です。最も強力なSQLデータ集約ツールの2つは、グループ化です。 および合計 。このガイドでは、グループ化と合計を使用したSQLデータの集計について学習します。

    SQL集計関数

    SQLでは、集計は一連の値を操作または計算するプロセスです。目的は、単一の要約値を返すことです。 SQLには、AVG()などの非常に強力な集計関数がいくつか含まれています。 、COUNT()SUM()MAX() 、およびMIN() 。これらの関数は、GROUP BYを実装するSQLステートメントで最もよく見られます。 句。ただし、これらの関数をその句に関連付ける必要はありません。

    注 特に明記されていない限り、このガイドで示されているすべてのデータベースコマンドは、両方の MySQLで適切に機能します。 およびPostgreSQL

    このガイドでは、CourseTakenを使用しています 集計関数を示す表。コマンドラインから、CourseTakenを作成します テーブル。

    CREATE TABLE CourseTaken (
        SSNumber CHAR(9) NOT NULL,
        CourseId CHAR(6) NOT NULL,
        NumericGrade INT NOT NULL,
        YearTaken INT NOT NULL
    );
    

    CourseTaken テーブルには次の列データが含まれています:

    SSNumber CourseId NumericGrade YearTaken
    111111111 CSC101 98 2021
    111111111 ENG101 95 2022
    222222222 CSC101 100 2022
    222222222 EEE101 75 2022
    333333333 POL101 92 2021
    333333333 CSC101 84 2022

    SQL集計関数を使用して単一の集計値を計算する

    以下のセクションでは、集計関数を使用して単一の集計値を返すさまざまな例を示します。すべての例でCourseTakenを使用しています ガイドの集計関数セクションで作成されたテーブル。

    例1:

    この例では、集計関数は、コースCSC101を受講しているすべての学生の平均成績を返します。 2022年に。

    SELECT AVG(NumericGrade) AS 'Avg Grade'
    FROM CourseTaken
    WHERE CourseId = 'CSC101
    AND YearTaken = 2022;
    

    SQLは次の平均成績を返します:

    Avg Grade
    ---------
    92

    例2:

    以下の集計関数は、コースCSC101を受講した学生の数を返します。 2022年以前。

    SELECT COUNT(SSNumber) AS 'Student Count'
    FROM CourseTaken
    WHERE CourseId = 'CSC101'
    AND YearTaken < 2022;
    

    次のカウントが返されます:

    Student Count
    ---------
    1

    例3:

    この例では、集計関数を使用して、CSC101を受講している学生が任意の年に記録した最大の数値成績を取得します。 。

    SELECT MAX(NumericGrade) AS 'Max Grade'
    FROM CourseTaken
    WHERE CourseId = 'CSC101'
    

    返される最大グレードは次のとおりです。

    Max Grade
    ---------
    100

    グループ関数を使用してデータを集約する

    次の例は、GROUP BYの使用法を示しています CourseTakenからのデータを使用する句 テーブル。

    例1:

    以下の例では、これまでに受講したすべてのコースの各学生の平均成績を決定します。これを実行するには、SQL Group Byを使用します Studentでグループ化する句(この場合、SSNumber 列)。

    SELECT SSNumber, AVG(NumericGrade) AS 'Avg Grade'
    FROM CourseTaken
    GROUP BY SSNumber
    

    出力には、各生徒の平均成績が返されます。

    +-----------+----------+
    | SSNumber  | Avg Grade|
    +-----------+----------+
    | 111111111 | 96.5     |
    | 222222222 | 87.5     |
    | 333333333 | 88       |
    +-----------+----------+

    例2:

    以下の集計関数は、すべてのCourseIdで受け取った平均成績を検索します。 CourseTakenで テーブル。これを行うには、CourseIdでグループ化します YearTaken内 次のSQLコードを使用します:

    SELECT CourseId AS 'Course', YearTaken AS 'Year',
    AVG(NumericGrade) AS 'Avg Grade'
    FROM CourseTaken
    GROUP BY CourseId, YearTaken
    ORDER BY CourseId, YearTaken
    

    次の出力が表示されます。

    +--------+------+-----------+
    | Course | Year | Avg Grade |
    +--------+------+-----------+
    | CSC101 | 2021 | 98        |
    | POL101 | 2021 | 92        |
    | CSC101 | 2022 | 92        |
    | EEE101 | 2022 | 75        |
    | ENG101 | 2022 | 95        |
    +--------+------+-----------+
    注 上記の例は少し複雑です。 1つではなく2つの列でグループ化します(CourseId Year内 )。したがって、CSC101によって平均成績とグループを計算します。 年間2021 CSC101の平均成績とは別に 年間2022 。コースCSC1012022 は2行の集約であり、他のすべてのGroupBy行は1行の集約です。さらに、注文の概念から (Order By 句)Courseで並べ替えた結果を表示できます 指定された年内。

    例3:

    前の例のSQLクエリから、WHEREを追加することで、操作する行数を制限できます。 クエリの句。たとえば、CourseIdについてのみ学生が受け取る平均成績を生成するには CSC101CourseIdでグループ化 YearTaken内 。次のSQLコードでこれを実現できます:

    SELECT CourseId AS 'Course', YearTaken AS 'Year',
    AVG(NumericGrade) AS 'Avg Grade'
    FROM CourseTaken
    WHERE CourseId = 'CSC101'
    GROUP BY CourseId, YearTaken
    ORDER BY CourseId, YearTaken
    

    上記のSQLコードでは、条件を追加しています(WHEREを使用) 句)実際のグループ集計が実行される前(GROUP BYを介して) 条項)。

    次の出力が返されます:

    +--------+------+-----------+
    | Course | Year | Avg Grade |
    +--------+------+-----------+
    | CSC101 | 2021 | 98        |
    | CSC101 | 2022 | 92        |
    +--------+------+-----------+

    例4:

    例2のSQLクエリから、最終結果が返される前に条件を適用できます。これを実現するには、SQLのHavingを使用します 句。すべてのCourseIdの平均成績を決定できます 、集計された平均成績が90より大きい場合 。 CourseIdで再度グループ化できます YearTaken内 。次のSQLコードでこれを実現できます:

    SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
    AVG(NumericGrade) AS ‘Avg Grade’
    FROM CourseTaken
    GROUP BY CourseId, YearTaken
    HAVING AVG(NumericGrade) > 90
    ORDER BY CourseId, YearTaken
    

    出力は次のとおりです。

    +--------+------+-----------+
    | Course | Year | Avg Grade |
    +--------+------+-----------+
    | CSC101 | 2021 | 98        |
    | POL101 | 2021 | 92        |
    | CSC101 | 2022 | 92        |
    | ENG101 | 2022 | 95        |
    +--------+------+-----------+

    CourseIdの行 EEE101 返されませんでした。これは、Having GROUP BYの後に句が除外されました 句が実行されました(CourseId EEE101 の平均成績は90未満です。

    例5:

    例3のSQLコードに基づいて構築 および例4Whereの両方を利用する集計クエリを作成できます およびHaving 句。たとえば、2021で受講したコースを特定できます。 、受講したコースの平均成績が93より大きい場合 。ここで、Where 句は、Group Byの前に結果を除外します データ集約が実行され、Having 句は、Group Byの後に返される結果を除外します データ集約が実行されます。次のSQLコードでこれを実現できます:

    SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
    AVG(NumericGrade) AS ‘Avg Grade’
    FROM CourseTaken
    WHERE YearTaken = 2021
    GROUP BY CourseId, YearTaken
    HAVING AVG(NumericGrade) > 93
    ORDER BY CourseId
    

    返される出力は次のとおりです。

    +--------+------+-----------+
    | Course | Year | Avg Grade |
    +--------+------+-----------+
    | CSC101 | 2021 | 98        |
    +--------+------+-----------+

    例6:

    Group Byに関連付けられている行数を数えることができます クエリでの集計。前の例のSQLコードに基づいて、Studentsが受け取った平均成績を生成できます。 CourseIdのみ CSC101CourseIdでグループ化 YearTaken内 。コードは、各グループに関連付けられている学生の数(カウント)を提供する必要があります。次のSQLコードでこれを実現できます:

    SELECT CourseId AS ‘Course’, YearTaken AS ‘Year’,
    AVG(NumericGrade) AS ‘Avg Grade’,
    Count(SSNumber) AS ‘Count’
    FROM CourseTaken
    WHERE CourseId = ‘CSC101’
    GROUP BY CourseId, YearTaken
    ORDER BY CourseId, YearTaken
    

    Count(SSNumber) SELECTで 句はCount(*)として指定できます。 。 2つの構文の違いは、Count(*) NULLを持つ行が含まれます それらの値も同様です。 CourseTakenによる 上記のテーブル定義、CourseTakenのすべての列 テーブルにはnull以外の値が含まれている必要があります(NOT NULL 属性はこれを保証します)。 Count(SSNumber) およびCount(*) この例では機能的に同等です。

    次の出力が返されます:

    +--------+------+-----------+-------+
    | Course | Year | Avg Grade | Count |
    +--------+------+-----------+-------+
    | CSC101 | 2021 | 98        | 1     |
    | CSC101 | 2022 | 92        | 2     |
    +--------+------+-----------+-------+

    結論

    このガイドは、グループ化と合計のためのSQLの強力なデータ集約操作の構成要素を提供します。前述のように、Whereを使用して、これらのグループの一部となる値を制限できます。 集計が実行される前のクエリの句。 Havingを使用して、(集計が実行された後)グループ化された結果の行を除外できます。 SQLクエリの句。


    1. Perconaサーバーをハイブリッドクラウドにデプロイする

    2. Postgres SELECTの列を連結するにはどうすればよいですか?

    3. MariaDBEXCEPTオペレーターの説明

    4. リンクサーバーを単一のローカルログインに制限する(T-SQLの例)