ステップ1 RDBとSQLの濃い関係を知る

 SQL*1は,ISO(国際標準化機構)とANSI(米国規格協会)によって標準化が進められている,RDB*2を操作するためのプログラミング言語です。では,RDBがどのようなデータベースかわかりますか? それを知るために,まずは次のコードをご覧ください。

SELECT 氏名,住所 FROM 名簿 WHERE 従業員NO = 8421237

 これはSQL文(ステートメント),つまりSQLのコマンドを使用したコードです。初めてSQLを見る方は,ちょっと戸惑うかもしれませんね。SQLを使うと,たったこれだけのコードで,従業員NOが8421237の人の氏名と住所をデータベースから取り出すことができるのです。BASICやC言語とはかなり雰囲気が違い,すごく単純に見えますよね。でも単純だからこそ,このSQLからRDBについて基本的なことがたくさん読み取ることができます。

まずはじめに「テーブル」ありき

 前述のSQLコードをもう一度,よく見てください。SELECT,FROM,WHEREという三つの英単語が何らかのキーワードになっていることは察しが付きますSQL*3。SELECTを使ったSQL文の詳細は後述しますが,ここではまずFROMの後ろに注目してください。「名簿」という文字から,「ああ,これは名簿という名前のデータベースかな」ということはすぐに思われるかもしれません。

 しかし,残念ながら「名簿」はデータベースの名前ではありません。SQLでは,FROMの後ろに「テーブル名」を記述するのです。テーブルとは「表」のことです。テーブルは,タテの列(カラムまたはフィールド)と,ヨコの行(ローまたはレコード)から構成され,行と列が交差した部分にデータ(値)を格納します(図1)。

図1●テーブルのイメージ
図1●テーブルのイメージ

 RDBは,この「テーブル」が基本中の基本です。RDBにデータを登録する,というのは実はテーブルにデータを登録する,ということなのです。「あれ,じゃあ,データベースとテーブルとは違うの?」。その通り。テーブルとデータベースは違います。

テーブルが複数集まったものを総称してデータベースと呼ぶのです。

 なお,これら「テーブル」や「行」「列」などの言い方はデータベース製品やベンダーによって異なりますが,この記事では,テーブル,レコード,フィールドと呼ぶことで統一します*4

テーブルには「主キー」と「構造」がある

 図1の「名簿」テーブルを見ていると,「なんだ,これならExcelなどの表計算ソフトで使うスプレッドシートと同じじゃないか」と思われるかもしれません。スプレッドシートも2次元の行列が基本ですから,確かによく似ています。しかし,スプレッドシートとテーブルが明らかに異なる点があります。テーブルには「主キー」と「構造」があるのです。それも一度「主キー」や「構造」を定義したら,その定義通りのデータしか格納できません。どういうことでしょうか。図1のテーブルの「従業員NO」に注目してください。

 従業員NOは「主キー(Primary Key)」と呼ばれる特別な意味を持ったフィールドです。主キーとは,レコードを1行ずつ識別するためのフィールドで,主キーとなったフィールドには,違うレコードで同じ値を登録することは許されません。図1の例では,同じ従業員NOを持つレコードは,テーブルの中に存在できないのです。  冒頭で紹介したSQLコードを実行すると,従業員NOが8421237の人(ここでは菊田恵子さん)の氏名と住所を取り出すことができます。このとき,

WHERE 従業員NO = 8421237

とあったのは,この主キーの特性を利用しています。つまり従業員NOが8421237の人は一人しかいないので,一人分のレコードが取り出せるわけです。このようにRDBでは,テーブルに主キーを設定するのが大原則です*5。主キーは一つのフィールドでも,あるいは複数のフィールドを組み合わせても構いません。例えば,従業員NOと氏名をセットにして主キーとすることもできます。

 一方,もう一つのキーワード「構造」とはなんでしょうか。表1は,図1の「名簿」テーブルの構造を示したものです。SELECTの後ろにあった「氏名」「住所」,また,WHEREの後ろにあった「従業員NO」が,実は「フィールド名」を意味していることは,もうわかりますね。フィールド名というのは,各フィールド(列)の見出しの名前なわけです。

表1●図1の「名簿」テーブルの構造
表1●図1の「名簿」テーブルの構造

 また,各フィールドに対し,文字列を格納するのか,数値を格納するのか,といったデータ型をあらかじめ設定するのもRDBのルールです。スプレッドシートでは,一つの列に文字だろうが数値だろうが自由に格納できますが,RDBでは定義したデータ型の値しか格納できません。例えば数値型のフィールドに「東京都」という文字列を格納しようとするとエラーになります。

 表1には「NULL値の扱い」で,NOT NULLという指定が設定されています。NULL(ナルまたはヌルと読む)とはデータが空っぽの状態のことで*6,NOTNULLの指定があるフィールドには,必ず値を入れなければならない,という意味になります。したがって,名簿テーブルに新たにデータを登録するときは,必ず従業員NOと氏名を入力しなければなりません。これもスプレッドシートとは違う点です。

テーブルは関連付けられる

 RDBのだいご味は,テーブル同士を関連付けて,複雑なデータを表現できる点にあります。

 図2は顧客名簿,製品,購入履歴という三つのテーブルを関連付けている様子を表現しています。このようにテーブル同士を関連付けることを「リレーションシップをとる」と呼びます。ここで注目してほしいのは,購入履歴テーブルに,顧客名簿テーブルの主キーである「名前ID」フィールドと,製品テーブルの主キーである「製品コード」フィールドが存在する点です。これにより,購入履歴テーブルから,顧客の名前を参照したり製品名を参照することが容易にできるようになるのです。このような,ほかのテーブルからコピーされた主キーを「外部キー(Foreign Key)」と呼びます。

