株式会社リゾーム 技術部 システム開発 第1グループの岩﨑です。今回は「スッキリわかるSQL入門」読書会の第5回のレポートです。
過去のレポートはこちらからご覧いただけます。
「スッキリわかるSQL入門」読書会レポート vol.1 - リゾームのテックブログ
「スッキリわかるSQL入門」読書会レポート vol.2 - リゾームのテックブログ
「スッキリわかるSQL入門」読書会レポート vol. 3 - リゾームのテックブログ
「スッキリわかるSQL入門」読書会レポート vol. 4 - リゾームのテックブログ
読書会の題材
前回に引き続き「スッキリわかるSQL入門」を題材としています。
5回目レポート
5回目は第6章「集計とグループ化」のレポートになります。参加者は6名でした。
それぞれの感想・意見交換
データを集計する
- 集計関数はすべての行をひとまとめに処理して、結果は必ず1行になる
- 単純に平均の計算とか合計値を手計算する場合も結果は必ずひとつの値で出るため、集計関数の結果は必ず1行になるのも納得
- すべての行に対して集計を行うので、集計対象などの指定がある場合はWHERE句で絞り込みをしないといけない
- 「○○する関数ってないのかな?」とExcelと同じような発想で考えて調べることができるので、心理的なハードルは低い
- 同じようにSELECTの中に関数呼び出しを書いても、関数の種類によって動きが変わってくるというのは、改めて考えると特殊だ
集計関数の使い方
- SUM, MAX, MIN, AVG, COUNT等の関数はよく使う
- COUNT関数以外はほとんど使ったことがない。使っているSQL文を見るぐらい
- COUNT関数はデータ抽出する際に抽出数を把握するために使ったりする
- Excelでも使うような関数ばかりだったので覚えやすかった
- 普段
COUNT(*)
ばかり使っていることもあり、COUNT(列)
では指定した列がNULLの行は無視される仕様は知らなかった
集計に関する4つの注意点
- 集計関数の引数やNULLに関する取り扱いについての理解が曖昧だった
- 集計にNULLが含まれる場合の挙動は毎回不安になって調べてしまう
- 計算式をSELECTするという発想になじむのに時間がかかった、今はそういうものだと無理やり納得している
- 例えば「合計が~以上」という命令文を考えると、
WHERE SUM(X) > 100
みたいに書きたくなるかもしれない - 結果表がデコボコになって、なんでエラーになるんだろう? みたいな経験は何度かある。GROUP BYを使うときとか
- SQL学び始めの頃はよくハマっていた
- MAX関数やMIN関数は文字列を指定しても使えることを少し前に知って驚いた
- 前章ではCOALESCEはISNULLで対応することの方が多そうという意見もあったが、たしかにCOALESCE関数だとISNULL関数よりも綺麗に記述できているような気もする
データをグループに分ける
- 業務内容によって、GROUP BYやHAVINGを使う機会が異なっている
- 「期間内のデータを、各ショップや会員が属する区分ごとに集計」という場面がすごく多いので、GROUP BYはおなじみ、というかこれなしではテストできない
- GROUP BY内のカラムとSELECT内のカラムをそろえ忘れてエラーにしてしまうことが多かった
- グループ集計の流れは今まで何となく理解していた状態だったのが今回、明確になった
- HAVINGは使い慣れていなくてWHEREと混同してしまいがちなので覚えていきたい
- 集計前の条件がWHEREで、集計後の条件がHAVING
- 集計結果は処理の流れ的にWHEREでは絞り込めないため、HAVINGを使う必要がある
- 最初HAVING句を知らなくて苦労した記憶がある……
集計テーブルの活用
- PostgreSQLではマテリアライズドビュー(マテビュー)という機能を使って集計テーブルを実現できる
- マテビューは実体を持たない通常のビューとは異なり、処理結果を保持しているため再検索なしで繰り返し参照できる。また、リフレッシュすることで最新の状態に更新が可能
- 最終的な結果を見るテストの立場ではあまり気にしたことがないかも……。とはいえ、知識としては持っておきたい
- 扱うデータの種類や規模によって、集計テーブルの更新頻度を調整するのが重要だと思った
- 頻度が高すぎると負荷がかかるし、低すぎると集計結果が古くなってしまうので難しそう
- 大規模な分析が必要なシステムだと複雑になったりしてメンテナンスが大変
まとめ
本章の内容はもちろん、前章で学んだ内容を振り返りつつ話し合いができたと思います。また今回もチームや業務内容が異なると、使用する関数等に違いがあることがわかりました。私自身SQLの学習を始めて1年ですが、未だにGROUP BYなどを使う際には混乱することが多いため、本章で学習した内容を活かして今後の業務を行っていきたいと思います。 次回は第7章「副問い合わせ」です。