select - クラスからインスタンスを取り出す
select [distinct]
式1 [as 属性名-1]
{, 式-i [as 属性名-i]}
[into [table] クラス名]
[from from-list]
[where where句]
[group by 属性名1 {, 属性名-i....}]
[having having句]
[order by 属性名1 [asc | desc]
[using 演算子1] {, 属性名i...}]
[union {all} select ...]
Select は、修飾子や特性を満足するすべてのインスタンスを得て、対象リストの中の各要素の値を計算したりすることにより、(1) 2 つの異なった方法のうちのいずれかによりアプリケーション・プログラムに結果を返したり、(2)結果を新しいクラスに格納したりする。
もし into テーブルクラス名が指定されていれば、問い合わせの結果は指定された名前で新しいクラスに格納される。
order by 句を指定すると、対応する演算子に従ってインスタンスをソートしてくれる。この演算子はブール型を返すバイナリ演算子でなければならない。多重ソートフィールドを指定することもでき、この場合は左から右に向かって適用される。
対象リストでは取り出すフィールドを指定する。各属性名は
クラス名.属性名
という書式を取るか、または配列の一部を指定することもできる。
--
-- 各次元について下限と上限の添字を指定する
-- (すなわち配列要素の範囲を指定する)
--
class_name.att_name[下限の添字-1:上限の添字-1]..
[下限の添字-i:上限の添字-i]
--
-- 配列要素を厳密に指定する
--
class_name.att_name[上限の添字-1]..[上限の添字-i]
ここで、各下限の添字と上限の添字は整定数である。
複雑な型を持つ属性を取り出す場合、システムの振る舞いは、その型の属性を反映するための ネストされたドット を使うかどうか依存する。
クラスの値を読み出すためには、そのクラスの読み出し権が必要である(revoke(l) を参照のこと)。
--
-- 管理者より給料の高いすべての従業員を見つける
--
select e.氏名
form 従業員 e, 従業員 m
where e.管理者名 = m.氏名
and e.給与 > m.給与
--
-- 平均より高い給与をもらっている従業員の、
-- すべてのフィールドを取り出す
--
select avg(給与) as 平均
into table 平均給与 from 従業員;
--
-- すべての従業員名をソートして取り出す
--
select distinct 氏名
from 従業員
order by 氏名 using <
--
-- 雇用期限が 85/01/07 までだったすべての従業員を
--ソートして取り出す
select 氏名
from 従業員['January 7 1985'] e
order by 氏名 using <
--
-- すべての従業員の給与が 1.1 回含まれる?
-- 新しいクラス 昇進 を構築する
select 1.1 * 従業員.給与 as 給与
into tables 昇給
from 従業員
Select into は重複インスタンスを削除しない。
select into を実行中にバックエンドがクラッシュした場合、そのクラスファイルがディスク上に残ってしまう。これはデータベース DBA で安全に削除できるが、それに続く、同じ名前に対する select into は "BlockExtend" に関する謎めいたエラーメッセージとともに失敗してしまう。
堀田 倫英 <hotta@net-newbie.com>