時代が進むとありがたい、と思えることの一つに、インターフェースの統一がある。リレーショナル・データベース(RDB)の普及と時期を同じくして出現したデータベース問い合わせ言語SQL(Structured
Query Language)もその一つで、RDBの功績と言って良いであろう。
SQLはデータベースの共通言語の性格があり、RDBでなくても使えるのだが、RDBのテーブルで説明すると分かりやすいので、以下、RDBの用語で説明する。
● コネクションとレコードセット
SQLは、以下のような記述である。
SELECT SID, GEN, DOB FROM KAIIN
WHERE NAMAE LIKE '山田%'
ORDER BY DOB DESC
文の意味は、「KAIINテーブルから、フィールドSID, GEN, DOBを抜き出した表を作る。ただし、NAMAE欄の内容が『山田』で始まっている行だけを選び、DOBの降順の表にする」、である。
見やすいように行分けしているが、一行にまとめても良い。さて、誰がこの文字列を発信するのか。もちろん、人間がキーボードから直接打ち込むことが、まれにあるかもしれない。
しかし、通常、この文字列を発信するのはプログラムである。BASICやCやCOBOLで書かれたプログラムが、データベースシステム(DBMS)に対して、上述のようなSQL文字列を発行する。
ということは、プログラム(BASIC等)とプログラム(RDB等)が通信しないといけない。これが便利なことに、ODBCなど、今ではネットワーク上で自由な組み合わせで通信できる。インターネットでも良いし、ダイヤルアップの電話線でもいいし、通信衛星だって使える。このような末端のプログラム(BASIC等)と中央のプログラム(RDB等)を結びつけるソフトウェアをミドルウェアという。
例として、Visual BASIC(末端)(ADO利用)とAccess(中央)の組み合わせでは、通信にConnectionと呼ばれるオブジェクト変数を利用する。ConnectionのOpenメソッドで通信先を指定し、接続する。SQL文字列は、開いたConnectionに対して発行し、Visual BASICでは次に述べるRecordset変数のOpenメソッドを使う。
上述のSQLによる問い合わせで得られるのは表なので(テーブル全体のこともある)、表を扱う仕組みがBASIC側に必要である。RDBにはカーソルと呼ばれる機能があって、一行ずつのデータ(レコード)を送ってくれる。
Visual BASIC側ではRecordsetと呼ばれるオブジェクト変数を利用する。このレコードセット変数は一回に一つのレコードを指していて、プロパティを指定すると、そのレコード内のフィールドの内容を参照することができる。テーブルが相手の場合、代入も可能である。次のレコードを指させるには、Nextメソッドを使う。
コネクションやレコードセットはSQLと違って標準化されていない。しかし、どの言語でどのデータベースを利用するにしても、SQLを利用するのなら、同様の仕組みが用意されているはずである。
使用頻度としては、上述のSELECT文が圧倒的であり、内容も多彩であるので、別項で解説する。
● レコードの挿入
データをテーブルに付け加える(レコードの挿入)ために、SQLにはINSERT VALUES文が用意されている。以下のようなものである。
INSERT INTO KAIIN
(SID, NAMAE, GEN, DOB, SYOKU)
VALUES ('E02005', '木村 秀人', 'M', #1990/3/5#,
'SY033')
多分、ACCESS等を端末とし、ODBCを通じてデータベースに接続してデータを追加する場合には、内部的にはINSERT文が使われているのだと思う。
ところが、私は二種のSQLシステムをプログラミングに使用しているのだが、どちらも陽にINSERT文を使ってはいない。上述のAccessとVisual
BASICの場合は、レコードセットのAddNewメソッドでテーブルに一レコード用意してからフィールドに値を設定する。もう一つのデータベースでも、同様の手技でレコードを追加している。
● レコードの削除
SQLのDELETE文を使用する。形としては、
DELETE FROM KAIIN
WHERE SID = 'E02003'
のような感じとなる。レコードセットではなく、コネクションのExecuteメソッドを使う。
SELECT文で選択されたレコードをレコードセットのDeleteメソッドで、一レコードずつ削除してもよい。
● レコードの更新
SQLにはUPDATE文が用意されている。以下のようなものである。
UPDATE KAIIN
SET NAMAE = '木村 英人', SYOKU = 'SY032'
WHERE SID = 'E02005'
これも内部的には使われていると思う。
プログラムではSELECT文で選択されたレコードセットを使い、一レコードずつ更新する。
2002年11月13日 岡田好一