CREATE VIEW
CREATE VIEW
定义一个新的视图。
概要
CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW name [ ( column_name [, ...] ) ] [ WITH ( view_option_name [= view_option_value] [, ... ] ) ] AS query [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
描述
CREATE VIEW定义查询的视图。 该视图未物化。 而是,每次在查询中引用视图时运行查询。
CREATE OR REPLACE VIEW类似,但是如果已经存在相同名称的视图,则将其替换。 新查询必须生成与现有视图查询生成列相同的列 (即,相同的列名以相同的顺序,并且具有相同的数据类型),但是它可能会将其他列添加到列表的末尾。 产生输出列的计算可能完全不同。
如果指定了模式名称,则将在指定的模式中创建视图。 否则,它将在当前模式中创建。 临时视图存在于特殊的模式中,因此在创建临时视图时可能不会给出模式名称。 视图的名称必须与同一模式中的任何其他视图,表,序列,索引或外部表的名称不同。
参数
- TEMPORARY | TEMP
- 如果指定,则将视图创建为临时视图。 临时视图会在当前会话结束时自动删除。 存在临时视图时,当前会话将看不到具有相同名称的已有永久表,除非使用模式限定名称来引用它们。 如果该视图引用的任何表都是临时表,则该视图将被创建为临时视图(无论是否指定TEMPORARY)。
- RECURSIVE
- 创建一个递归视图。语法
CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;
等价于CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names) AS (SELECT ...) SELECT column_names FROM view_name;
必须为递归视图指定视图列名称列表。 - name
- 要创建的视图的名称(可以由模式指定)。
- column_name
- 用于视图列的名称的可选列表。 如果未给出,则从查询中推导出列名。
- WITH ( view_option_name [= view_option_value] [, ... ] )
- 此子句指定视图的可选参数;支持以下参数:
- check_option (string)
- 该参数可以是local,也可以是cascaded, 等效于指定WITH [ CASCADED | LOCAL ] CHECK OPTION(请参阅下文)。 可以使用ALTER VIEW在现有视图上更改此选项。
- security_barrier (boolean)
- 如果视图旨在提供行级安全性,则应使用此方法。
- query
- SELECT或VALUES命令, 将提供视图的列和行。
注解
Greenplum数据库中的视图为只读。 系统不允许在视图上插入,更新或删除。 通过将视图上的重写规则创建为其他表上的适当操作,可以得到可更新视图的效果。 有关更多信息,请参见CREATE RULE。
请注意,视图列的名称和数据类型将按照您想要的方式分配。例如:
CREATE VIEW vista AS SELECT 'Hello World';
是两种形式的错误形式:列名默认为?column?,列数据类型默认为unknown。 如果要在视图结果中使用字符串文字,请使用类似以下内容的方法:
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
对视图中引用的表的访问权限是由视图所有者而不是当前用户(即使当前用户是超级用户)的权限决定的。 对于超级用户,这可能会造成混淆,因为超级用户通常可以访问所有对象。 在视图的情况下,如果超级用户不是视图的所有者,那么即使超级用户也必须被明确授予访问该视图中引用的表的权限。
但是,对视图中调用的函数的处理方式与使用视图直接从查询中直接调用它们的方式相同。 因此,视图的用户必须具有调用该视图使用的任何函数的权限。
如果使用ORDER BY子句创建视图, 则从视图执行SELECT时将忽略ORDER BY子句。
在现有视图上使用CREATE OR REPLACE VIEW时,仅更改视图定义的SELECT规则。 其他视图属性(包括所有权,权限和non-SELECT规则)保持不变。 您必须拥有视图才能替换它(包括作为拥有角色的成员)。
示例
创建一个由所有喜剧电影组成的视图:
CREATE VIEW comedies AS SELECT * FROM films WHERE kind = 'comedy';
这将创建一个视图,其中包含在创建视图时film表中的列。 尽管使用*来创建视图,但是稍后添加到表中的列将不属于视图。
创建一个获取前十名婴儿名字的视图:
CREATE VIEW topten AS SELECT name, rank, gender, year FROM names, rank WHERE rank < '11' AND names.id=rank.id;
创建一个由1到100的数字组成的递归视图:
CREATE RECURSIVE VIEW public.nums_1_100 (n) AS VALUES (1) UNION ALL SELECT n+1 FROM nums_1_100 WHERE n < 100;
请注意,尽管此CREATE VIEW命令中的递归视图名称是模式限定的,但是其内部自引用不是模式限定的。 这是因为隐式创建的CTE名称不能通过模式限定。
兼容性
SQL标准为CREATE VIEW语句指定了Greenplum数据库中没有的一些附加功能。 标准中完整SQL命令的可选子句为:
- CHECK OPTION — 此选项与可更新视图有关。 将检查视图上的所有INSERT和UPDATE命令, 以确保数据满足视图定义条件(即,新数据将通过视图可见)。 如果不这样做,更新将被拒绝。
- LOCAL — 在此视图上检查完整性。
- CASCADED — 在此视图和任何从属视图上检查完整性。 如果未指定CASCADED或LOCAL,则假定为CASCADED。
CREATE OR REPLACE VIEW是Greenplum数据库语言的扩展。 临时视图的概念也是如此。