超電磁砲でデータベース(ビュー編)

ビューとは

複数テーブルからの問い合わせでテーブルの結合 STATUS NATURAL JOIN AFF をしばしば使って面倒だったろう。あらかじめ結合テーブルが容易出来れば便利である。これを実現するのがビュー(VIEW)である。基本的に読み込みしかできない。更新可能なビューの概念もあるが、更新に制限はあるし、実装されていないこともある。また、ビューを使わせることによって、ユーザにアクセスさせたくない情報を保護することもできる。ビューを定義する命令は以下の通りである。

CREATE VIEW ビュー名 AS 問い合わせ ;

例えば、次のようにすれば STATUS NATURAL JOIN AFF と同等の内容をもつビューを SA_VIEW の名前で定義できる。

CREATE VIEW SA_VIEW AS SELECT STATUS.NAME AS NAME, LEVEL, SKILL, TEAM FROM STATUS NATURAL JOIN AFF ;

ここで、NAME は STATUS.NAME と AFF.NAME があり紛らわしいので、AS NAME と明確にしておいた。問い合わせにおいて、SELECT * FROM SA_VIEW ; のようにビューはテーブルと同じ扱いができる。ビューの削除は DROP VIEW SA_VIEW ; のようにすれば良い。

更新の影響

ビューは定義後も元のテーブルの変更により内容が変わる。このことを課題を解きながら確認していこう。課題のためにテーブル S_TEST, A_TEST を作成し直す。そのために次の命令を実行して欲しい。

DROP TABLE S_TEST ;
DROP TABLE A_TEST ;

CREATE TABLE S_TEST(
 NAME TEXT PRIMARY KEY,
 LEVEL INTEGER NOT NULL DEFAULT 0,
 SKILL TEXT,
 CHECK( 0 <= LEVEL ),
 CHECK( LEVEL <= 5 ) 
) ;

CREATE TABLE A_TEST(
 NAME TEXT,
 TEAM TEXT,
 PRIMARY KEY ( NAME, TEAM ),
 FOREIGN KEY ( NAME ) REFERENCES S_TEST( NAME )
) ;

INSERT INTO S_TEST VALUES ( '御坂美琴', 5, 'レールガン' ) ;
INSERT INTO S_TEST VALUES ( '上条当麻', 0, 'イマジンブレイカー' ) ;
INSERT INTO S_TEST VALUES ( '初春飾利', 1,  'サーマルハンド' ) ;
INSERT INTO A_TEST VALUES ( '御坂美琴', '常盤台中' ) ;
INSERT INTO A_TEST VALUES ( '初春飾利', '柵川中' ) ;

課題
テーブル S_TEST, A_TEST の自然結合から NAME, LEVEL, TEAM を抜き出したビュー SA_TEST を定義せよ。

解答例
CREATE VIEW SA_TEST AS SELECT S_TEST.NAME AS NAME, SKILL, TEAM FROM S_TEST NATURAL JOIN A_TEST ;
(別解)CREATE VIEW SA_TEST AS SELECT S_TEST.NAME AS NAME, SKILL, TEAM FROM S_TEST, A_TEST WHERE S_TEST.NAME = A_TEST.NAME ;

SELECT * FROM SA_TEST ; の結果は次のようになる。

NAMESKILLTEAM
御坂美琴レールガン常盤台中
初春飾利サーマルハンド柵川中

元テーブル A_TEST にデータを追加する。

INSERT INTO A_TEST VALUES ( ‘初春飾利’, ‘ジャッジメント’ ) ;

SELECT * FROM SA_TEST ; の結果に (初春飾利, サーマルハンド, ジャッジメント) が追加されているのが確認できるはずである。