プログラミング言語SML#解説 4.0.0版
12 SML#の拡張機能:SQLの統合

12.1 関係データベースとSQL

現在の本格的なデータベースは,関係データモデルを基礎として実装さ れた関係データベースです. SML#のデータベース連携を理解し使いこなすための準備として, まず本節で,関係データベースとSQLの基本を復習しましょう.

関係データモデルでは,データを関係の集まりとして表します. 関係は,人の名前,年齢,給与などの複数の属性の関連を表し,通 常以下のような属性名をラベルとして持つテーブルで表現します.

name age salary
”Joe” 21 10000
”Sue” 31 20000
”Bob” 41 20000

関係データベースは,これら関係の集まりを操作するシステムです. 関係Rは,数学的には与えられた領域A1,A2,,Anの 積集合A1×A2×Anの部分集合です. 関係Rの要素tは,n個のタプル(a1,,an)です. 実際のデータベースでは,タプルのそれぞれの要素にラベルを付け,レコー ドとして表現します. 例えば上のテーブルの1行目の要素は,レコード {name="Joe", age=21, salary=1000}に対応します. これら関係に対して,和集合演算,射影(n項関係をm(n)項関 係に射影),選択(集合の特定の要素の選び出し),デカルト積 R×Sな どの演算が定義されています. これら演算系を関係代数と呼びます. ここで留意すべき点は,関係モデルはレコードの集合に対する代数的な 言語である点です. 代数的な言語は,関数定義を含まない関数型言語です.

関係データベースでは,この関係代数をSQLと呼ばれる集合操作言語で 表現します. SQLの中心は,以下のSELECT式です.

SELECT t1.l1 as l1,, tm.lm as lm
FROM R1 as t1, , Rn as tn
WHERE P(t1,,tn)

ここでは,以下の約束に従ってメタ変数を使用しています.

  • R:関係を表す式.

  • t:関係の中の一つのレコード要素を代表する変数

  • l:属性名

  • t.ltの中の属性lの値を表す式.

SELECT式の意味は以下の操作と理解できます.

  1. 1.

    FROM節で列挙された関係式Riを評価し,デカルト積 R1××Rn を作る.

  2. 2.

    デカルト積の任意の要素のタプルを(t1,,tn)とする.

  3. 3.

    デカルト積から,WHERE節で指定された述語P(t1,,tn)を 満たす要素のみを選び出す.

  4. 4.

    上記の結果得られた集合の各要素(t1,,tn)に対して, レコード {l1=t1.l1, , lm=tm.lm} を構築する.

  5. 5.

    それらレコードをすべて集めた集合を,この式全体の結果とする.

例えば,上の例のテーブルをPersonsとし,以下のSQL式を考えて みましょう.

SELECT P.name as name, P.age as age
FROM Persons as P
WHERE P.salary > 10000

この問い合わせ式は以下のように評価されます.

  • 関係Personsのみのデカルト積は関係Personsそれ自身である.

  • 関係Personsの任意のタプルをPとする.

  • P.Salary > 10000の条件を満たすタプルを選び出し,以下の集合を得 る.

    name age salary
    ”Sue” 31 20000
    ”Bob” 41 20000
  • この集合の各要素Pに対して{name=P.name, age=P.age}を 計算し,以下の集合を得る.

    name age
    ”Sue” 31
    ”Bob” 41

    このテーブルは, {{name="Sue", age=31}, {name="Bob", age=31}} のようなレコードのリストの表現と理解できる.