情報工学実験II: RDBMS (平成13年度版)

2. SQL RDBM とのインターフェースに使用する標準言語の紹介

SQL (Structured Query Language)は,RDBMS サーバーへの命令を発行するために使用される言語です. これはすべての主要リレーショナル・データベースのベンダーが使用する標準言語であり,エントリー・レベルでは最新の ISO 規格である SQL92 に準拠しています.SQLには,通常のコンピュータ,語とは違ういくつかの特徴があります.

 

  • SQLは,非プロシージャ型である:SQLでは,ユーザーは何をするかをサーバーに指示しますが,どのように実行するかは指示しません.これにより,多くの詳細に関与する必要がなくなります.
  • SQL文は,それぞれが独立している:PL/SQLとは違って,SQL自体には条件文などのコントロールフロー文はありません.
  • SQLは,ヌルと3値ロジックを使用する:ほとんどの言語では,ブール式は,TRUE か FALSE かのどちらかです.SQLでは,これが TRUEFALSENULLとなります.述語に関連するものに,3値ロジックがあります.SQLでは,TRUE FALSE の基本ブール値の他に,NULL または UNKNOWN と呼ばれる値が加わります.これは,データが不完全であったり適用不能のため,SQLが述語の正しい値が不明であることを認識するからです.明確にいうと,列に NULL が含まれることがありますが,NULL は適用する値が存在しないことを意味します,例えば, a=5 のような関係演算子を使用した2つの値の比較は,通常 TRUE FALSE のどちらかです.しかし,NULL NULL を含む他の値と比較される場合,ブール値はTRUEでもFALSEでもなく, NULL になります.

2.1 データの検索

"ファー"という名の教官に関する情報をシラバス表から取り出したいとします.この作業を“問合せ”と呼びます.問合わせを行うには例えば以下の文を発行します.

    SELECT *

    FROM Syllabuses

    WHERE TEACHER = ‘ファー’;

これにより,以下のような問合せ結果が出ます.

CNUM TITLE TEACHER URL
53210 知識工学 ファー /SYL/53210.html

RDBMS は,複数のスペースや改行を1つのスペースや改行として,文を解釈します.これらはデリミタであり,余分のスペースや改行は読みやすくすることを目的としたもので,すべて同じ「スペース」とみなされます直また,上記で検索した文字列(‘ファー’)のようなリテラルを除いては,ケースが重要ではありません.

SELECT は,これが問合せであることをデータベースに伝えるキーワードです.すべてのSQL 文は複数のキーワードで始まります.アスタリスクはすべての列を取り出すことを意味します.また,取り出したい列をカンマで区切った列名のリストにすることも可能です.FROM Syllabuses は,どの表からデータを取リ出したいかを指定します.

WHERE TEACHER='ファー' は述語です,SQL文に述語が含まれる場合,RDBMSは表の各行についてその述語をテストし,述語がTRUEであるすべての行で,必要なアクション(この例ではSELECT)を実行します.これは,set-at-a-time 操作の1例です.述語はオプションですが,それがない場合には操作が表全体について実行されるため,この例では表全体が取リ出されることになります.セミコロンは文の終了記号です.

2.2 表の作成

SQLでは次のようにして表を作成します.以下のSQL文を使用するとシラバス表が作成できます.

 

CREATE TABLE Syllabuses

( cnum integer NOT NULL PRIMARY KEY,

TITLE char(15) NOT NULL,

TEACHER char(15) NOT NULL,

URL varchar2 );

 

