ProgateでSQLを学習してみた(2)
SQL学習の続き
・WHEREで条件設定する(レッスン1)
・比較演算子、LIKE、NOT、NULL・IS NOT NULL,AND・OR(レッスン1)
・ORDER BY、LIMITで加工(レッスン1)
・DISTINCT、四則演算(レッスン2)
・集計関数(SUM、AVG、COUNT,MAX・MIN)(レッスン2)
今回はここから↓
・グループ化(GROUP BY、HAVING) (レッスン2)
・サブクエリ(レッスン3)
・複数テーブルの使用(JOIN、LEFT JOIN)(レッスン3)
グループ化(GROUP BY、HAVING)
グループ化は苦手・・イメージをつかみにくかったんですが
Progateさんで学習するうちに
イメージがつかめてきた!・・気がします
Progateさんの解説だと
「データベース内の同じ日付のデータをグループとしてみましょう」
というのが非常に「グループ」の例えとしてわかりやすかったです
書籍で学習してたときは「種類」でグループ化っていう例えだったので
いきなり「文具」「台所用品」「洗面道具」って・・わかりにく!
SELECT SUM(price),日付のカラム
FROM purchases
GROUP BY 日付のカラム; ←日付ごとに買い物の合計金額を表示する
家計簿のイメージ!わかりやすい!
実務だと複数のカラムをグループ化しないといけないけど
基本形として覚えておくと後に助かりそうです
あと、必ずグループ化したカラムもSELECTの後に書くっていうのも
表示したいカラムが多い場合は忘れがちなので肝に銘じます
GROUP BYとWHEREを一緒に使う
GROUP BYを使用するときに条件をつけたい場合があります
そのときは「WHERE」と「HAVING」という句がありますが
データをくくるタイミングによって、どちらを使うか変わってきます
①WHERE文でキャラクターが「○○○」であるレコードを検索する
②日付でグループ化する
③集計関数で集計する
上記が「WHERE」を使ったときの処理の流れです
条件で絞りこんだデータをさらにグループで切り分ける、ということですね
SELECT SUM(price),日付のカラム ←③集計する
FROM purchases
WHERE character_name="○○○" ←①条件でデータを絞る
GROUP BY 日付のカラム; ←②日付でグループ化する
対して「HAVING」の場合は
実行順序によって、WHEREとHAVINGは検索対象に違いがあります。
WHEREはグループ化される前のテーブル全体を検索対象とするのに
対し、HAVINGはGROUP BYによってグループ化されたデータを
検索対象とします
なるほど!
HAVINGはグループ化された後のテーブルから検索するため、
条件文で使うカラムは必ずグループ化されたテーブルのカラムを使う
SELECT SUM(price),character_name
FROM purchases
WHERE category="雑費"
GROUP BY character_name