このセクションでは、ビューの作成、変更、削除の方法について説明します。 ビューはテーブルのクエリ結果を表示するために使用されます。テーブルを使用できる場所のほとんどでビューも使用できます。頻繁にアクセスするデータが複数のテーブルに分散している場合、ビューを使用するのが最適な方法です。
通常ビューの作成
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;