2010年01月13日

 SQLは何に対してアクセスするのか




現在普通に使われているデーターベースは、リレーショナルデーターベースです。
もう当たり前のように SQL が使われて、その目的が見えにくいかもしれません。

昔から、データをコンピュータから取り出す単位は「レコード」と呼ばれるもので、
それが SQL で言うところの「行」になります。昔、「レコード」とはある長さを持った
バイナリデータのひとかたまりで、それをいくつかの部屋に分けて「フィールド」
と呼ばれる単位にして分割して利用していました。

それは、レコードレイアウトという書式で厳密に1バイトづつ定義して使うのです。
そして、それをメモリ上に割り振るように言語で定義し、プログラマが個別のフィールド
にアクセスできるようにしていました。ですから、レコード=>メモリ=>フィールドと
言う順序で転送され、フィールドにはプログラムから使える「名前」が付きます。
いわゆる、「変数」というものです。

それに対して、SQLが最初にアクセスするのは、データベースそのものです。
まず、データベースという広大な空間に対して「名前の付いた表」で必要なデータ
を分類します。そのままではまだ、「レコード」には到達していません。昔で言う
ところの「ファイル」というレコードの集合体にあたります。

次に、レコードを取得する為に条件を設定します。その際に、「列」という概念
を使って条件を設定します。これは、昔で言うところの「フィールド」にあたります。

昔と全く違うのは、「ファイル」という集合体はこれもバイナリデータの集合で、
それを管理しているOSは、フィールドの存在を知りません。ですから、どの位置
からどれだけという単位でデータを転送します。

フィールドはプログラマが勝手に付けた区切りにすぎません。ところが、データ
ベースでは、「名前の付いた表」を作成する段階で、「列」というデータの単位を
定義します。当然全てのデータに対するアクセスは、この「列」が基本になるわけです。

そこで、SQLは、「列」を使ってデータの集合体を「行」という、昔で言うところの
「レコード」という単位で処理します。ある列に保存されているデータが「山田」
である行が欲しい。というような要求を SQL で表現するわけです。

実は、ここまでがデーターベースの仕事で、メモリ上に「山田」に関するデータの
集合ができあがります。しかも、それはきっちり「行」という概念でグループ化され
でいるので、順番に取り出す事ができます。一つの行でよければ、最初からそう
いう条件を設定する必要があります。

そして、一つの「行」は複数の「名前の付いた列」で管理され、殆どの場合が
プログラムに渡る前に「言語」のレベルで自動的にそれぞれが「変数」として定義
され、プログラマがアクセス可能になるわけです。

これが、「読み出す」という処理の全体像です。「書き出す」場合は少し違うので
注意が必要です。

結局、イメージするのは、Excel のシートの「表」と同じものです。「セル」という
データ格納の基本単位に対して「行」と「列」で特定して処理を行います。