CREATE VIEW
更新时间:2026-06-25
CREATE VIEW
定义一个新的视图。
语法
SQL
1 CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW name
2 [ ( column_name [, ...] ) ]
3 [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
4 AS query
5 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
6 ```
7
8
9
10## 描述
11
12`CREATE VIEW`定义查询的视图。 该视图未物化。 而是,每次在查询中引用视图时运行查询。
13
14 `CREATE OR REPLACE VIEW`类似,但是如果已经存在相同名称的视图,则将其替换。 新查询必须生成与现有视图查询生成列相同的列(即,相同的列名以相同的顺序,并且具有相同的数据类型),但是它可能会将其他列添加到列表的末尾。 产生输出列的计算可能完全不同。
15
16 如果指定了模式名称,则将在指定的模式中创建视图。 否则,它将在当前模式中创建。临时视图存在于特殊的模式中,因此在创建临时视图时可能不会给出模式名称。视图的名称必须与同一模式中的任何其他视图,表,序列,索引或外部表的名称不同。
17
18
19
20## 参数
21
22该SQL命令参数说明见下
23
24 `TEMPORARY` \| `TEMP`
25 : 如果指定,则将视图创建为临时视图。 临时视图会在当前会话结束时自动删除。存在临时视图时,当前会话将看不到具有相同名称的已有永久表,除非使用模式限定名称来引用它们。如果该视图引用的任何表都是临时表,则该视图将被创建为临时视图(无论是否指定`TEMPORARY`)。
26
27
28 `RECURSIVE`
29 : 创建一个递归视图。语法
30
31 ``` sql
32 CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;
33 ```
34
35 等价于
36
37 ``` sql
38 CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names) AS (SELECT ...) SELECT column_names FROM view_name;
39 ```
40
41 必须为递归视图指定视图列名称列表。
42
43
44 `name`
45 : 要创建的视图的名称(可以由模式指定)。
46
47
48 `column_name`
49 : 用于视图列的名称的可选列表。 如果未给出,则从查询中推导出列名。
50
51
52 `WITH ( view_option_name \[= view_option_value\] \[, ... \] `)
53 : 此子句指定视图的可选参数;支持以下参数:
54
55 `check_option` (string)
56 : 该参数可以是`local`,也可以是`cascaded`, 等效于指定`WITH [ CASCADED | LOCAL ] CHECK OPTION`(请参阅下文)。 可以使用`ALTER VIEW`在现有视图上更改此选项。
57
58 `security_barrier` (boolean)
59 : 如果视图旨在提供行级安全性,则应使用此方法。
60
61
62 `query`
63 : `SELECT`或`VALUES`命令, 将提供视图的列和行。
64
65
66
67注解
68: PalopgMPP数据库中的视图为只读。 系统不允许在视图上插入,更新或删除。通过将视图上的重写规则创建为其他表上的适当操作,可以得到可更新视图的效果。有关更多信息,请参见`CREATE RULE`。
69
70 请注意,视图列的名称和数据类型将按照您想要的方式分配。例如:
71
72 ``` sql
73 CREATE VIEW vista AS SELECT 'Hello World';
74 ```
75
76 是两种形式的错误形式:列名默认为`?column?`,列数据类型默认为`unknown`。
77
78 如果要在视图结果中使用字符串文字,请使用类似以下内容的方法:
79
80 ``` sql
81 CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
82 ```
83
84 对视图中引用的表的访问权限是由视图所有者而不是当前用户(即使当前用户是数据库管理员)的权限决定的。对于数据库管理员,这可能会造成混淆,因为数据库管理员通常可以访问所有对象。在视图的情况下,如果数据库管理员不是视图的所有者,那么即使数据库管理员也必须被明确授予访问该视图中引用的表的权限。
85
86 但是,对视图中调用的函数的处理方式与使用视图直接从查询中直接调用它们的方式相同。 因此,视图的用户必须具有调用该视图使用的任何函数的权限。
87
88 如果使用`ORDER BY`子句创建视图, 则从视图执行`SELECT`时将忽略`ORDER BY`子句。
89
90 在现有视图上使用`CREATE OR REPLACE VIEW`时,仅更改视图定义的`SELECT`规则。其他视图属性(包括所有权,权限和non-`SELECT`规则)保持不变。必须拥有视图才能替换它(包括作为拥有角色的成员)。
91
92
93
94## 示例
95
96创建一个由所有喜剧电影组成的视图:
97
98 ``` sql
99 CREATE VIEW comedies AS SELECT * FROM films
100 WHERE kind = 'comedy';
101 ```
102
103 这将创建一个视图,其中包含在创建视图时`film`表中的列。 尽管使用`*`来创建视图,但是稍后添加到表中的列将不属于视图。
104
105 创建一个获取前十名婴儿名字的视图:
106
107 ``` sql
108 CREATE VIEW topten AS SELECT name, rank, gender, year FROM
109 names, rank WHERE rank < '11' AND names.id=rank.id;
110 ```
111
112 创建一个由1到100的数字组成的递归视图:
113
114 ``` sql
115 CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
116 VALUES (1)
117 UNION ALL
118 SELECT n+1 FROM nums_1_100 WHERE n < 100;
119 ```
120
121 请注意,尽管此`CREATE VIEW`命令中的递归视图名称是模式限定的,但是其内部自引用不是模式限定的。这是因为隐式创建的CTE名称不能通过模式限定。
122
123
124
125兼容性说明
126: SQL标准为`CREATE VIEW`语句指定了PalopgMPP数据库中没有的一些附加功能。 标准中完整SQL命令的可选子句为:
127
128 - **CHECK OPTION** — 此选项与可更新视图有关。将检查视图上的所有`INSERT`和`UPDATE`命令,以确保数据满足视图定义条件(即,新数据将通过视图可见)。如果不这样做,更新将被拒绝。
129
130 - **LOCAL** — 在此视图上检查完整性。
131
132 - **CASCADED** — 在此视图和任何从属视图上检查完整性。如果未指定`CASCADED`或`LOCAL`,则假定为`CASCADED`。
133
134 `CREATE OR REPLACE VIEW`是PalopgMPP数据库语言的扩展。 临时视图的概念也是如此。
135
136
137
138相关SQL命令
139: ` SELECT ` , ` DROP VIEW `
评价此篇文章
