QUEL は、関係データベース (リレーショナルデータベース) を扱うためのデータベース言語 (問い合わせ言語) である。 QUELは、SQLと多くの面で似ている。 QUELは、カリフォルニア大学バークレー校 (UCB) での、関係モデルソフトウェアとして実装するIngresプロジェクトの構成要素の一つとして開発された。 QUELは、エドガー・F・コッドが考案したデータサブ言語 ALPHA に基づいている。 なお ALPHA は結局実装されることはなかった。 QUELは、短い期間ではあったが、自由に使うことができる Ingres のソースコードに基づく関係データベース管理システム (RDBMS) の多くで使われていた。 1980年代初めに OracleDB2 が、データベース市場での存在を大きくしていく過程で、QUEL をサポートしていたデータベース企業のほとんどはデータベース言語を QUEL から SQL に切り換えた[要出典]

QUEL の文は必ず「組変数」 (タプル変数) を使うことによって定義されている。 組変数は、問い合わせを制限するために使ったり、問い合わせの結果集合として使うことができる。 次の例を考える。 オリジナルの Ingres の論文からの引用である。

range of e is employee retrieve (comp = e.salary/ (e.age - 18)) where e.name = "Jones"

e は一つの組 (タプル) である。 この例では、employee (従業員) の関係 (リレーション) で名前が "Jones" である全ての組からなる集合を定義する。 SQL では同等の問い合わせを次のように記述する。

select (e.salary/ (e.age - 18)) as comp from employee as e where e.name = "Jones"

一定の人々は、QUEL は全体的に SQL より「形式に即している」と考えている。 主なSQL命令はすべてそれぞれ独自の命令形式となっているが、QUELにおいてはすべての命令が同じ形式の構文となっているといわれる。

例えば、一つの関係を作成して、をその関係に追加して、データを検索し更新して、最後に組を関係から削除するという、一連のセションを考える。 なおここでは、name主キーであると前提する。 QUELでは次のようになる。

create student(name = c10, age = i4, sex = c1, state = c2)
range of s is student
append to s (name = "philip", age = 17, sex = "m", state = "FL")
retrieve (s.all) where s.state = "FL"
replace s (age=s.age+1)
retrieve (s.all)
delete s where s.name="philip"

これと同等のSQL文は次のようになる。

create table student(name char(10), age int, sex char(1), state char(2))
insert into student (name, age, sex, state) values ("philip", 17, "m", "FL")
select * from student where state = "FL"
update student set age=age+1
select * from student
delete student where name="philip"

SQLでは、すべての命令が独自の構文を持っていることに注意。 SQLでは、INSERTUPDATE のような似た機能をもつ命令でさえ、まったく異なる命令形式になっている。

QUEL のまた別の機能としては、組の集合のすべてをシステムの外部と入出力するための組み込みの機構である。 次の命令を考える。

copy student(name=c0, comma=d1, age=c0, comma=d1, sex=c0, comma=d1, address=c0, nl=d1)
into "/student.txt"

この命令は、student関係に含まれる全ての組から構成されるコンマ区切りファイルを作成する。 d1 は、区切り文字を示す (定義域を示しているわけではない) 。 intofrom に変更すると、処理が逆になる。 いくつかの SQL のシステムにおいても同様の命令を使うことができるが、多くの場合は外部ツールとして使うという形をとるのであり、SQL言語 (の方言) 自体の命令で実行できるわけでない。 このため、こうしたシステムの外部と入出力するような命令を、ストアドプロシージャとして保存することはできない。

関連項目

編集

外部リンク

編集