(積読中)"プログラマのためのSQL"読みました。

※ todo まだ途中。一旦中断。

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版


一通り読み終えたところで、自分の言葉で各章を簡単に紹介しようと思います。

1 データベース VS ファイルシステム(Database versus File Systems)

データベースとファイルの違い、エンティティとテーブルの違い、行とレコードの違い、列とフィールドの違いなど、データベースを理解する上で誤解し易い概念について紹介されています。

2 トランザクションと同時実行制御(Transactions and Concurrency Control)

トランザクションと同時実行制御に関わる、トランザクション分離レベル、スナップショット分離、デッドロック、ライブロックについて紹介されています。

3 スキーマレベルのオブジェクト(Schema Level Objects)

テーブルには属さないスキーマレベルのオブジェクトとしてドメイン、シーケンス、表明、キャラクタセットなどが紹介されています。
また、表明を実装しているDBMSがまだ少ないことから、表明と同じような機能を表明を使わずに実装する方法も紹介されています。

4 ロケータと特別な値(Locationg Data and Special Numbers)

一意の値(ロケータ)と特別な値(素数や一意でランダムな数列など)の紹介と重複行に関する考察が記載されています。
また、欠番のない一意な値が必要な場合にIDENTITYなどの標準機能で実装してしまうと、深刻なパフォーマンス問題が発生する可能性があるため、安易に標準機能で実装しない方が良いとも紹介されています。

5 基底テーブルとそれに関連する要素(Base Table and Related Elements)

テーブルのNULL制約やUNIQUE制約などの制約に関する情報が中心的に紹介されています。関連する要素として、一時テーブルやドメイン、トリガ、プロシージャについても簡単に紹介されています。

6 手続き型プログラミング、半手続き型プログラミング、宣言型プログラミング(Procedural, Semiprocedural, and Declarative Programming)

手続き型プログラミングと宣言型プログラミングの比較の例として、複雑なIF文、CASE文で作られた手続き型のコードをそのパターンを網羅する数列テーブルで解決する宣言型の方法が紹介されています。なお、著者は「IF-THEN-ELSEやWHILE-DOループが使われているコードが手続き型のコード。」と考えられています。
また本章では「凝集度」と「結合度」についても紹介されています。

7 手続き型の遺産(Procedural Constructs)

手続き型の機能である「ストアドプロシジャ」「トリガー」「カーソル」「シーケンス」「生成列」「テーブル関数」について紹介されています。
冒頭でこの中で特に有用なのは「ストアドプロシジャ」と紹介していますが、多くは「カーソル」について紹介されており、また、よくSELECT文で使う「ORDER BY句」も「カーソル」の機能だということです。

8 補助テーブル(Auxiliary Tables)

冒頭で「補助テーブルは、計算ではなく結合によってクエリを助ける役割を果たす。」と紹介し、「数列テーブル」や「参照補助テーブル」など、具体的な補助テーブルの作成・利用方法が紹介されています。

9 正規化(Normalization)

第1~5正規形、基本キー正規形、ボイスコッド正規形、ドメインーキー正規形について紹介されています。
また、非正規化に対する実践的なヒントも紹介されています。

10 数値型(Numeric Data Types)

厳密な数値型(NUMERIC,DECIMAL,INTEGERなど)と近似的な数値型(FLOAT,REAL,DOUBLE PRECISIONなど)の紹介と、それらの型を計算やキャストした際に発生する誤差について紹介されています。

11 時間型(Temporal Date Types)

DateTime型の紹介ではなく、時間に関する歴史的背景やタイムゾーンサマータイムなどの時間型の複雑な箇所について紹介されています。

12 文字列型(Character Data Types)

SQLにおける文字列型の問題点、文字列型の関数、照合順序、氏名に関する問題について紹介されています。

13 NULL:SQLにおける失われたデータ(NULLs:Missing Data in SQL)

値でも変数でもないNULLは複数の意味(未知、適用不要など)を含んでおり、利点よりも欠点の方が大きいため使用すべきはないと紹介されています。

14 複数列のデータ要素(Multiple Column Data Elements)

データ要素が原始的であるという概念は、データ要素がテーブルにおいて単一の列で表現されるという意味ではなく、それ以上に独立した有意味な部分に分割できないということであり、2つ以上の列に分けて管理するのは表記上の問題であると紹介されています。
具体例としてIPアドレスや米国の社会保障番号が紹介されています。

15 テーブルの操作(Table Operations)

DELETE FROM文、INSERT INTO文、UPDATE文、MERGE文について紹介されています。

16 比較演算子またはシータ演算子(Comparison or Theta Operators)

プログラマが比較演算子と呼ぶものは、SQLではシータ演算子とも呼びます。
シータ演算子はスカラ値にとどまらず行式にまで適用できるように一般化されていることと、冗長だが有用なシータ演算子としてIS NOT DISTINCT FROMについて紹介されています。

17 評価述語(Valued Predicates)

IS NULL、IS {TRUE|FALSE|UNKNOWN}述語、IS NORMALIZED述語について紹介されています。

18 CASE式(CASE Expressions)

プログラマにとってもオプティマイザにとっても有用なCASE式について紹介されています。

19 LIKE述語とSIMILAR TO述語(LIKE and SIMILAR TO Predicates)

_ と * を使用できるLIKE述語と、SQLでの正規表現であるSIMILAR TO述語について紹介されています。

20 BETWEEN述語とOVERLAPS述語(BETWEEN and OVERLAPS Predicates)

オプティマイザにとっても有用な(ツリーインデックスが使われる場合に限る)BETWEEN述語と、実装ではまだ利用できない時間の期間を表現するOVERLAPS述語について紹介されています。

21 [NOT]IN述語(The [NOT] IN() Predicate)

[NOT]IN述語を他の述語や演算で置き換えたり、その反対を行う方法や、その置き換えによりパフォーマンスにどのような影響を与えるか紹介されています。

22 EXISTS述語(EXISTS() Predicate)

SQLの中では少ない2値述語であるEXISTS述語について紹介されています。2値述語とはUNKNOWNを返すことがなく、TRUE/FALSEしか返すない述語です。
また、一般的にEXISTS述語はIN述語よりも高速であると紹介されています。

23 量化子とサブクエリ述語(Quantified Subquery Predicate)

ANY述語、SOME述語(ANYと同じ)、ALL述語、UNIQUE述語について紹介されています。
量化子にはANYまたはSOMEを使います。

24 単純なSELECT文(The Simple SELECT Statement)

SELECT文の実行順序を中心に紹介されています。実行順序は以下の通りです。
0.WITH句
1.FROM句
2.WHERE句
3.GROUP BY句
4.HAVING句
5.SELECT句

25 高度なSELECT文(Advanced SELECT Statements)

相関サブクエリや結合を用いたSELECT文について紹介されています。

26 仮想テーブル:ビュー、導出テーブル、共通表式、マテリアライズドクエリテーブル(Virtual Tables:VIEWs,Derived Tables,CTEs and MQTs)

ビューについて詳細に紹介されています。その他の一時テーブル、導出テーブル、共通表式、再帰的な共通表式、マテリアライズドクエリテーブルについては簡単に紹介されています。