このセクションでは、ビューの作成、変更、削除の方法について説明します。 ビューはテーブルのクエリ結果を表示するために使用されます。テーブルが使用できる場所のほとんどで、ビューも使用できます。頻繁にアクセスするデータが複数のテーブルに分散している場合、ビューを使用するのが最適な方法です。
通常ビューの作成
CREATE VIEW ステートメントを使用して通常ビューを作成できます。作成後は、そのビューに対してDMLステートメントを実行できます。
構文
MySQLモードでは、ビューを作成するSQL構文は次のとおりです:
CREATE [OR REPLACE] VIEW view_name [(column_name_list)]
AS select_stmt
[view_check_option];
column_name_list:
column_name [, column_name ...]
view_check_option:
WITH [LOCAL | CASCADED] CHECK OPTION
フィールド説明:
OR REPLACE:作成しようとするビュー名が既に存在する場合、新しい定義でビューを再作成します。select_stmt:ビューを定義するSELECTステートメントで、このステートメント内の情報はベーステーブルや他のビューから選択できます。column_name_list:ベーステーブルと同様に、ビューも一意の列名を持たなければならず、重複してはなりません。デフォルトでは、SELECTステートメントで取得した列名がビューの列名として使用されます。ビューの列に明確な名前を定義したい場合は、オプションの
column_name_list句を使用できます。IDはカンマで区切ります。column_name_list内の名前の数は、SELECTステートメントで取得する列数と同じでなければなりません。SELECTステートメントで取得する列は、テーブル列への単純な参照でもかまいません。関数、定数値、演算子などを使用した式でもかまいません。WITH CHECK OPTION句は、select_statementのWHERE句が真の行以外に対する挿入または更新操作をシステムが行うのを防ぐために使用されます。WITH CHECK OPTION句を使用してビューを作成する際、CASCADEDまたはLOCALキーワードを追加することで、チェックの範囲を明示的に指定できます。LOCALキーワードを使用した場合、ビューのWHERE句をチェックし、その後チェックを基底ビューに遡及させて同じルールを適用します。CASCADEDキーワードを使用した場合、ビューのWHERE句をチェックし、その後チェックを最下層ビューに遡及させ、それらにWITH CASCADED CHECK OPTIONを追加します(最下層ビューの定義は変更されません)、そして同じルールを適用します。WITH CHECK OPTIONでCASCADEDまたはLOCALキーワードを指定しなかった場合、デフォルトでCASCADEDキーワードが使用されます。WITH CHECK OPTION句を使用しない場合、ビュー作成時にシステムはビューのWHERE句をチェックせず、その後チェックを基底ビューに遡及させて同じルールを適用します。OceanBaseデータベースは、ビューのフィルター条件(
where_clause)にサブクエリを含む場合でも、WITH CHECK OPTION句を指定することをサポートしています。注意
フィルター条件で
WITH CHECK OPTION句を使用する場合:- MySQLモードでは、作成ステートメントが「更新不可能ビュー」であってはなりません。
- ビュー定義では、現在
JOIN操作の使用はサポートされていません。
例
obclient> CREATE VIEW stock_item
AS
SELECT /*+ leading(s) use_merge(i) */
i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10
FROM stok s, item i
WHERE s.s_i_id = i.i_id;
Query OK, 0 rows affected
通常ビューの変更
CREATE OR REPLACE VIEW ステートメントを使用して、通常ビューを変更できます。
ビュー stock_item を変更します。
obclient> CREATE OR REPLACE VIEW stock_item
AS
SELECT /*+ leading(s) use_merge(i) */
i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10
FROM stok s, item i
WHERE s.s_i_id = i.i_id;
Query OK, 0 rows affected (0.02 sec)
ビューの削除
DROP VIEW ステートメントを使用して、1つまたは複数のビューを削除できます。ビューを削除しても、ビューが参照するテーブルは削除されません。
現在のビューが他のビューによって参照されている場合、ビューを削除すると、そのビューに依存している他のビューのクエリが失敗します。
ビューを削除する際は、現在のユーザーがそのビューに対する DROP 権限を持っていることを確認する必要があります。
構文
MySQLモードでは、ビューを削除するSQL構文は次のとおりです:
drop_view_stmt:
DROP VIEW [IF EXISTS] view_name_list;
view_name_list:
view_name [, view_name_list]
フィールド説明:
IF EXISTSキーワードを使用すると、ビューが存在しないためにエラーが発生するのを防ぐことができます。view_name_listに存在するビューと存在しないビューが混在している場合、実行時にエラーが発生する可能性がありますが、存在するビューは削除されます。
例
ビュー V1 を削除します。
obclient> DROP VIEW V1;