はじめに
「プログラマのためのSQL」を頑張って読んでいこうと思います。
第1章は「データベースとファイルシステムは何が違うのか」
言われれば当たり前な内容なのですが、
SQLを正しく理解するにあたってまず理解しておかなければならないことだと思います。
第1章の構成として、
「ファイルでは〇〇だがテーブルは△△だ」
のような論調が続くのですが、それぞれ分けてまとめてみました。
ファイルとデータベースの違い
ざっくり言うと、
- ファイルは物理的なデータ
- データベースのテーブルは「集合」という論理的なデータ
です。
そのため、以下のように特徴が全く異ります。
ファイル
- 紙を元にした概念なので非常に物理的な存在である
- 物理的配置によってアクセスされる一連のレコード群である
- ファイルシステムが物理ドライブにマウントされた時に名前が割り当てられる
- アプリケーションが読み込むことで初めてレコードやフィールドに意味を持つことができる
- アプリはファイルをオープンし1行ずつレコードを読み込みEOFまで読んだらクローズする
- アプリがアクセスする際はファイル毎に接続が必要である
- レコードはシーケンシャルで順序を持ち、その順番に意味がある
- 整合性やデフォルト値を持たない
- 他ファイルとの相互の関連は定義されない
- 整合性や関連はアプリケーション側で意味を持たせる必要がある
- 受動的であり、アプリケーションから変更を全て受け入れる
- 物理的なのでNULLという概念がない
データベース
- 集合としてのデータであり、論理的な存在である
- SQLはスキーマ単位で操作を行う
- データベースへのアクセスもスキーマ単位である
- スキーマ内に同じ名前のテーブルは定義できない
- テーブルはスキーマの一部の集合に過ぎないので論理的である
- 同じ集合に含まれる要素(テーブルの行)はどれも構成である
- テーブルの行は順序を持たない(ORDER BY句があるが、あれはSQLの一部ではない)
- 順序を持たないため、集合に対して操作を行う場合、全要素に対して一度に行われる
- テーブルは0以上の行の集合であり論理的である
- 行は1つ以上の列の集合であり論理的である
- 列は論理的な存在なのでNULLが存在し得る
- テーブルはデータベース内に定義された時点で初めから名前を持っている
- 行も列もスキーマの中で定義された段階で意味を持つ
- 整合性やデフォルト値を定義できる
- トリガーや制約によって、能動的にデータの整合性を保とうとする
- アクセスする際に物理的配置を気にする必要がない
その他
SQLと、他の手続き型言語との違い
- 通常、手続き型言語は何回実行しても同じ結果になる
- SQLは実行するたびに実行プランが変わる可能性がある
SQLにおける集合と、一般的な集合論との違い
- 数学の集合論では空集合は1つしか存在しない
- SQLではテーブル毎に構造が異なるので別の空として扱われる
まとめ
上記を意識しているだけでもSQLに対する見方が少し変わりそうです。
ここを理解していると、今後SQLを本格的に学ぶ上で納得しやすくなるのかなと思います。
「ファイルのフィールドは受動的、テーブルの列は能動的」という表現が印象的でした。
かなり端的にまとめたので、意味が分からなかったらぜひ本書を読んでみてください。