初めに
データベースとSQLは現在のデータサイエンスに必須な知識・スキルの1つ。その基礎を
を基に学んできた。
この知識をより昇華させて「SQL中級者になりたい!」ため、同じ著者の
を参考に、更なるSQLの知識を拡充していこう。
1. CASE式
句で
式を用いることで集約単位となるコードや階級を柔軟に設定できる。これは非定形的な集計に有効である。
- 集約関数の中に使うことで行持ちから列持ちへの水平展開も簡単にできる。
- 集約関数を条件式に組み込むことで
句を使わずにクエリをまとめられる。
- 実装依存の関数より表現力が強力かつ汎用性も高まる。
- 以上ができるのは
式が式であるからである。
式を駆使することで複数の
分をつにまとめられ、可読性もパフォーマンスも向上する。
2. ウィンドウ関数
- ウィンドウ関数の「ウィンドウ」は順序を持つ「範囲」の意味である。
- ウィンドウ関数の構文上では
句と
句で特徴づけられたレコード集合を意味し、一般的に簡略的の構文が使われるため、却ってウィンドウの存在を意識しにくい。
句は
句から集約の機能を引いて、カットの機能だけを残し、
句はレコードの順序を付ける。
- フレーム句はカーソルの機能を
の構文に持ち込むことで「カレントレコード」を中心にしたレコード集合の範囲を定義することができる。
- フレーム句を使うことで、異なる行のデータを1つの行に持ってくることができるようになり、行間比較が簡単に行えるようになった。
- ウィンドウ関数の内部動作としては、現在のところ、レコードのソートが行われている。将来的にハッシュが採用される可能性も零ではない。
3. 自己結合
- 自己結合は非等値結合と組み合わせて用いるのが基本である。
と組み合わせると再帰的集合を作ることができる。
- 全くもって異なるテーブルを結合していると考えれば分かりやすい。
4. 3値論理
は値ではない。
- 値ではないので述語も値の陽には適用できない。
- 無理やり適用すると
が生じる。
が論理演算に紛れ込むと
が直観に反する動作をする。
- これらに対処すべく、段落的なステップに分けて
の動作を追うことが有効である。
5. EXISTS述語
6. HAVING句
句の応用方法を見てきた。
句を用いるときには、何を以て集合と見なすかに注目する。何かで集計されたものが複数行で成り立つならばそれを集合と見なせ、そのときには
句が利用できるかを考える。
- テーブルはファイルではなく、行も順序を持たない。そのため
は原則としてソートを記述しない。
- 代わりに
は、求める集合にたどり着くまで次々に集合を作る。
句は過不足なく同値類を作る。
句が集合の要素の性質を調べるものであるのに対し、
句は集合自身の性質を調べるものである。
で検索条件を設定する場合、検索対象が集合なのか集合の要素なのかに応じてそれぞれ
句または
句を用いるかを考える。
7. ウィンドウ関数(再訪)
- 昔は、
で行同士の比較を行う場合、比較対象のテーブルを追加して相関サブクエリを行なっていた。
- しかし相関サブクエリはパフォーマンスと可読性が悪く、
ユーザーから不評だった。
- ウィンドウ関数の登場により、相関サブクエリを使う必要はなくなり、可読性が高くパフォーマンスが改善できた。
8. 外部結合
は帳票作成のための言語ではないため、フォーマット成型には不向きである。
- 必要に迫られた際には外部結合と
式を駆使する。
- 入れ子の表側を作成する際はマスタとなる直積を作ってから結合を一回することで済ませる。
- 行数に着目した場合、結合は「掛け算」として考えることができる。そのため一対多の結合では結果の行数は増えない。
- 外部結合は集合演算と類比的に感がられる。その観点から様々な集合演算を表現できる。
9. SQLでの集合演算
10. SQLでの数列
でのデータの扱い方には2通りである。
- 1つは、順序を無視した集合と見なす方法である。この場合、伝統的な
の集合と述語による考え方に基づいて考える。
- もう1つはおもにウィンドウ関数による直接的な順序の操作による、順序を持った集合と見なす方法である。
で全称文を記述したい場合、存在分の否定に同地変形して、
述語を用いる必要がある。