📗

SQL-集計関数とグループ化

2023/06/14に公開

SQLを学習する

こんにちは!わいわわです。
今回はSQLの集計関数とグループ化について学習します!

progateさんのカリキュラムを解き、
自分なりに説明していくような形でアウトプットします!

今回、大前提としてデータが用意されております。
・テーブル…purchasesテーブル 買い物のデータ
・カラム…name(商品名),price(価格),purchased_at(購入した日付)
 character_name(購入者名),category(食費など)

DISTINCT

SELECT DISTINCT(character_name)
FROM purchases;

DISTINCTを用いると、検索結果から重複するデータを除くことが可能です。
「DISTINCT(カラム名)」とすることで、
検索結果から指定したカラムの重複するデータを除くことができます。
これを使用すると重複がなく、見やすいデータを抽出することができます!

集計関数

テーブルに保存されている数値データの合計、平均などを算出する集計関数。
様々な種類があるので主なものをまとめていきます。

SUM

SUM関数は数値の合計を算出します。
「 SUM(カラム名) 」のようにすることで、
指定したカラムに保存されたデータの合計を計算することが可能です。

SELECT SUM(price)
FROM purchases
WHERE character_name = "にんじゃわんこ"
;

今回はpriceカラムのデータの合計を算出しています。
さらにWHEREでcharacter_nameカラムが「にんじゃわんこ」のpriceデータのみ抽出し、
SUM関数で足しています。
このように集計関数はWHEREと組み合わせることができます!

AVG

AVG関数は抽出したデータの平均を求めることができる集計関数です。

COUNT

COUNT関数は抽出したデータの数を求めることができる集計関数です。
「COUNT( カラム名 )」とすることで、指定したカラムのデータの数を計算します。

null...COUNT関数でカラム名を指定した場合、nullになっているデータの数は計算されません。
nullの数も含めてデータの数を計算したい場合は、
COUNT関数で * (全てのカラム)を指定します。

SELECT COUNT(*)
FROM purchases
WHERE character_name ="にんじゃわんこ"
;

このコードではWHEREでcharacter_nameカラムが「にんじゃわんこ」のデータのみ抽出し、
COUNT関数でnullを含めたすべてのデータの数を数えています。

MAXとMIN

MAXという関数を用いると、指定したカラムのデータの中から最大のデータを取得することができます。
またMINと言う関数を用いることで、最小のデータを取得することができます。

データのグループ化

GROUP BY

GROUP BYを用いると、データをグループ化することができます。
「GROUP BY カラム名」のように記述することで、
指定したカラムで、完全に同一のデータを持つレコード同士が同じグループとなります。

SELECT SUM(price),purchased_at
FROM purchases
GROUP BY purchased_at
;

流れとしては
1.purchasesテーブルから
2.priceの合計とpurchased_atを抽出
3.purchased_atのカラムごとにまとめる
といったイメージです。

複数の場合

SELECT SUM(price),purchased_at,character_name
FROM purchases
GROUP BY purchased_at,character_name
;

このように「,」を使用することで複数のグループにまとめることもできます。

WHEREと一緒に使う

GROUP BYはWHEREとも併用することができ、その場合はWHEREの後に書きます。
WHEREとGROUP BYと集計関数は以下の順番で実行されていきます。

1.検索:WHERE
2.グループ化:GROUP BY
3.関数:COUNT,AVG,SUM,MAX,MIN

SELECT SUM(price),purchased_at
FROM purchases
WHERE character_name = "にんじゃわんこ"
GROUP BY purchased_at
;

このコードではまずWHEREでcharacter_nameが「にんじゃわんこ」、
そのデータをpurchased_atごとにグループ化し、
priceの合計とpurchased_atを算出しています。

先にWHEREで検索してからグループ化するイメージですね!

さらに条件を指定する

さらに条件を指定したい場合はHAVINGを使用します。
「GROUP BY カラム名 HAVING 条件」のようにすることで、
条件を満たすグループを取得することができます。

グループ化した後のデータを絞り込む際、WHEREではなくHAVINGを使うのは、
SQLの各コマンドが以下の順番で実行されていくためです。
1.検索:WHERE
2.グループ化:GROUP BY
3.関数:COUNT,AVG,SUM,MAX,MIN
4.HAVING

SELECT SUM(price), purchased_at
FROM purchases
GROUP BY purchased_at
HAVING SUM(price) > 2000;

上記のコードではpurchased_atごとにグループ化したうえで
HAVINGで合計2000以上のpriceをもつpurchased_atグループを抽出します。

HAVINGはグループ化された後のテーブルから検索するため、
条件文で使うカラムは必ずグループ化されたテーブルのカラムを使うことになります。

WHEREはまず最初に実行され、
そのあとにGROUP BYと関数が実行され、
その後にHAVINGが実行されるということですね!

所感

今回はSQLの中でも集計関数とグループ化について学習しました。
ただ抽出するだけはなく記述し読み込まれる順番も
意識したうえでSQLを扱うことが重要ですね!

Discussion