達人に学ぶSQL徹底指南書 第2版 要点メモ
に投稿
技術
アフィリエイトリンクを含みます
要点メモ
- CASE式を使うと○☓表などを作れる
- ウィンドウ関数を使うと手続き型のループ処理のようなことが出来る。例えば、ループしてる行の一つ前の行を参照したりといった行間の比較も出来る。元々SQLは行の順序やアドレス(ポインタ)、ループ処理を排除する考えで成り立っている、それによって使い勝手がよくここまで広まったと考えられる。ウィンドウ関数はそれによって抜け落ちた手続き型の処理をできるようにしたもの。
- ウィンドウ関数のほうが相関サブクエリよりも可読性も性能も良い。
- 「PARTITION BY = GROUP BY – 集約」とシンプルに覚えておく。GROUP BYは分割後に集約して一行にまとめる操作が入る、違いはこれだけ。
- 自己結合で集計処理ができる
- 普通のプログラミング言語では真理値はtrue, falseの2値だが、SQLではそれに加えてunknownという第3の値がある。これを3値論理という。その答えはNULLにある。
- NULLについての議論では2種類に分けて考えられている。「未知(Unknown)」「適用不能(Not Applicable, Inapplicable)」。E.F.コッドはさらにNULLを細かく分類していたが、一般的な支持は得られなかったため、DBMSは3値論理を採用している。
- column = NULLという条件はいかなる場合もunknownと評価される。だからIS NULLと書く必要がある。
- NULLはインデックスが効かなかったり、条件判定のDBMS間誤差があったりするのでできるだけ使わないようにするべき
- ALL述語とANY述語
HAVING句でCOUNT MAX MIN関数などを使うと集合の性質を調べることが出来る - WHERE句が集合の要素の性質を調べる道具であるのに対し、HAVING句は集合自信の性質を調べる道具である。
- 実体1つに付き1行が対応している → 要素なのでWHERE句を使う
- 実体1つに付き複数行が対応している → 集合なのでWHERE句を使う
- 重複がないことがわかっている場合ALLオプションを付けると重複排除のための暗黙のソートが行われないのでパフォーマンスが良くなる
- サブクエリを引数に取る場合、INよりEXISTSのほうがパフォーマンスが良い
- DISTINCTをEXISTSで代用すると性能UP
- MIN、MAXの引数はインデックスの列にすると性能UP
- 暗黙の型変換があるとインデックスが使用不可になる
- SQLのコメントは– と/* */がある
- SQLは手続き型言語ほどコードで語れないのでコメントを書くべき
- FROM句に複数テーブルを書く結合構文で書くと、結合条件を書き忘れてうっかりクロス結合をしてしまうリスクがあるのでINNER JOINで書いたほうがいい。ONがないとエラーになるので書き忘れ防止になる
- SELECTから書かずにFROMから書く。SQLの実行順序はFROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY。ボトムアップ・アプローチのアナロジー。
- SQLは行の位置(配列の添字のようなものやアドレス、ポインタ)を意識しないでいいのが画期的
- テーブルはファイルよりも抽象度が高い。どこに保存されているかを意識しないでいい。
- J.セルコ「箱と矢印を描くな、円を描け」手続き型はDFD、SQL(集合思考)はベン図。ブルース・リー「Don’t think, feel」
感想
「へー、そうなんだぁ、知らなかったぁー」ってことがたくさん学べた。
ウインドウ関数は、概要は理解したけど、なるほどわからんでもあったので、実際に使うケースに出会わないとなかなか理解出来なさそうな気がしている。
あと、SQLには行の位置を意識しないでいいようにするという思想が根底にあることを知り、なるほどなと思った。やっぱり大きく広がっていくもの、普及していくものって根底にある思想が大事なんだなと。