首批通过分布式安全可靠测评,为关键业务系统打造
CREATE VIEW
更新时间:2025-02-06 17:20:51
描述
该语句用于创建视图。
使用限制及注意事项
如果指定了 OR REPLACE 子句,该语句能够替换已有的视图。
视图在数据库中实际上并不是以表的形式存在,视图是作为在 CREATE VIEW 语句中指定的 SELECT 语句的结果而派生出来的,每次使用时视图就会派生。
如果 FROM 子句中引用了两个或多个表或视图,则称该视图为连接视图(Join View)。一个可更新的连接视图,也称为可修改的连接视图,涉及两个或多个基表或视图,并允许 DML 操作。可更新的视图不受限于 WITH READ ONLY 子句。
要实现可更新,视图必须满足多个条件。例如,其中一条通用规则就是对于连接视图的 INSERT、UPDATE 或 DELETE 操作一次只能修改一个基表。
权限要求
执行 CREATE VIEW 语句,需要当前用户拥有 CREATE VIEW 权限。有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。
语法
CREATE [OR REPLACE] [[NO] FORCE] VIEW view_name [(column_name_list)] AS select_stmt view_with_opt;
select_stmt:
SELECT column_name, [--string]
[, column_name, [--string] ...]
FROM from_list
[WHERE condition]
column_name_list:
column_name [, column_name ...]
view_with_opt:
WITH READ ONLY
| WITH CHECK OPTION
| empty
参数解释
| 参数 | 描述 |
|---|---|
| OR REPLACE | 表示如果要创建的视图名称已存在,则使用新的定义重新创建视图。 |
| [NO] FORCE | 如果在创建视图时,不考虑该视图是否存在基表或存在引用的对象类型,以及视图所在 Schema 的所有者是否具有权限,请指定 FORCE。如果只在基表存在且视图所在 Schema 所有者具有权限时才创建视图,请指定 NOFORCE。NOFORCE 是默认设置。 |
| view_name | 视图名。 |
| column_name_list | 视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由 SELECT 语句检索的列名将用作视图列名。要想为视图列定义明确的名称,可使用可选的 column_name_list 子句,ID 之间使用逗号分隔。column_name_list 中的名称数目必须等于 SELECT语句检索的列数。SELECT 语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、运算符等的表达式。 |
| select_stmt | 是一种 SELECT 语句。它给出了视图的定义。该语句可以从基表或其他视图进行选择。更多 SELECT 语句信息,参见 SIMPLE SELECT。 |
| --string | 可选项,用于给视图添加注释。注释存储在视图定义中。
说明
|
| view_with_opt | WITH READ ONLY 是在创建或替换视图时的一个选项,用于指定该视图只能用于读取数据,而不能用于插入、更新或删除操作。 WITH CHECK OPTION 是一种用于创建视图的语法,它用于确保插入或更新的数据满足视图的定义条件。
注意Oracle 模式下的 |
示例
选择表
tbl1中的col1、col2列来创建视图view1。-- 创建表 tbl1 obclient> CREATE TABLE tbl1 (col1 INT, col2 VARCHAR(50)); Query OK, 0 rows affected -- 插入数据到 tbl1 obclient> INSERT INTO tbl1 (col1, col2) VALUES (1, 'a'), (2, 'b'), (3, 'c'); Query OK, 3 rows affected (0.046 sec) Records: 3 Duplicates: 0 Warnings: 0 obclient> CREATE OR REPLACE FORCE VIEW view1(vcol1, vcol2) AS SELECT col1, col2 FROM tbl1; Query OK, 0 rows affected基于表
tbl2的col1、col2列来创建视图view2,view2中包含满足tbl2.col2 > 1的全部数据。-- 创建表 tbl2 obclient> CREATE TABLE tbl2 (a INT, b INT); Query OK, 0 rows affected -- 插入数据到 tbl2 obclient> INSERT INTO tbl2 (a, b) VALUES (23, 2), (76, 9), (456, 1); Query OK, 3 rows affected (0.046 sec) obclient> CREATE VIEW view2 AS SELECT * FROM tbl2 WHERE tbl2.b > 1 WITH CHECK OPTION; Query OK, 0 rows affected (0.064 sec)基于表
tbl2的col1、col2列来创建视图view3,并同时为视图view3添加注释。obclient [SYS]> CREATE VIEW view3 AS SELECT col1, --col1 comment1 col2 --col1 comment2 FROM tbl2;通过
SHOW CREATE VIEW或DBMS_METADATA.GET_DDL查询视图注释。通过
SHOW CREATE VIEW查询视图注释。obclient [SYS]> SHOW CREATE VIEW view3;返回结果如下:
+-------+--------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | VIEW | CREATE VIEW | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | +-------+--------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ | VIEW3 | CREATE VIEW "VIEW3" ("COL1", "COL2") AS SELECT col1, --col1 comment1 col2 --col1 comment2 FROM tbl2 | utf8mb4 | utf8mb4_bin | +-------+--------------------------------------------------------------------------------------------------------------+----------------------+----------------------+ 1 row in set通过
DBMS_METADATA.GET_DDL查询视图注释。obclient [SYS]> SELECT DBMS_METADATA.GET_DDL('VIEW', 'VIEW3', 'SYS') FROM dual;返回结果如下:
+--------------------------------------------------------------------------------------------------------------+ | DBMS_METADATA.GET_DDL('VIEW','VIEW3','SYS') | +--------------------------------------------------------------------------------------------------------------+ | CREATE VIEW "VIEW3" ("COL1", "COL2") AS SELECT col1, --col1 comment1 col2 --col1 comment2 FROM tbl2 | +--------------------------------------------------------------------------------------------------------------+ 1 row in set