CREATE VIEW
功能描述
CREATE VIEW用于创建视图。
视图(View)是基于SQL查询定义的逻辑虚拟表,仅保存视图定义而不物理存储数据。当基表数据发生变化时,视图查询结果自动同步更新,视图提供动态数据窗口,帮助用户高效聚焦目标数据。
语法格式
1 2 3 | CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ] [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ] AS query; |
- GUC参数view_independent打开时,支持普通视图删除列。但如果存在列级约束,不支持该列的删除。
- 视图解耦功能下不支持CTE重名。例如:
1 2 3
CREATE TABLE t1(a1 INT, b1 INT); CREATE TABLE t2(a2 INT, b2 INT, c2 INT); CREATE OR REPLACE VIEW v1 AS WITH tmp AS (SELECT * FROM t2) ,tmp1 AS (SELECT b2,c2 FROM tmp WHERE b2 = (WITH RECURSIVE tmp(aa, bb) AS (SELECT a1,b1 FROM t1) SELECT bb FROM tmp WHERE aa = c2)) SELECT c2 FROM tmp1;
参数说明
| 参数 | 描述 | 取值范围 |
|---|---|---|
| OR REPLACE | 如果已存在相同名称的视图,则重新定义。 | - |
| TEMP | TEMPORARY | 创建临时视图。 | - |
| view_name | 要创建的视图名称。可以用模式修饰。 | 字符串,需符合标识符命名规范。 |
| column_name | 可选的名字列表,用作视图的字段名。如果未给出,从查询的字段名中获取。 | 字符串,需符合标识符命名规范。 |
| WITH ( {view_option_name [= view_option_value]} [, ... ] ) | 该子句指定视图的可选参数。 目前view_option_name仅支持security_barrier。 创建视图时使用WITH (security_barriers)可以创建一个相对安全的视图,避免攻击者利用低成本函数的RAISE语句打印出隐藏的基表数据。 | security_barrier为boolean类型:
|
| query | 为视图提供行和列的SELECT或VALUES语句。 | - |
示例
创建基表customer并插入数据。
1 2 3 4 5 6 7 8 | DROP TABLE IF EXISTS customer CASCADE; CREATE TABLE customer (id int, name varchar(20) , age int) with (orientation = column,COMPRESSION=MIDDLE) distribute by hash(id); INSERT INTO customer VALUES (1,'lily',10),(2, 'lucy',12),(3,'lilei',15); |
基于表customer创建视图customer_details_view_v1,用于查看表字段age < 12的数据内容。
1 2 3 4 | DROP VIEW IF EXISTS customer_details_view_v1; CREATE VIEW customer_details_view_v1 AS SELECT * FROM customer WHERE age < 12; |
可更新的视图
可更新的视图功能需开启GUC参数enable_view_update(用于设置是否开启视图更新功能,默认值为off),开启该参数后系统允许对简单视图使用INSERT,UPDATE、DELETE和MERGE INTO语句进行更新。
满足以下所有条件的视图可进行更新:
- 视图定义的FROM语句中只能有一个普通表,不能是系统表、外表、dfs表、delta表、toast表、错误表。
- 视图中包含可更新的列,这些列是对基础表可更新列的简单引用。
- 视图定义不能包含WITH、DISTINCT、GROUP BY、ORDER BY、FOR UPDATE、FOR SHARE、HAVING、TABLESAMPLE、LIMIT、OFFSET子句。
- 视图定义不能包含UNION、INTERSECT、EXCEPT集合操作。
- 视图定义的选择列表不能包含聚集函数、窗口函数、返回集合的函数。
- 对于INSERT、UPDATE和DELETE语句,视图上不能有触发时机为INSTEAD OF的触发器。对于MERGE INTO语句,视图和基础表上都不能有触发器。
- 视图定义不能包含子链接。
- 视图定义不能包含属性为VOLATILE的函数(函数值可以在一次表扫描内改变的函数)
- 视图定义不能对表的分布键所在列起别名,或将普通列起别名为分布键列名。
- 视图更新操作中包含RETURNING子句时,视图定义中的列只能来自于基础表。
如果可更新的视图定义包含WHERE条件,则该条件将会限制UPDATE和DELETE语句修改基础表上的行。如果UPDATE语句更改行后不再满足WHERE条件,更新后通过视图将无法查询到。类似地如果INSERT命令插入了不满足WHERE条件的数据,插入后通过视图将无法查询到。在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。