文档下载建议反馈入口

  • 创建视图
  • 修改视图
  • 删除视图

视图管理

视图,即系统存储的以虚拟表形式表示的查询结果。

创建视图

前提条件

  • 非三权分立模式下,用户拥有所属数据库的 CREATE 权限和引用表的 SELECT 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有所属数据库 CREATE 权限和引用表 SELECT 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

CREATE VIEW [IF NOT EXISTS] <view_name> [(<name_list>)] AS <select_stmt>;

参数说明

参数说明
IF NOT EXISTS可选关键字,当使用 IF NOT EXISTS 关键字时,如果目标视图不存在,系统创建视图。如果目标视图存在,系统创建视图失败,但不会报错。当未使用 IF NOT EXISTS 关键字时,如果目标视图不存在,系统创建视图。如果目标视图存在,系统报错,提示目标视图已存在。
view_name待创建视图的名称,该名称在数据库中必须唯一,并且遵循数据库标识符规则。如果没有将父数据库设置为默认值,必须将视图名称格式设置为 database.view_name
name_list可选项,视图列名列表。支持指定一个或多个视图的列名,列名之间使用逗号(,)隔开。如果指定视图的列名,控制台输出指定的列名,而不是输出通过 select_stmt 语句指定的列的列名。
select_stmtSELECT 查询语句。支持使用 * 选择源表中的所有列。
- 当 select_stmt 的结果集中存在同名列时,系统报错,提示 duplicate column name: "a"
- 当源表新增列后,视图结构不会发生变化。
- 当删除视图依赖的源表中的列时,系统报错,提示 cannot drop column "b" because view "v" depends on it

语法示例

以下示例假设已经创建一个名为 orders 的表,包括顾客 ID,订单号和订单金额,并为 orders 表创建一个名为 short_order 视图,获取订单号和订单金额,并显示列名。

-- 1. 查看 orders 表的信息。

SELECT * FROM orders;
  customer_id |   id   | total
--------------+--------+--------
       100001 | 100001 |   234
       100001 | 100002 |   120
       100002 | 100003 |    59
       100002 | 100004 |   120
(4 rows)

-- 2. 创建 short_order 视图,获取订单号和订单金额,并显示列名。

CREATE VIEW short_order (id, amount) AS SELECT id, total FROM orders;
CREATE VIEW

-- 3. 查看视图信息。

SELECT * FROM short_order;
    id   | amount
---------+---------
  100001 |    234
  100002 |    120
  100003 |     59
  100004 |    120
(4 rows)

修改视图

前提条件

  • 非三权分立模式下,用户拥有重命名前视图的 DROP 权限以及重命名后视图所属父数据库的 CREATE 权限。
  • 三权分立模式下,用户是 sysadmin 角色的成员或者是拥有重命名前视图的 DROP 权限以及重命名后视图所属父数据库 CREATE 权限的普通用户。默认情况下,sysroot 用户属于 sysadmin 角色。

语法格式

ALTER VIEW [IF EXISTS] <view_name> RENAME TO <name>;

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标视图存在,系统修改目标视图。如果目标视图不存在,系统修改目标视图失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标视图存在,系统修改目标视图。如果目标视图不存在,系统报错,提示目标视图不存在。
view_name待重命名的视图的名称。支持使用 SELECT * FROM information_schema.tables WHERE table_type = 'VIEW' 语句查看视图名称。
name新的视图名称。该名称在数据库中必须唯一,并且遵循数据库标识符规则

语法示例

以下示例将 test_view 视图重命名为 names

-- 1. 查看所有视图。

SELECT * FROM information_schema.tables WHERE table_type = 'VIEW';
  table_catalog | table_schema | table_name  | table_type | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+------------+--------------------+---------+----------------
  db2           | public       | test_view   | VIEW       | NO                 |       1 |    1497612465
  db2           | public       | short_order | VIEW       | NO                 |       1 |    1497612465
(2 rows)

-- 2. 将 test_view 视图重命名为 names。

ALTER VIEW test_view rename to names;
RENAME VIEW

-- 3. 查看所有视图。

SELECT * FROM information_schema.tables WHERE table_type = 'VIEW';
  table_catalog | table_schema | table_name  | table_type | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+------------+--------------------+---------+----------------
  db2           | public       | names       | VIEW       | NO                 |       3 |    1497612465
  db2           | public       | short_order | VIEW       | NO                 |       1 |    1497612465
(2 rows)

删除视图

前提条件

  • 非三权分立模式下,
    • 删除无依赖关系的视图:用户拥有目标视图的 DROP 权限。
    • 删除存在依赖关系的视图:用户拥有目标视图的 DROP 权限及其关联对象的 DROP 权限。
  • 三权分立模式下:
    • 删除无依赖关系的视图:用户是 sysadmin 角色的成员或者是拥有目标视图 DROP 权限的普通用户。
    • 删除存在依赖关系的视图:用户是 sysadmin 角色的成员或者是拥有目标视图及其关联对象 DROP 权限的普通用户。

语法格式

DROP VIEW [IF EXISTS] <view_name_list> [CASCADE | RESTRICT];

参数说明

参数说明
IF EXISTS可选关键字。当使用 IF EXISTS 关键字时,如果目标视图存在,系统删除目标视图。如果目标视图不存在,系统删除目标视图失败,但不会报错。当未使用 IF EXISTS 关键字时,如果目标视图存在,系统删除目标视图。如果目标视图不存在,系统报错,提示目标视图不存在。
view_name_list待删除的视图名称列表。支持指定一个或多个无依赖关系的视图,视图名称之间使用逗号(,)隔开。支持使用 SELECT * FROM information_schema.tables WHERE table_type = 'VIEW' 语句查看视图名称。
CASCADE可选关键字。删除目标视图及其关联对象。CASCADE 不会列出待删除的关联对象,应谨慎使用。
RESTRICT默认设置,可选关键字。如果其他对象依赖目标视图,则无法删除该视图。

语法示例

以下示例删除 names 视图。

-- 1. 查看所有视图。

SELECT * FROM information_schema.tables WHERE table_type = 'VIEW';
  table_catalog | table_schema | table_name  | table_type | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+------------+--------------------+---------+----------------
  db2           | public       | names       | VIEW       | NO                 |       3 |    1497612465
  db2           | public       | short_order | VIEW       | NO                 |       1 |    1497612465
(2 rows)

-- 2. 删除 names 视图。

DROP VIEW names;
DROP VIEW

-- 3. 查看所有视图。

SELECT * FROM information_schema.tables WHERE table_type = 'VIEW';
  table_catalog | table_schema | table_name  | table_type | is_insertable_into | version | namespace_oid
----------------+--------------+-------------+------------+--------------------+---------+----------------
  db2           | public       | short_order | VIEW       | NO                 |       1 |    1497612465
(1 row)