前回は基本構文を学びましたが、
取得したデータの加工について今回は実践を学びたいと思います!
以下学の履歴です。
スタート!
DISTINCT
DISTINCTを用いると、検索結果から重複するデータを除くことが可能です。
「DISTINCT(カラム名)」とすることで、検索結果から指定したカラムの重複するデータを除くことができます。
DISTINCTは図のように、SELECTで取得するカラムに使用することで、重複を省いたデータを取得できます。
図ではpurchasesテーブルからnameカラムの重複したデータを省いて取得しています。
四則演算について
SQLでは四則演算「足す(+)、引く(-)、かける(*)、割る(/)」が可能です。
左の図のような記号を使うことで、右の図のようにカラムのデータを計算することが可能です。
かける場合はアスタリスク(*)、割る場合はスラッシュ(/)を用いることに注意しましょう。
関数の利用について
合計を求める
SUM関数
SUM関数はWHEREと併用することができます。
下の図では、WHEREを使うことで、にんじゃわんこが今まで使ったお金の合計金額を取得しています。
平均の求め方
AVG関数
AVG関数はSELECTで取得するカラムに使用することで、計算結果を取得することができます。
AVG関数はWHEREと併用することができます。
下の図では、WHEREを使うことで、にんじゃわんこが買った商品の平均金額を取得しています。
データの数を計算
COUNT関数
COUNT関数は、指定したカラムのデータの合計数を計算してくれる関数です。
図のように「COUNT( カラム名 )」とすることで、指定したカラムのデータの数を計算します。
COUNT関数でカラム名を指定した場合、nullになっているデータの数は計算されません。
右の図ではnullのデータが計算されていないため、4件と数えられます。
nullの数も含めてデータの数を計算したい場合は、
COUNT関数で * (全てのカラム)を指定します。* を使った場合、
特定のカラムのデータの数ではなく、レコードの数を計算します。この方法で、nullの数を含めてデータの数を数えられます。
COUNT関数はWHEREと併用することができます。
下の図ではWHEREによって、にんじゃわんこがいくつ商品を買ったかを取得しています。
MAX MIN 関数
SQLでMAXという関数を用いると、指定したカラムのデータの中から最大のデータを取得することができます。
同じく、MINと言う関数を用いることで、最小のデータを取得することができます。
MAX,MINも他の集計関数と同様にWHEREと併用することができます。
下の図ではWHEREを使うことでにんじゃわんこが使った1番高い金額を取得しています。
データのグループ化
GROUP BY
GROUP BYを用いると、データをグループ化することができます。
例えば図のように「GROUP BY カラム名」とすることで、指定したカラムで、
完全に同一のデータを持つレコードどうしが同じグループとなります。
グループ化するには、今までの集計関数を取得するFROMの後ろに「GROUP BY カラム名」を追加します。
集計関数により、各グループごとにデータが集計されます。
GROUP BYを用いる場合、SELECTで使えるのは、GROUP BYに指定しているカラム名と、集計関数のみです。
図ではSELECTで集計関数を使っていないため、日付ごとに集計された値が取得できません。
カラムのグループ化
GROUP BYは複数のカラム名を適用させることができ、その場合は、カラム名同士をコンマ(,)で繋げます。
どのようにグループ化が行われ、集計されるのか、次のスライドで説明していきます。
集計関数により、各グループごとにデータを集計することができます。
例えば、下の図はそれぞれグループ化したデータに対してSUM関数とCOUNT関数を用いたものとなっています。
細かい条件設定でデータをグループ化
where と group by
GROUP BYはWHEREとも併用することができ、その場合はWHEREの後に書きます。
WHEREとGROUP BYと集計関数は以下の順番で実行されていきます。
下の図のようにWHEREはまず最初に、そのあとにGROUP BYと関数が実行されます。
where と group by の順番
今回のように日付とキャラクターごとの食費に使ったお金の合計を取得するときは、
①WHEREでカテゴリーが「食費」であるレコードを検索する
②日付とキャラクターでグループ化する
①と②は下の図
③集計関数で集計するという順番になります。
③については下の図
WHERE と GROUP BYの書き方
グループ化データの絞り込み
HAVING
GROUP BYでグループ化したデータを更に絞り込みたい場合には、HAVINGを用います。
図のように「GROUP BY カラム名 HAVING 条件」のようにすることで、条件を満たすグループを取得することができます。
Where と HAVING
グループ化した後のデータを絞り込む際、WHEREではなくHAVINGを使うのは、
SQLの各コマンドが以下の順番で実行されていくためです。
図のようにWHEREはまず最初に、そのあとにGROUP BYと関数が実行され、その後にHAVINGが実行されます。
Where と HAVING の違い
実行順序によって、WHEREとHAVINGは検索対象に違いがあります。
WHEREはグループ化される前のテーブル全体を検索対象とするのに対し、
HAVINGはGROUP BYによってグループ化されたデータを検索対象とします。
注意点
HAVINGはグループ化された後のテーブルから検索するため、
条件文で使うカラムは必ずグループ化されたテーブルのカラムを使います。
実践編はここまで!
お疲れ様でした。