
# CREATE VIEW
#### 功能描述
CREATE VIEW用于创建视图。
视图（View）是基于SQL查询定义的逻辑虚拟表，仅保存视图定义而不物理存储数据。当基表数据发生变化时，视图查询结果自动同步更新，视图提供动态数据窗口，帮助用户高效聚焦目标数据。
#### 语法格式
```
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ]
    [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ]
    AS query;
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
- GUC参数view_independent打开时，支持普通视图删除列。但如果存在列级约束，不支持该列的删除。
- 视图解耦功能下不支持CTE重名。例如：
  ```
  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;
  ```
  
 
#### 参数说明
表1CREATE VIEW参数说明 
| 参数                                                             | 描述                                                                                                                                                                                                                                                                    | 取值范围                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|
| OR REPLACE                                                     | 如果已存在相同名称的视图，则重新定义。                                                                                                                                                                                                                                                   | -                                                                                                                                                                                                                                                                                                                                           |
| TEMP \| TEMPORARY                                              | 创建临时视图。                                                                                                                                                                                                                                                               | -                                                                                                                                                                                                                                                                                                                                           |
| view_name                                                      | 要创建的视图名称。可以用模式修饰。                                                                                                                                                                                                                                                     | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                     |
| column_name                                                    | 可选的名字列表，用作视图的字段名。如果未给出，从查询的字段名中获取。                                                                                                                                                                                                                                    | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                     |
| WITH ( {view_option_name \[= view_option_value\]} \[, ... \] ) | 该子句指定视图的可选参数。 目前view_option_name仅支持security_barrier。 创建视图时使用WITH (security_barriers)可以创建一个相对安全的视图，避免攻击者利用低成本函数的RAISE语句打印出隐藏的基表数据。 | security_barrier为boolean类型： - TRUE  - FALSE   |
| query                                                          | 为视图提供行和列的SELECT或VALUES语句。                                                                                                                                                                                                                                             | -                                                                                                                                                                                                                                                                                                                                           |
   
#### 示例
创建基表customer并插入数据。
```
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的数据内容。
```
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条件的数据，插入后通过视图将无法查询到。在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。
#### 相关链接
[ALTER VIEW](https://support.huaweicloud.com/sqlreference-dws/dws_06_0150.html)，[DROP VIEW](https://support.huaweicloud.com/sqlreference-dws/dws_06_0215.html)
#### 常见问题
[视图查询时执行失败](https://support.huaweicloud.com/trouble-dws/dws_09_0027.html)
[通过DWS视图管控数据权限](https://support.huaweicloud.com/bestpractice-dws/dws_05_0112.html)
