図5●データベースを利用する三つの場面
データベースを使ったアプリケーションを開発する時点で,データベースを定義したり,アプリケーションで使うクエリーを開発したりする。一度運用が始まってしまえば,開発済みのクエリーを使ってデータを操作したり,更新したりする。ただしデータベースの利用場面はこれだけではなく,データをさまざまな形で分析する場面もある。このとき,既存のクエリーを使うだけでなく,アドホックにクエリーを記述して操作する場面もある。
リスト2●テーブルの定義
テーブル名とフィールド名,およびそのデータ型を指定する。
リスト3●ビューの定義
クエリーに名前を付けて保存する,といった形になる。
図6●アクション・クエリー
基本は更新(a),追加(b),削除(c)の三つ。これにクエリー結果の保存を合わせたものがアクション・クエリーと呼ばれている。

データベースの利用場面は大きく三つ

 データベースの操作は,大きく三つに分けられる(図5[拡大表示] )。まずデータベースの定義。これは開発時に独特の作業となる。さらに開発時には,実際のシステム運用に使うクエリーを開発したり,ダミーのデータを定義しておくなどの作業が発生する。クエリーは一発で開発できるとは限らない。何度かアドホックにクエリーを作成して,実際に操作をして試していく。試してこれでOKとなれば,データベースに保存してストアド・プロシジャにしてもいい。

 運用段階で見ると,大きく二つの利用場面がある。データの保守・管理と分析である。業務アプリケーションの場合,もっぱら保守・管理の側面が強調されるが,必ずしもそれだけで完了ではない。保守・管理に関しては,データを検索するだけでなく,データの追加や更新,削除などが求められる。一方,分析ではもっぱら検索していろいろな観点から評価するのが目的である。保守・管理ではそれほど複雑なクエリーは発生しないが,定型的に同じ処理を繰り返す。後述するアクション・クエリーを使うのもこの場面である。逆に分析する場合には複雑なクエリーを作らなければならないこともある。不定形であるぶん,個別のアプリケーションにあらかじめ組み込んでおくのは難しい場合もある。この場合には前述のクエリーの優先順位などに配慮できるよう,フロントエンドのツールを使った方が便利だ。

すべての場面でSQLが利用できる

 SQLはこういったデータベース操作のすべての場面で利用できる。分析や保守・管理のためにデータベースに問い合わせる場合には,前述のSELECT文が活躍する。それ以外に,「データ定義」と「アクション・クエリー」が用意されている。

 データ定義は,もちろんデータベースの定義をするためのものだ(リスト2[拡大表示])。テーブルを定義する「Create Table」と,テーブルをある視点から見て作った仮想テーブルである「ビュー」を定義する「Create View」がその主体である。データベース定義の基本となるのは前回述べた正規化であり,適切なデータ型とフィールド名を関連づけておくものである。もう一つのビューは,データの分析時に役立つものだ。これにより,テーブルの独立性を維持しながら,さまざまな視点から分析できる。またビューはデータを更新できないので,間違ってデータを壊してしまう危険性を減らせる。ビューの定義自体は,基本的にクエリーと同じである(リスト3[拡大表示])。それに名前を付けておくだけだ。

 一方データの追加や更新に使うものが,アクション・クエリーだ注1)。ちょっと考えればわかるように,更新,追加,削除があれば一通りのことができる(図6[拡大表示])。SQLではさらに,条件に合致したレコード集合からテーブルの実体を作成する「SELECT INTO」文も用意されている。

 ここでアクション・クエリーを見ても,個々のレコードを操作する方法がないと疑問に思われるかもしれない。例えばAccessが用意しているSQLでは,こういった処理は対応できない。開発用の言語であるVisual Basicを使ってデータベースを操作することになる。

 一般的にまともなSQLデータベースであれば,「カーソル」を用意している。カーソルはビューと同じようにSELECT文と関連づけられている。SELECT文に対応したカーソルを定義しておき,そのカーソルを開く(OPEN)と利用可能になる。「FETCH」などの命令を発効すると,個々のレコードに格納されたデータの値が取り出せる。

 カーソルは,JavaやC,C++など通常のプログラミング言語で操作する場合に便利なものだ。元々カーソルは,SQLを呼び出すプログラミング言語(ホスト言語)から利用するときに便利なものとして作られた。SQLが基本的にレコード集合を単位として処理を考えるのに対し,プログラミング言語は手続き的で,集合を単位とした処理は記述しにくい。逆に行を単位として一つずつ取り出し,それに個別の処理を施していくのは記述しやすい。この違いがSQLを理解しにくくしているのかもしれない。これらの間を媒介する役割を担うのがカーソルである。

「SQLを使いこなせればデータベースは結構何とかなるもんだね」
「そうですね。でもまだカベは高いというのが正直な感想です」
「性能を考えて正規化を崩したり,ストアド・プロシジャを併用したり,いろいろまだ勉強することはあるよ」
「Javaや.NETのプログラムが動くんでしたっけ」
「そう。こうなると,データベースというよりも広範囲のプログラミング・スキルが必要かもな」

(北郷 達郎、八木 玲子)