SQLの基本的な考え方

達人に学ぶSQL徹底指南書を読みました。

達人に学ぶDB徹底指南書も読んだんですが、順序を間違いました。
 
DB徹底指南書に関してはデータベースに関する一般的内容、SQLはより具体的な内容となっているのでDBから先に読むべきです。
 
読んだ内容の振り返りアウトプットです。
 
RDBの特徴
ポインタが存在せず、人間にわかりやすい名前をつけた(アドレスの存在をなくしたため)
NULLの存在
宣言型
テーブルを集合という抽象度の高い存在とみなす
RDBの基礎理論として集合論と述語論理
 
1-1 case式
単純case式と検索case式がある。(検索case式はkeyみたいなやつ)
SQLで条件分岐に使う(データ型は統一)
case式ではwhen句が見つかった時点で終了
else句と end を忘れない
式の評価ができる
 
1-2自己結合
同一テーブルを対象に行う結合を自己結合
順序対と非順序対
<,<>,>で行う結合を非等値結合(文字型に対しても使える)
重複行はNULLと同じくらいRDBの世界では嫌われる
自己非等値結合は部分的に不一致なキーの検索で威力発揮
 
1-3 NULL
SQLではtrue false の他にunknown (nullの存在により)
= NULLではなく IS NULL (NULLは値でも変数でもないから)
true or unkown なら結果はtrue
 
1-4having句
グループ化されたデータを検索(group byされた集合に対して行うのが一般的)
 
1-5外部結合
積集合(INTERSECT) AかつB
和集合(UNION)AまたはB
差集合 AかつBでない or BかつAでない
排他的和集合 AまたはBかつAかつBでない集合
 
1-6相関サブクエリ
異なる行の比較
SQLでフォーマット形成は不向き(結果の形成は他言語で)
相関サブクエリは強力な演算だが、可読性とパフォーマンスが落ちるのがデメリット
 
1-7SQLで集合演算
ALLオプションで重複行に対応
INTERSECTはUNIONとEXCEPTより先に実行される
集合演算子DBMSごとに使えるか使えないか、ばらつきがある
 
1-8EXISTS述語の使い方
量化(quantification)を表現
テーブルの1行が1つの命題(命題の集合と言える)
述語は戻り値が真偽値になる関数
exists述語は1行を入力する他の述語と違って行の集合を入力する
NOT EXISTで存在するか否かを判別
 
1-9SQLで数列を扱う
RDBのデータ構造には順序という概念がない
 
1-10having句
集合自身の性質を調べる
ダブりを認める多重集合
having句を使えば複雑な条件を集合に設定できる
 
1-11SQLを早くする
効率のいい検索を利用するためIN述語の使い方を見直す(EXISTに変えるなど)
ソートを回避。 ALLオプションをうまく使う
SQL極値関数 MAX MIN
 
1-12 SQLプログラミング作法
列とは属性
可読性を向上させるためにインデント、スペース、大文字小文字
ワイルドカードとORDER BYは使わない
FROM,WHER,GROUP BY, HAVING, SELECTの順に記述する
 
2 RDBの世界
E.F.コッドが作った(関係計算、関係代数、述語論理)
初めてデータを命題と見立てた
以前はデータの格納位置をユーザが意識する必要があった
ポインタの追放
表ではなく関係(relational)としたことで複合的に一つの値としてみなすことができる
ポインタ操作をユーザーがする必要がない
変数を使わないのでアドレスの煩雑さを取り除くことができた。
GROUP BY, PARTITION BYは各メンバーをチームに割り当てる関数
SQLにループは存在しない。
SQL的考えを身につけるにはHAVING句のマスターが近道
再帰集合
人のために3値論理が用いられたが、現在はそれがあだとなっている。
NULLは悪だが、完全排除不可