データベース・プログラミング入門へ戻る 

 SQL

 時代が進むとありがたい、と思えることの一つに、インターフェースの統一がある。リレーショナル・データベース(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日 岡田好一