図2●リレーションシップのイメージ。三つのテーブルを関連付けている
図2●リレーションシップのイメージ。三つのテーブルを関連付けている
[画像のクリックで拡大表示]

SQLの役割は,RDBを定義し操作すること

 さて,RDBの概念が少しは理解できてきたところで,RDBとSQLの関係を整理しておきましょう。

 表1で紹介したテーブルの構造をデータベースに登録するには,実はSQLを使います。また,定義したテーブルに,データを挿入したり削除したり検索したりするのにもSQLを使います(図3)。SQLが定義できるのはテーブルだけではありません。図2で紹介したリレーションシップも,参照整合性制約*7というルールに基づいてSQLを使って定義します。インデックス*8,ビュー*9など,データベースの中にあるオブジェクト,さらにデータベース全体の定義にもSQLを使います。

図3●SQLの二つの役割(SQL文はAccess+MSDE利用時)
図3●SQLの二つの役割(SQL文はAccess+MSDE利用時)
[画像のクリックで拡大表示]

 つまり,RDBの構造を決めるにもデータを操作するにも,すべてSQLを使うのです。SQLがRDBにとってどれくらい重要なものなのか,これで理解できますよね。このようなSQLの二つの顔を,DDL(データ定義言語:Data Definition Language),DML(データ操作言語:Data Manipulate Language)と分類して呼ぶこともあります*10

SQLにはホスト言語が必要だ

 では,「それほど重要なSQLなら,データベース・アプリケーションを開発するのに,SQLさえ知っていればいいのでは」と思ってしまいがちですが,残念ながらSQLだけでアプリケーションは作れません。SQLはあくまでデータベース処理言語。それ以上のことはできないのです。Visual Basic(VB)のようにウィンドウを作ったり,フォームを作成してボタンを配置したり,コンポーネント部品を利用する,といったことはできません。データベースの扱いが専門です。

 実際にデータベース・アプリケーションを開発するには,VBやC/C+のような「ホスト言語の中からSQLを利用する」必要があります*11

 では,SQLとBASICやC/C++,Java,COBOLのようなプログラミング言語とは何が違うのでしょうか。一般に,BASICなどは「手続き型言語」,SQLは「宣言型(非手続き型)言語」と呼びます。前者は,何か処理を行うのに,その処理手順をいちいち記述しなければならない言語。一方,後者は「○○がほしい」とヒトコトで済む言語です。

 ラーメン店に行ったときのことを想像してみましょう。ネギラーメンを注文するなら,「ネギラーメンください!」で済みますよね。これがSQLです。これに対し手続き型言語でネギラーメンを注文するなら,「まず麺を茹でて,その間にネギを油で炒めて。そしてスープを…」と,すべての段取りを細かく指示しなければなりません。つまり,手続きです。SQLのような宣言型言語のほうがわかりやすく,初心者にも簡単なことは明らかでしょう。データベースと言えばRDBのことだというくらいRDBが普及し,アプリケーション開発でSQLが使われるのは,このようなSQLの簡単さから来ている,と言ってもいいかもしれません。

 以降は,SQLのデータ操作で使われる四つのコマンド,SELECT,INSERT,UPDATE,DELETEについて,具体的にその使い方を見ていきましょう。

SQLを実行しているのはだれ?

 SQLがデータベース処理用のプログラミング言語であるならば,いったい何がSQLのコードを実行しているのでしょうか。

 答えはRDBです。AccessやOracle,SQL Sererなど最近の主要なRDBのほとんどは,SQLコードを受け取ってそれを解釈し,実行するエンジンを備えているのです。したがってアプリケーションがSQLを発行すると,RDBはそのSQLコードの中身をチェックし,どのように処理するか計画を立てて実行するわけです。アプリケーションは,その実行結果やエラー通知などを受け取るだけです。クライアント(アプリケーション)とサーバー(RDB)とが,「SQLによる依頼」と「その結果」をやり取りしている,と考えればいいでしょう。

 ただしSQLは製品によってその実装の仕方が異なります。ISOやANSIで標準化が進んでいますが,現実には製品によって微妙な差(方言)があります。特に製品によって独自に拡張/追加した関数があるので,例えばOracleで利用できたSQLがそのままSQL Serverで使えるとは限らないのです。とはいっても,SELECT,INSERT,UPDATE,DELETEといったSQLの主要なコマンドの記述方法は同じです。基本さえマスターすれば,仮に異なるデータベースを扱うことになってもコードの記述にそれほど迷うことはないでしょう。


AccessのDBエンジン

 SQLの勉強をするには,実際にSQLを操作してみるのが一番です。できれば,マイクロソフトのデータベース・ソフトAccessなどを使って,SQLを使用する手順を体験してみるのがいいでしょう。

 ちなみにAccessは,Access 2000からデータベースのエンジンが選択できるようになりました。それまでのデータベース・エンジンはJet,もう一つのエンジンがSQL Serverと互換性のあるMSDE( Microsoft Data Engine) です。JetとMSDEでは SQLを処理する仕組みが異なります。また,操作方法も異なります。現在は,SQL Serverの技術をベースにしたMSDE 2000(Microsoft SQL Server2000 Desktop Engine)が,Webサイトで無償提供されています。