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つの列でグループ化します( CourseIdYear内 )。したがって、CSC101によって平均成績とグループを計算します。 年間2021CSC101の平均成績とは別に 年間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クエリの句。