目次
第1部 魔法のSQL
1 CASE式のススメ SQLで条件分岐を表現する
[導入]CASE式の構文
既存のコード体系を新しい体系に変換して集計する
異なる条件の集計を1つのSQLで行う
CHECK制約で複数の列の条件関係を定義する
条件を分岐させたUPDATE
テーブル同士のマッチング
CASE式の中で集約関数を使う
2 必ずわかるウィンドウ関数 順序を使ったプログラミングの復活
ウィンドウとは何か?
1枚でわかるウィンドウ関数
フレーム句を使って違う行を自分の行に持ってくる
ウィンドウ関数の内部動作
3 自己結合の使い方 物理から論理への跳躍
重複順列・順列・組み合わせ
重複行を削除する
部分的に不一致なキーの検索
4 3値論理とNULL SQLの甘い罠
本題に入る前に
理論編
実践編
5 EXISTS述語の使い方 SQLの中の述語論理
理論編
実践編
6 HAVING句の力 世界を集合として見る
データの歯抜けを探す
HAVING句でサブクエリ-最頻値を求める
NULLを含まない集合を探す
HAVING句で全称量化
一意集合と多重集合
関係除算でバスケット解析
7 ウィンドウ関数で行間比較を行う さらば相関サブクエリ
成長・後退・現状維持
時系列に歯抜けがある場合ー直近と比較
ウィンドウ関数vs.相関サブクエリ
オーバートラップする期間を調べる
8 外部結合の使い方 SQLの弱点ーその傾向と対策
外部結合で行列変換:その1(行→列)ークロス表を作る
外部結合で行列変換:その2(列→行)ー繰り返し項目を1列にまとめる
クロス表で入れ子の表側を作る
掛け算としての結合
完全外部結合
外部結合で集合演算
外部結合で差集合を求める AーB
外部結合で差集合を求める BーA
完全外部結合で排他的和集合を求める
9 SQLで集合演算 SQLと集合論
導入ー集合演算に関するいくつかの注意点
テーブル同士のコンペアー集合の相当性チェック[基本編]
テーブル同士のコンペアー集合の相当性チェック[応用編]
差集合で関係除算を表現する
等しい部分集合を見つける
重複行を削除する高速クエリ
10 SQLで数列を扱う SQLで順序を扱うー集大成
連番を作ろう
欠番を全部求める
3人なんですけど、座れますか?
折り返しのある数列
単調増加と単調減少
11 SQLを早くするぞ お手軽SQLパフォーマンスチューニング
効率の良い検索を利用する
ソートを回避する
極地関数(MAX /MIN)でインデックスを使う
WHERE句で書ける条件はHAVING句には書かない
そのインデックス、本当に使われてますか?
中間テーブルを減らせ
12 SQLプログラミング作法 宗教戦争をこえて
テーブル設計
コーディングの指針
大文字と小文字
第2部 リレーショナルデータベースの世界
13 RDB近現代史 データベースに破壊的イノベーションは二度起きるか?
リレーショナルデータベースの歴史
破壊的イノベーションは繰り返すか?
NoSQLの種類と解決策
パフォーマンス問題の解決
14 なぜ“関係”モデルという名前なの? なぜ“表”モデルという名前ではないのか?
関係の定義
定義域の憂鬱
関係値と関係変数
関係と関係は可能か?
15 関係に始まり関係に終わる 閉じた世界の幸せについて
演算から見た集合
実践と原理
16 アドレス、この巨大な怪物 なぜリレーショナルデータベースにポインタがないのか?
関係モデルはアドレスから自由になるために生まれた
プログラミングに氾濫するアドレス
去り行かない老兵ーバッカスの夢
17 順序をめぐる冒険 SQLのセントラルドグマ
遅れてきた主役
行に順序はあるべきか?
18 GROUP BYとPARTITION BY 類は友を呼ぶ
その違いわかりますか?
19 手続き型から宣言型・集合指向へ頭を切り替える7箇条 円を描く
1.IF文やCASE文は、CASE式で置き換える。SQLはむしろ関数型言語と考え方が近い
2.ループはGROUP BY句とウィンドウ関数で置き換える
3.テーブルの行に順序はない
4.テーブルを集合と見なそう
5.EXISTS述語と「量化」の概念を理解しよう
6.HAVING句の真価を学ぶ
7.四角を描くな、円を描け
20 神のいない論理 論理学の歴史をちょっとだけ
汝、場合により命題の真偽を捨てよ
論理学の革命
人間のための論理
21 SQLと再帰集合 SQLと集合論の深い仲
実務の中の再帰集合
ノイマンの先輩たち
数とは何か?
SQLの魔術と科学
22 NULL撲滅委員会 万国のDBエンジニア、団結せよ!
決意表明〜スベテノ DBエンジニア ニ 告グ〜
なぜNULLがそんなに悪いのか?
しかしNULLを完全に排除することはできない
コードの場合ー未コード化用コードを割り振る
名前の場合ー「名無しの権兵衛」を割り振る
数値の場合ー0で代替する
日付の場合ー最大値・最小値で代替する
指針のまとめ
23 SQLにおける存在の階層 厳しき格差社会
述語理論における階層、集合論における階層
なぜ集約すると、もとのテーブルの列を参照できなくなるのか?
単元集合も立派な集合です!
第3部 付録