自分なりに所感とまとめ。
構成
- 1部がSQLのサンプルケースと使い方について
- 2部が歴史や背景・概念などについて
- 3部が1部の演習問題の解答、参考文献
と言った形になっています。
お忙しい人は1部のサンプルケースをつまみ食いして読むのも良いかも。
個人的に参考になったところ
再認識させられたところやなるほどな~となったところを抜粋。
- CASE式はELSEを必ず書こう
- MySQLでSELECT句とGROUP BY句に同じCASE式を書かなければいけない場合、SELECT句のCASE式部分に別名を付けて別名をGROUP BY句で指定する
- CASE式はどこにでも書ける
- ウィンドウ関数のフレーム句で異なる行のデータを1つの行に持ってこれる=行間比較が容易になる
- NULLは値でも変数でもない
- NOT INのサブクエリで使用されるテーブルの選択列にNULLが存在=SQL全体の結果は常に空
- テーブルはファイルではない。行も順序を持たない。そのためSQLでは"原則"ソートを記述しない。
- ソートを回避する
- 余計な中間テーブルを減らす
- レコード数を絞れる条件は早い段階で記述する
- 読みにくいコードは何物も、誰も解決してくれない
- NULLの撲滅、NULLを入れず、値で代用して設計できないか考慮する
所感
- 著者のCASE式とEXISTS句推しにとても熱意を感じた
- 1-6のHAVING句の章では連番の歯抜けを探すなど遡及の対象となるようなレコードの探し方が細かく紹介されており、とても参考になると思う
- ウィンドウ関数は業務でも使用してみたいけど、業務で使用してる現行システムのMySQLのバージョンは8.0じゃないよ~;;って人結構居そう
- EXISTS句を速いと紹介しているが、相関サブクエリを用いるので一概にそうとは言えないと思うと感じた
- 相関サブクエリ:サブクエリ内でメインのクエリを参照しているクエリのこと
- EXISTS句で「メインクエリで参照するレコードの数」×「サブクエリで参照するレコードの数」だけ比較するわけなので、テーブルによっては膨大な時間が掛かることになる
- 詰まったときのヒントとして手元に置いておく、繰り返し読み返して心掛けるなどすると大いに活用できると思う