皆さんこんにちは。合同会社StudioData代表のRyumaと申します。
今回はSQLの集計関数とグループ化について解説していきます。
グループ化とは?
グループ化とはカラムの中身が同じものをまとめたり、値を集計する時などに役に立つSQLの技の一つです。
例として下記のテーブルをstudentsテーブルと命名した上で解説します。
例えばstudentsテーブルのうち男性と女性のスコアの合計点をそれぞれ出すとします。この時にグループ化を行います。
SQLではグループ化をする際、下記のような形で記載します。
GROUP BY
グループ化するカラム名
最終的に以下のような形で結果を出すためにどのようなクエリを書けばいいのかを次の章で解説していきます。
集計関数とGROUP BYを使おう
GROUP BYと一緒に使うことが多い「集計関数」について解説します。
Excelやスプレッドシートでも見かけることが多い、SUM(),COUNT(),MAX(),MIN(),AVG()などのことです。
複数のデータのうち、合計や数、一番大きい数をまとめた上で取得してくれます。
早速studentsテーブルの例で「男女ごとのScoreの合計」を取得するクエリを書いていきましょう。
SELECT Gender, SUM(Score) AS SUM FROM students GROUP BY Gender
2行目の「AS SUM」の書き方ですが「AS "〇〇"」で「以下はこれのことを〇〇と呼ぶよ」と宣言することができます。
SELECT句でGenderカラムとScoreカラムの合計値を取得するSUM(Score)を選択しています。
そしてポイントなのが6,7行目で「GROUP BY Gender」としている点です。
これによってGenderごとにまとめられるので男女ごとにScoreの合計値が取得出来ます。
HAVINGとクエリの実行順序
続いてHAVINGについて軽く説明するために下記のテーブルを用意しました。
testsテーブルと命名したこのテーブルは、誰が何の科目のテストを受け、点数は何点だったのかを情報として持っています。
この時、3科目以上受験した生徒を出力したいときはどうすればいいのでしょうか。下記のようなクエリを書きます。
SELECT name, COUNT(subject_id) AS subject_count FROM tests GROUP BY name HAVING COUNT(subject_id) >= 3
1~7行目で「nameごとのCOUNT(subject_id)をGROUP BY name」として取得しているので「誰が何科目受験したか」を取得できます。
そして8,9行目で「COUNT(subject_id)をした時にその値が3以上である」という条件を追加しています。
なぜ「〇〇という条件」を指定するWHERE句を使わずHAVINGを使うのかは、クエリを実行する順番が関係しています。
こちらの画像の上から順にクエリが実行されると考えてください。そうするとWHEREは「GROUP BY」や「COUNT,SUMなど」よりも先に実行され、HAVINGはそれより後に実行されています。
つまり「COUNT(subject_id)が3以上」という条件は「グループ化」と「関数」の実行後でなければクエリが理解できない条件なのです。
そのために関数を使った条件はWHERE句ではなくHAVING句で指定します。
ORDER BYとGROUP BY
最後に「ORDER BY」について解説します。ここではSELECT句で取得したデータを指定した条件で並べ替えることができます。
SELECT name, COUNT(subject_id) AS subject_count FROM tests GROUP BY name HAVING COUNT(subject_id) >= 3
先ほどのこちらのクエリを「受験した科目が大きい順」に並べ替えるとします。その場合下記のように「ORDER BY」を追加してあげることで並べ替えが可能です。
SELECT name, COUNT(subject_id) AS subject_count FROM tests GROUP BY name HAVING COUNT(subject_id) >= 3 ORDER BY subject_count DESC
10,11行目の「ORDER BY subject_count DESC」で「subject_countを降順で並べ替え」と命令しています。
降順はDESC、昇順はASC(ASCは省略可能)で指定しましょう。
ORDER BYはSELECT句よりも後に実行されるため「COUNT(subject_id) AS subject_count」と名前をつけたものが使えます。
複雑な関数を使った際などはいちいちそれをORDER BYで書くのは面倒なので名前をつけておくと楽になります!
SQLの集計関数とGROUP BYまとめ
今回はSQLの集計関数とGROUP BYを中心に解説させていただきました。
特にクエリの実行順番を正しく理解することでエラーの原因やどのような記述にすれば良いかなどが分かってきますので、是非ともここはしっかりと理解しておいてください!
最後までご視聴いただきありがとうございました!