2. SQL RDBM とのインターフェースに使用する標準言語の紹介SQL (Structured Query Language)は,RDBMS サーバーへの命令を発行するために使用される言語です. これはすべての主要リレーショナル・データベースのベンダーが使用する標準言語であり,エントリー・レベルでは最新の ISO 規格である SQL92 に準拠しています.SQLには,通常のコンピュータ,語とは違ういくつかの特徴があります.
2.1 データの検索"ファー"という名の教官に関する情報をシラバス表から取り出したいとします.この作業を“問合せ”と呼びます.問合わせを行うには例えば以下の文を発行します.
これにより,以下のような問合せ結果が出ます.
RDBMS は,複数のスペースや改行を1つのスペースや改行として,文を解釈します.これらはデリミタであり,余分のスペースや改行は読みやすくすることを目的としたもので,すべて同じ「スペース」とみなされます直また,上記で検索した文字列(‘ファー’)のようなリテラルを除いては,ケースが重要ではありません. SELECT は,これが問合せであることをデータベースに伝えるキーワードです.すべてのSQL 文は複数のキーワードで始まります.アスタリスクはすべての列を取り出すことを意味します.また,取り出したい列をカンマで区切った列名のリストにすることも可能です.FROM Syllabuses は,どの表からデータを取リ出したいかを指定します. WHERE TEACHER='ファー' は述語です,SQL文に述語が含まれる場合,RDBMSは表の各行についてその述語をテストし,述語がTRUEであるすべての行で,必要なアクション(この例ではSELECT)を実行します.これは,set-at-a-time 操作の1例です.述語はオプションですが,それがない場合には操作が表全体について実行されるため,この例では表全体が取リ出されることになります.セミコロンは文の終了記号です. 2.2 表の作成SQLでは次のようにして表を作成します.以下のSQL文を使用するとシラバス表が作成できます.
キーワードCREATE_TABLEの後に表の名前と列のリストを入れます.列のリストは各列の定義を記入しカッコで囲みます,integer,char,varchar2 はデータ型です.同一の列のデータは,常にすべて同じ型です(charは固定長文字列,varchar2は可変長文字列です). NOT NULL とPRIMARY KEY は,列に対して従わなければならない制約です.これにより,該当の列に入力できる値が制限されます直 NOT NULL は,列への NULL の入力を禁じます.PRIMARY KEY は,該当する列への重複する値の入力を禁止し,その列が,外部キーの親キーとなれるようにします.
2.3 データの挿入と処理データの内容を判別するSQL文は,主に,INSERT 文,UPDATE 文,DELETE 文の3つです.INSERT は表に行を挿入し,UPDATE は行が含む値を変更し,DELETE は行を削除します.
2.3.1 INSERT 文INSERTを使用するには,以下のように,表と列を指定し,挿入する値をリストします.
上記の文により,URLを除くすべての列の値を含む行が挿入されます.CREATE TABLE 文では URL 列に NOT NULL 制約が加えられなかったため,上紀の INSERT 文でURL列に値が与えられない場合は,RDBMS はこの列に NULL を設定します.表のすべての列に値を挿入するとき,挿入する値を表の列順に並べると列のリストが省略できます.INSERT 文のVALUES句のかわりにSELECT 文を挿入すると,データペース内の別の場所からデータを取り出し,ここでそれを複製することができます.
2.3.2 UPDATE 文 述語を取り,述語がTRUEとなるすべての行に対し操作を行うという,点で, UPDATEはSELECTと類似しています.例,
上記は,“島田” という教官の URL にすべて NULL を設定します.UPDATE コマンドのSET 句は,現行の列の値を参照できます.この場合の“現行”とは,ステートメントが何らかの変更を加える前の列の値という意味です.
2.3.3 DELETE 文 DELETE は UPDATE と大変似ています.以下の文は,“島田”という名前の教官の行をすべて削除します.
DELETE ではすぺての行の削除だけができ,個々の値を削除することはできません,個々の値を削除するには,UPDATE を使用して削除したい値に NULL を設定します.DELETE では述語を省略しないように,注意してください.述語を省略すると表が空になってしまいます.
2.4 結合を使用した複数の表の問合せ SELECT はデータの取出ししか行いませんが,SQL で最も複雑な文です.1つには,SELECT を使用すると,あらゆる方法でデータ間に相関関係を持たせ,1つの文で複数の表を問合せできるという理由があげられます.これを行う方法として結合の使用があります.結合は,複数の表のデータに相関関係を持たせる SELECT 文です.結合は,結合された各表から1行ずつ取り出し,これらの行の可能な組合わせをすべて検索します.このため,それぞれ10行ある3つの表を結合すると,1000行の出力(10x10x10)が作成されます.一般的には,述語を使用してある関係を指定し出力にフィルタをかけます.自然結合と呼ばれる最も一般的なタイプの結合は,この付録で前述した外部キー/親キーの関係に基づいて,出力にフィルタをかけます.例えば,シラバス表の科目を Credits 表にあるそれぞれの単位数と結合させて参照するには,以下を入力します.
上記のaとbは範囲変数で,相関変数とも呼ばれます.これは表に付けられた別名であり,FROM句で実際の表名の後に続きます.すなわち,a=Syllabuses,b=Creditsです.ここでは SELECT と WHERE 句にある Credits.CNUM から Syllabuses.CNUM を区別するために範囲変数が必要なことがわかります.必要でない場合も,範囲変数は便利なことがあります. 上記の自然結合は以下のように出力されます.
この出力には,同じCNUM値を持つ,2つの表の行の組合わせがすべて表示されています.
2.5 外部結合 前述の例では,シラバス表中の CREDITS が明確になってない科目(CNUM 53220)は選択されていません.一方の表に一致する行がない場合,上記の述語はその行については正しくありません.こうした効果が好ましくない場合は,外部結合を使用して,それを上書きできます.外部結合とは,他の表に一致するものがあるかないかにかかわらず,結合した表のそれぞれにあるすべての行を組み込んだ結合です.このタイプの結合では,外部結合した表に一致するものがない表から取り出された列の出力に NULL を押入します.以下は,上記と同じ問合せを外部結合として行った例です.
この結果,以下のように出力されます.
この問合せが以前と異なる唯一の点は,WHERE 句に追加された(+)であることに注目してください.これは,NULL が挿入される表の後に入れます.したがって,この問合せの出力には,述語に(+)が付加されていない表のそれぞれの行につき最低1つの行が含まれます. SELECT 文を使用すると,問合せ内で処理したい値を作成(これを副問合せと呼びます)することができます.また,SELECT 文の出力を使用した標準のセット操作(UNION,INTERSECTION)の実行も可能です. 補助資料:
参考文献: “Oracle Web Server” Oracle 社 1997 |