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
。コースCSC101
年2022
は2行の集約であり、他のすべてのGroupBy行は1行の集約です。さらに、注文の概念から (Order By
句)Course
で並べ替えた結果を表示できます 指定された年内。
例3:
前の例のSQLクエリから、WHERE
を追加することで、操作する行数を制限できます。 クエリの句。たとえば、CourseId
についてのみ学生が受け取る平均成績を生成するには CSC101
、CourseId
でグループ化 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コードに基づいて構築 および例4 、Where
の両方を利用する集計クエリを作成できます および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
のみ CSC101
、CourseId
でグループ化 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クエリの句。