キーワードCREATE_TABLEの後に表の名前と列のリストを入れます.列のリストは各列の定義を記入しカッコで囲みます,integercharvarchar2 はデータ型です.同一の列のデータは,常にすべて同じ型です(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を使用するには,以下のように,表と列を指定し,挿入する値をリストします.

 

INSERT INTO Syllabuses (cnum, TITLE, TEACHER)

VALUES (53290,’システム開発工学’, ‘鶴田’);

 

上記の文により,URLを除くすべての列の値を含む行が挿入されます.CREATE TABLE 文では URL 列に NOT NULL 制約が加えられなかったため,上紀の INSERT 文でURL列に値が与えられない場合は,RDBMS はこの列に NULL を設定します.表のすべての列に値を挿入するとき,挿入する値を表の列順に並べると列のリストが省略できます.INSERT 文のVALUES句のかわりにSELECT 文を挿入すると,データペース内の別の場所からデータを取り出し,ここでそれを複製することができます.

 

2.3.2 UPDATE 文

述語を取り,述語がTRUEとなるすべての行に対し操作を行うという,点で, UPDATESELECTと類似しています.例,

UPDATE Syllabuses

SET URL = null

WHERE TEACHER = ‘島田’;

 

上記は,“島田” という教官の URL にすべて NULL を設定します.UPDATE コマンドのSET 句は,現行の列の値を参照できます.この場合の“現行”とは,ステートメントが何らかの変更を加える前の列の値という意味です.

 

2.3.3 DELETE 文

DELETE UPDATE と大変似ています.以下の文は,“島田”という名前の教官の行をすべて削除します.

 

DELETE FROM Syllabuses

WHERE TEACHER = ‘島田’;

DELETE ではすぺての行の削除だけができ,個々の値を削除することはできません,個々の値を削除するには,UPDATE を使用して削除したい値に NULL を設定します.DELETE では述語を省略しないように,注意してください.述語を省略すると表が空になってしまいます.

 

2.4 結合を使用した複数の表の問合せ

SELECT はデータの取出ししか行いませんが,SQL で最も複雑な文です.1つには,SELECT を使用すると,あらゆる方法でデータ間に相関関係を持たせ,1つの文で複数の表を問合せできるという理由があげられます.これを行う方法として結合の使用があります.結合は,複数の表のデータに相関関係を持たせる SELECT 文です.結合は,結合された各表から1行ずつ取り出し,これらの行の可能な組合わせをすべて検索します.このため,それぞれ10行ある3つの表を結合すると,1000行の出力(10x10x10)が作成されます.一般的には,述語を使用してある関係を指定し出力にフィルタをかけます.自然結合と呼ばれる最も一般的なタイプの結合は,この付録で前述した外部キー/親キーの関係に基づいて,出力にフィルタをかけます.例えば,シラバス表の科目を Credits 表にあるそれぞれの単位数と結合させて参照するには,以下を入力します.

 

SELECT a.CNUM, TEACHER, TITLE, CREDIT, YEAR

FROM Syllabuses a, Credits b

WHERE a.CNUM = b.CNUM ;

 

上記のaとbは範囲変数で,相関変数とも呼ばれます.これは表に付けられた別名であり,FROM句で実際の表名の後に続きます.すなわち,a=Syllabusesb=Creditsです.ここでは SELECT WHERE 句にある Credits.CNUM から Syllabuses.CNUM を区別するために範囲変数が必要なことがわかります.必要でない場合も,範囲変数は便利なことがあります.

上記の自然結合は以下のように出力されます.

 

CNUM TEACHER TITLE CREDIT YEAR
53210 ファー 知識工学 平成6年度以前
53210 ファー 知識工学 平成6年度以降
53260 近藤 CAD 工学 平成6年度以前
53260 近藤 CAD 工学 平成6年度以降
53270 岩澤 コンパイラ工学 平成6年度以降

 

この出力には,同じCNUM値を持つ,2つの表の行の組合わせがすべて表示されています.

 

2.5 外部結合

前述の例では,シラバス表中の CREDITS が明確になってない科目(CNUM 53220)は選択されていません.一方の表に一致する行がない場合,上記の述語はその行については正しくありません.こうした効果が好ましくない場合は,外部結合を使用して,それを上書きできます.外部結合とは,他の表に一致するものがあるかないかにかかわらず,結合した表のそれぞれにあるすべての行を組み込んだ結合です.このタイプの結合では,外部結合した表に一致するものがない表から取り出された列の出力に NULL を押入します.以下は,上記と同じ問合せを外部結合として行った例です.

SELECT a.CNUM, TEACHER, TITLE, CREDIT, YEAR

FROM Syllabuses a, Credits b

WHERE a.CNUM = b.CNUM (+);

  

この結果,以下のように出力されます.

CNUM TEACHER TITLE CREDIT YEAR
53210 ファー 知識工学 平成6年度以前
53210 ファー 知識工学 平成6年度以降
53220 八嶋 信号処理 NULL NULL
53260 近藤 CAD 工学 平成6年度以前
53260 近藤 CAD 工学 平成6年度以降
53270 岩澤 コンパイラ工学 平成6年度以降

 

この問合せが以前と異なる唯一の点は,WHERE 句に追加された(+)であることに注目してください.これは,NULL が挿入される表の後に入れます.したがって,この問合せの出力には,述語に(+)が付加されていない表のそれぞれの行につき最低1つの行が含まれます.

SELECT 文を使用すると,問合せ内で処理したい値を作成(これを副問合せと呼びます)することができます.また,SELECT 文の出力を使用した標準のセット操作(UNIONINTERSECTION)の実行も可能です.



補助資料:



実験資料PDF形式



参考文献:

“Oracle Web Server” Oracle 社 1997