SQL-集計関数とグループ化
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