\documentstyle[epsf]{jarticle} \title{\LARGE{問い合わせ}} \author{牧之内研 M1 龍 浩志} \begin{document} \maketitle \section{問い合わせとは} データベースに登録してあるデータからユーザが要求するデータを取り出すこ とをデータベースに対する問い合わせ(query)といいます. ユーザがデータベースに対し問い合わせを行うときは,インターフェースとし てデータ操作言語を用い ることになります.データ操作言語を用いて問い合わせ文を作り,データベー スにその結果を要求します.リレーショナルデータベースでは, SQLというデータベース言語を用いて問い合わせを行います.SQLにおける問い 合わせの最も基本となるのは, \begin{verbatim} select (属性名) from (テーブル) where (条件式) \end{verbatim} という形式で,これは,from句で指定されたテーブルから,where句で指定された条件 式を満たすデータの,select句で指定された属性の値を取り出すことになります. オブジェクトデータベースJasmineで問い合わせを行う場合は,ODQLというデー タ操作言語を用います.ODQLにおける問い合わせの基本となるのは, \begin{verbatim} (変数)= (オブジェクト)または(属性名) from (クラス) where (条件式) \end{verbatim} という形式で,これは,from句で指定されたクラスから,where句で指定された 条件を満たすオブジェクト(または指定した属性)を取り出し変数に代入する という形になります. \section{問い合わせ例} ここでは,データベースに対 する問い合わせを行うための基本となる表現と実際にJasmineで問い合わせを行うための ODQLの使用例について説明します. \subsection{selection(選択)} selectionは問い合わせの最も基本となる操作で,下の図のように表を横方向に切り出す 操作です.つまり,ある条件を満たすタプルだけを取り出します.下の例では, Commodity(商品)クラスからcommodityNo(商品番号)が3であるものを取り出し(選択)ています.結果と しては,以下の1つのタプルが取り出されます. \begin{center} \epsfile{file=selection2.eps} \end{center} このとき,取り出すタプルの条 件を指定する必要があります.この例では,''commodityNoが3である''が条件 になります.この条件を表す句をwhere句と呼びます.条件を満たすタプルが 複数ある場合は,複数取り出されます.\\ \begin{itemize} \item Jasmineでの例: ``CommodityクラスからcommodityNoが3であるオブジェクトを取り出す.'' \begin{verbatim} 1: > Bag r; 2: > r = Commodity from Commodity where Commodity.commodityNo == 3; 3: > r.print(); \end{verbatim} \item 各文の説明 1: まず,取り出したオブジェクトを格納するための変数を宣言します.変数には必ず型を指定しなけれ ばなりません.この場合,型はBag${<}$Commodity${>}$で,Commodityクラスのオブジェ クトの集合という型を表します(Bagは集合を表す).取り出されるオブジェク トが1つしかないと分かっている場合は,Commodity r; とできます.\\ 2: Commodityクラスから属性commodityNoの値が3であるオブジェクトを取り出 し,変数rに格納します.ここで,where句を省いて r = Commodity from Commodity とした場合は,Commodityクラスの全てのオブジェクトがrに格納されることになり ます.\\ 3: 変数rに格納されたオブジェクトを表示するためにメソッドprint()を使用 します.結果は以下のようになります.\\ \begin{verbatim} Bag{ ???CF::Commodity::3 { commodityNo = 3, commodityName = "Grape", unitPrice = 40 } } \end{verbatim} \item where句について\\where句で指定できる条件には,''等しい( == )''の他,''等しくない( != )'',''より大きい( ${>}$ )'',''以上である( ${>}$= )''などが使用できます. また条件を複数指定する場合は,例えば,commodityNoが3から5であるのよう な条件を指定する場合は, \begin{verbatim} where Commodity.commodityNo >=3 and Commodity.commodityNo <= 5 ; \end{verbatim} のようにand演算子を使うことができ,他にor演算子なども使えます.\\ \end{itemize} \subsection{projection(射影)} projectionという操作はselectionとは逆に表を縦方向に切り出す操作になり ます.例としては,CommodityクラスからcommodityName(商品名)とunitPrice (単価)を取り出すなどです.結果は以下のように取り出されます. \begin{center} \epsfile{file=projection.eps} \end{center} \begin{itemize} \item Jasmineでの例1 ``CommodityクラスからcommodityNameを取りだす'' \begin{verbatim} 1: > Bagname; 2: > name = Commodity.commodityName from Commodity; 3: > name.print(); \end{verbatim} \item 各文の説明 \begin{enumerate} \item 結果を格納する変数を宣言します.この場合は文字列の集合になります. \item CommodityクラスからcommodityNameを取りだし,結果を変数nameに格納 します.where句によって条件をつけることもできます. \item nameに格納された結果を表示します.以下のようになります. \end{enumerate} \begin{verbatim} Bag{ Apple, Orange, Grape, Banana, Mellon } \end{verbatim} \item Jasmineでの例2 ``CommodityクラスからcommodityName,unitPriceを取り出す.'' \begin{verbatim} 1: > Bag<[String name,Integer price]>t; 2: > t=[Commodity.commodityName,Commodity.unitPrice] from Commodity; 3: > t.print(); \end{verbatim} \item 各文の説明 \begin{enumerate} \item ここで取り出すデータは(commodityName,unitPrice)という形式,すな わち(文字列,整数)という複数の要素が含まれる複合型の値になります.これ をタプルといいます.そこで,[String name, Integer price]がこのタプルを 表します.よってこの文は,タプルの集合である変数tを宣言しています. \item CommodityクラスからcommodityNameとunitPriceを取りだし,変数tへ格 納します. \item 結果を表示すると以下のようになります. \end{enumerate} \begin{verbatim} Bag{ [name: "Apple", price: 30], [name: "Orange", price: 20], [name: "Grape", price: 40], [name: "Banana", price: 10], [name: "Mellon", price: 50] } \end{verbatim} \end{itemize} \subsection{join(結合)} join(結合)という操作は複数の表を組み合わせて新しい表を作り出すという 操作です.joinは複数の表の列が同じ属性であるものに着目し,表をつなぎあ わせます.以下では,CommodityクラスとSalesクラスのjoinを表しています. \begin{figure}[h] \begin{center} \epsfile{file=join.eps} \end{center} \end{figure} 上の場合,2つの表の商品番号という列は,Joinの結果,1つの列として取り 出されています.このような結合を自然結合(Natural Join)といいます.また, つなぎあわせた列を両方とも結果に残した場合は等結合と呼びます.SQLの場 合, \begin{verbatim} select 全ての属性 from テーブルA,テーブルB natural join 商品番号 \end{verbatim} とすれば,Natural Joinを行なってくれます.しかし,Jasmineでは,このよ うなJoinの定義はされていないので,同じ操作を行なうためにwhere句を使用 します.形式は, \begin{verbatim} 属性名 from クラスA,クラスB where クラスA.商品番号 == クラスB.商品番号 \end{verbatim} と指定することでクラスA,クラスBのJoinを行なうことができます. \begin{itemize} \item Jasmineでの例 ``CommodityクラスとSalesクラスを結合する(自然結合)'' \begin{verbatim} 1: > Bag<[Integer CommodityNo,String CommodityName,Integer UnitPrice, Integer Salesno,Integer PurchaserNo,Integer Quantity,Integer Amount]>tup; 2: > tup=[Commodity.commodityNo,Commodity.commodityName,Commodity.unitPrice, Sales.salesNo,Sales.purchaserNo,Sales.quantity,Sales.amountSold] from Commodity,Sales where Commodity.commodityNo==Sales.soldCommodityNo; \end{verbatim} \item 各文の説明 \begin{enumerate} \item 結果を格納する変数を複合型(タプル)の集合として宣言します.ここ では,7つの要素を持ったタプルを宣言しています. \item from句に結合する2つのクラスを指定,where句には2つのクラスのそれぞれ どの属性で結合を行なうかを指定します. \item 結果は以下のようになります. \end{enumerate} \begin{verbatim} Bag{ [CommodityNo: 1, CommodityName: "Apple", UnitPrice: 30, Salesno: 2, PurchaserNo: 2, Quantity: 20, Amount: 600], [CommodityNo: 2, CommodityName: "Orange", UnitPrice: 20, Salesno: 4, PurchaserNo: 2, Quantity: 30, Amount: 600], [CommodityNo: 2, CommodityName: "Orange", UnitPrice: 20, Salesno: 1, PurchaserNo: 1, Quantity: 10, Amount: 200], [CommodityNo: 3, CommodityName: "Grape", UnitPrice: 40, Salesno: 3, PurchaserNo: 3, Quantity: 10, Amount: 400] } \end{verbatim} \end{itemize} \section{実習} 前回までで各自,3つのクラス(Commodity,Customer,Sales)のクラス定義,ク ラスの構築を行っていると思います.今回は実際にそのクラスにデータを挿入 して,問い合わせを行ってみましょう. 挿入するデータは以下のような簡単なデータを用意しています. \begin{verbatim} 1)Commodityクラス _____________________________________________ commodityNo commodityName unitPrice 1 ``Apple'' 30 2 ``Orange'' 20 3 ``Grape'' 40 4 ``Banana'' 10 5 ``Mellon'' 50 _____________________________________________ 2)Customerクラス ____________________________________________________ customerNo customerName customerAddress 1 ``Astore'' ``Hukuoka'' 2 ``Bstore'' ``Tokyo'' 3 ``Cstore'' ``Osaka'' ____________________________________________________ 3)Salesクラス ________________________________________________________________ salesNo soldCommodityNo purchaserNo quantity amountSold 1 2 1 10 200 2 1 2 20 600 3 3 3 10 400 4 2 2 30 600 ________________________________________________________________ \end{verbatim} \clearpage \begin{itemize} \item 手順 まずJasmineでODQLインタプリタを起動した後, \begin{verbatim} jasmine(systemCF) > defaultCF ???CF; \end{verbatim} として,クラスファミリを自分のクラスファミリへ移動します. \begin{verbatim} jasmine(???CF) > execFile /u/ryu/work/rinkou/database/testdata.odql; \end{verbatim} と入力することで,3つのクラスにデータが挿入されます. \begin{verbatim} jasmine(???CF) > Bag c; jasmine(???CF) > c = Commodity from Commodity; jasmine(???CF) > c.print(); \end{verbatim} と入力し,データがちゃんと挿入されているか確認してください.確認したら, 問い合わせを行なってみましょう. \item エラー\\ 問い合わせを行なうときに,遭遇するエラーとしてはタイプミス,構文の誤り があると思いますが,エラーメッセージを参考にすれば訂正できると思います. あと,よく変数名''s''が重複していますとかいわれることもあると思い ますが,そのときはundefVar sとして,定義を無効にしてから変数を使用しま しょう.また,あるクラスの属性を使う時は,クラス名で修飾するのを忘れな いようにしましょう. \item 課題\\ 問い合わせの例(selection,projection,join)で示したように入力して結果を確認してみて下さい.また,以 下のような問い合わせを行なってみましょう.\\ (例)売り上げ総額(Sales.amountSold)が400以上である売り上げについて,そ の商品名(Commodity.commodityName),得意先名(Customer.customerName),売 り上げ総額(Sales.amountSold)を求める.(3つのクラスのJoinが必要になります.) \end{itemize} \end{document}