openGausss视图

举报
redtea 发表于 2026/04/20 12:11:21 2026/04/20
【摘要】 详细阐述了openGauss数据库视图的创建、查询、更新(需满足特定条件)、修改以及删除等操作语法与实例。同时,涵盖了视图的权限管理和通过系统视图(如pg_views)查看视图信息的方法,为数据库的高效管理与安全使用提供了完整指导。

openGauss视图

1 视图概述

       视图(View)是一种虚拟表,它本身不存储实际数据,而是由一个或多个基本表(或其他视图)通过SELECT查询语句定义的“虚拟结果集”。视图的结构和数据来源于定义它的查询语句,当基本表的数据发生变化时,视图中显示的数据也会随之动态更新,无需手动维护视图数据。(本篇文章所说的视图是指openGauss普通视图,不包括物化视图)。

       视图的核心作用的体现在以下3个方面:

        简化数据查询:对于复杂的多表连接查询(如查询学生姓名、班级名称、班主任姓名),可将查询逻辑封装为视图,后续查询时直接调用视图,无需重复编写复杂的连接语句。例如,将“学生-班级-班主任”的关联查询定义为视图,每次查询相关信息时,只需执行SELECT * FROM 学生班级视图即可。

       保障数据安全:视图可隐藏基本表的部分字段和数据,只向用户展示所需的信息,避免敏感数据(如学生身份证号、教师薪资等,若表中存在)泄露。例如,创建仅包含学生学号、姓名、班级的视图,隐藏学生生日等隐私信息。

       统一数据展示:当多个业务场景需要相同的查询结果时,视图可提供统一的数据源,确保数据展示的一致性,减少重复开发。例如,多个模块需要查询“计算机学院的课程信息”,可创建对应的视图,统一数据查询逻辑。

视图与基本表的核心区别的如下表(表1)所示。

表1 视图与基本表的核心区别

对比维度

基本表

视图

数据存储

存储实际数据,占用数据库存储空间

不存储数据,仅存储查询定义,数据来源于基本表

操作方式

可执行INSERT、UPDATE、DELETE、SELECT等操作(受约束限制)

主要用于查询;部分视图可执行更新操作(需满足特定条件)

数据更新

直接更新表中数据,独立于其他表(受外键约束)

不直接更新,基本表数据更新后,视图数据自动同步

作用

存储原始数据,是数据库的基础

简化查询、隐藏数据、统一展示,提升操作效率和安全性

数据存储

存储实际数据,占用数据库存储空间

不存储数据,仅存储查询定义,数据来源于基本表


2 视图操作

       openGauss中,视图的核心操作包括创建视图、查询视图、更新视图,语法简洁且贴合实操,以下详细讲解各操作的语法、案例及注意事项。

2.1 创建视图

       创建视图的核心是定义一个SELECT查询语句,将复杂的查询逻辑封装为视图,语法遵循openGauss的标准规范,适配应用型学生的实操需求。

      1.基本语法

-- 创建视图标准语法

CREATE VIEW 视图名 [(列别名1, 列别名2, ...)]

AS

SELECT 查询语句(可包含单表查询、多表连接、分组、排序等)

[WITH CHECK OPTION]; -- 可选,限制更新视图时,数据必须满足视图的查询条件

       说明:

       视图名:需遵循数据库对象命名规范,建议前缀为“v_”,便于区分视图和基本表(如v_student_class)。

       列别名:可选,若SELECT查询语句中的列名不直观或有重复,可通过列别名指定视图的列名。

       SELECT查询语句:可使用第7章讲解的所有查询语法(单表查询、连接查询、子查询、分组排序等)。

       WITH CHECK OPTION:可选,若添加该选项,更新视图时,新数据必须满足视图定义中的查询条件,否则更新失败,保障视图数据的合法性。

      2.实操案例

--【实例1-1】创建单表视图,查询学生的学号、姓名、班级ID、院系ID(基于student表)

--创建视图v_student0

drop view v_student0;

CREATE VIEW v_student0

AS

SELECT * FROM student;

-- 【实例1-2】创建多表连接视图,查询学生姓名、班级名称、班主任姓名(关联student、class、teacher表)

--创建视图v_student_class_teacher

CREATE VIEW v_student_class_teacher

AS

SELECT s.studentid AS 学生学号,

s.studentname AS 学生姓名,

c.classname AS 班级名称,

t.teachername AS 班主任姓名

FROM student s

JOIN class c ON s.classid = c.classid

JOIN teacher t ON c.teacherid = t.teacherid;


-- 【实例1-3】创建带条件的视图,查询计算机学院(departmentid='07')的教师信息(基于teacher表)

--创建视图v_student_department1

CREATE VIEW v_teacher_department1

AS

SELECT teacherid, teachername, researchfield FROM teacher

WHERE departmentid = '07'

WITH CHECK OPTION; -- 限制更新视图时,departmentid必须为'07'

-- 【实例1-4】创建分组统计视图,查询每个院系的教师人数(关联teacher、department表)

--创建视图v_student_count

CREATE VIEW v_teacher_count

AS

SELECT d.departmentname AS 院系名称, COUNT(t.teacherid) AS 教师人数

FROM teacher t

JOIN department d ON t.departmentid = d.departmentid

GROUP BY d.departmentname;

       3.创建视图的注意事项

    (1)视图的数据源可以是基本表,也可以是其他已创建的视图(嵌套视图),但嵌套层数不宜过多(建议不超过3层),否则会降低查询效率。

    (2)若视图的列名来源于聚合函数(如COUNT、AVG),必须为该列指定别名,否则创建失败。

    (3)创建视图的用户需具备对应基本表的查询权限(SELECT权限),否则会提示权限不足。

2.2 查询视图

      查询视图的语法与查询基本表完全一致,可使用第7章讲解的所有查询技巧(筛选、排序、分组等),因为视图本质是虚拟表,用户无需关注其背后的查询逻辑,只需像操作基本表一样查询即可。

      1.基本语法

-- 基本查询

SELECT 列名1, 列名2, ... FROM 视图名;

-- 带条件查询

SELECT 列名 FROM 视图名 WHERE 筛选条件;

-- 排序、分组查询

SELECT 列名 FROM 视图名 GROUP BY 列名 HAVING 分组条件 ORDER BY 列名;

      2.实操案例

-- 【实例1-5】查询单表视图v_student0的所有数据

SELECT * FROM v_student0;


-- 【实例1-6】查询多表视图v_student_class_teacher中,24数据技术班的学生信息

SELECT 学生姓名, 班主任姓名 FROM v_student_class_teacher

WHERE 班级名称 = '24数据技术';


-- 【实例1-7】查询分组视图v_teacher_count中,教师人数大于10的院系

SELECT 院系名称, 教师人数 FROM v_teacher_count

WHERE 教师人数 > 10

ORDER BY 教师人数 DESC;


-- 【实例1-8】查询视图v_teacher1中,研究方向包含“数据库”的教师

SELECT teachername, researchfield FROM v_teacher_department1

WHERE researchfield LIKE '%数据库%';

        3.查询视图的注意事项

    (1)查询视图时,openGauss会自动执行视图定义中的SELECT语句,将结果返回给用户,查询效率取决于视图背后的查询逻辑(复杂的多表连接视图查询效率较低)。

    (2)若视图包含聚合函数或分组查询,查询视图时不能直接修改聚合列的值(如教师人数),因为这些列是统计结果,并非原始数据。

    (3)查询视图时,可使用表别名、列别名,与查询基本表的用法完全一致。

2.3 更新视图

       视图本身不存储数据,更新视图本质上是更新视图背后的基本表数据,并非更新视图本身。但并非所有视图都能更新,只有满足特定条件的视图才能执行INSERT、UPDATE、DELETE操作。

      1.可更新视图的条件

      视图的定义中不包含聚合函数(如COUNT、AVG、SUM)、DISTINCT、GROUP BY、HAVING子句。

      视图的定义中不包含多表连接(或仅包含内连接,且连接条件唯一)。

      视图的每一列都对应基本表的一个列,而非表达式(如列名不能是“studentid+1”这类表达式)。

      2.基本语法(与更新基本表一致)

-- 更新视图(本质更新基本表)

UPDATE 视图名 SET 列名1 = 值1, 列名2 = 值2 WHERE 筛选条件;


-- 插入数据到视图(本质插入到基本表)

INSERT INTO 视图名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);


-- 删除视图中的数据(本质删除基本表中的数据)

DELETE FROM 视图名 WHERE 筛选条件;

     3.实操案例

-- 【实例1-9】更新视图v_student0中,学生学号为20240530101的班级ID更新为20240706

UPDATE v_student0

SET classid = '20240706'

WHERE studentid = '20240530101';

-- 说明:该操作会同步更新student表中对应的数据


-- 【实例1-10】向视图v_student0中插入一条新学生记录

INSERT INTO student.v_student0

(studentid, studentname, gender, birthday, classid, majorid, departmentid)

VALUES('20240540110', '王城', '男'::bpchar, '2004-11-10', '20240705', '080910T', '07');

-- 说明:该操作会同步插入到student表中,需满足student表的约束(如studentid主键唯一)

-- 查询 v_student0

select *

from v_student0;

-- 【实例1-11】删除视图v_student0中学号为20240540110的学生记录

DELETE FROM v_student0 WHERE studentid = '20240540110';

-- 说明:该操作会同步删除student表中对应的数据

-- 查询 v_student0

select *

from v_student0;

      4.不可更新视图示例

-- 尝试更新分组视图,会报错(包含聚合函数COUNT)

-- 【实例1-12】更新视图v_teacher_count

UPDATE v_teacher_count

SET 教师人数 = 15

WHERE 院系名称 = '信息工程学院';

-- 报错原因:视图包含聚合函数,无法直接更新

      5.更新视图的注意事项

     (1)更新视图时,必须满足基本表的约束条件(如主键唯一、外键关联、非空约束等),否则更新失败。例如,插入学生记录时,studentid必须唯一,否则报错。

     (2)若视图添加了WITH CHECK OPTION选项,更新数据时必须满足视图定义中的查询条件,否则更新失败。例如,视图v_teacher_department1限制departmentid='07',若尝试将departmentid改为'06',会报错。

     (3)多表连接视图若能更新,仅能更新其中一个基本表的数据,不能同时更新多个基本表。

      3 管理视图

      视图的管理操作主要包括修改视图、删除视图、查看视图信息,是数据库维护的重要内容,结合openGauss的实操语法,以下详细讲解各操作,均基于前文创建的视图展开。

      3.1 修改视图辅助属性

      openGauss 支持 ALTER VIEW 语句,用于更改视图的各种辅助属性。根据 openGauss 官方文档,ALTER VIEW 支持以下操作(如表1-2所示)。

表1-2 视图与基本表的核心区别

操作类型

语法示例

重命名视图

ALTER VIEW view_name RENAME TO new_name;

修改所属模式

ALTER VIEW view_name SET SCHEMA new_schema;

修改所有者

ALTER VIEW view_name OWNER TO new_owner;

设置/删除列默认值

ALTER VIEW view_name ALTER COLUMN column_name SET DEFAULT expression;

设置视图选项

ALTER VIEW view_name SET (view_option_name = value);

重置视图选项

ALTER VIEW view_name RESET (view_option_name);

修改视图定义(B兼容模式)

ALTER VIEW view_name AS query;

         1.实操案例

-- 【实例1-13】修改视图名称

ALTER VIEW student.v_student0 RENAME TO v_studentbasicinfor;


-- 【实例1-14】修改视图所属schema

ALTER VIEW student.v_studentbasicinfor SET SCHEMA public;


-- 【实例1-15】修改视图所有者

ALTER VIEW public.v_studentbasicinfor OWNER TO new_user;

       2.注意事项

       权限要求:只有视图的所有者或被授予 ALTER 权限的用户才能执行此命令,系统管理员默认拥有该权限。

3.2 修改视图定义

       如果要修改视图的定义,即子查询部分,需要使用CREATE OR REPLACE语句。

       1.基本语法

        -- 标准语法

       CREATE OR REPLACE VIEW 视图名 [(列别名1, 列别名2, ...)]

       AS

      新的SELECT查询语句

     [WITH CHECK OPTION];

    2.实操案例

--【实例1-16】修改视图子查询内容,追加专业名称列并修改视图名称

CREATE OR REPLACE VIEW v_student_class_teacher

AS

SELECT s.studentid AS 学生学号,

s.studentname AS 学生姓名,

c.classname AS 班级名称,

t.teachername AS 班主任姓名,

m.majorname AS 专业名称

FROM student s

JOIN class c ON s.classid = c.classid

JOIN teacher t ON c.teacherid = t.teacherid

JOIN major m ON s.majorid = m.majorid;

--修改视图名称

ALTER VIEW student.v_student_class_teacher

RENAME TO v_student_class_teacher_major;

     3.注意事项

     (1)B兼容模式扩展:在 B 兼容模式(B兼容模式是openGauss为降低用户从MySQL生态迁移成本而设计的一种运行模式。在该模式下,数据库在SQL语法、特定功能(如定时任务)以及部分DDL语句(如修改视图)的行为上会与MySQL保持兼容,但同时也继承了相应的限制。选择此模式需在数据库创建时决定)下,支持 ALTER VIEW view_name AS query 语法来修改视图定义,但新查询不能改变原查询的列定义(包括顺序、列名、数据类型等),只能在列表末尾添加其他列。

    (2)可选参数:支持 IF EXISTS 选项,当视图不存在时不会产生错误,仅会提示信息。

    (3)修改视图的定义,当业务需求变化时,无需删除视图,可直接修改其查询逻辑,适配新的需求。

    (4)在openGauss中修改视图定义时,若需减少列数,必须采用“先删除,后创建”的方式,不能直接使用CREATE OR REPLACE VIEW。

    (5)在openGauss中修改视图定义时,若需增加列数,必须采用 保留原视图中列的顺序,然后再追加列。

3.3 删除视图

     当视图不再使用时,可删除视图,删除视图仅删除视图的定义,不会影响其背后的基本表数据,操作简单且安全。

    1.基本语法

     DROP VIEW [IF EXISTS] 视图名 [CASCADE];

     说明:IF EXISTS可选,若添加该选项,当视图不存在时,不会报错(避免语法错误),建议日常操作中添加。

     2.实操案例

-- 【实例1-17】删除视图v_teacher_count

DROP VIEW IF EXISTS v_teacher_count;


-- 【实例1-18】删除多个视图(用逗号分隔)

DROP VIEW IF EXISTS v_student0, v_teacher_department1;

     3.注意事项

   (1)删除视图后,基于该视图的其他视图(嵌套视图)也会失效,若需使用,需重新创建。

   (2)删除视图不会影响基本表的数据,仅删除视图的定义,因此可放心操作。

3.4 查看视图信息

     在openGauss中,可通过系统视图查询已创建的视图信息(如视图名称、定义、创建时间等),便于视图的管理和调试,以下讲解常用的查看方法。

    1.查看所有视图名称

-- 【实例1-19】查询当前数据库中的所有视图

SELECT viewname FROM pg_views WHERE schemaname = 'student';

    2.查看视图的定义

-- 【实例1-20】查看指定视图的定义(如v_student_class_teacher_major)

SELECT definition FROM pg_views WHERE viewname = 'v_student_class_teacher_major';

    3.查看视图的结构(与查看基本表结构一致)

-- 【实例1-21】查看视图v_student_class_teacher_major的结构(列名、数据类型等)

\d v_student_class_teacher_major;

      3.4 视图权限管理

      在多用户数据库环境中,需为不同用户分配不同的视图权限(如查询、更新、删除),保障数据安全,openGauss中通过GRANT和REVOKE语句管理视图权限,贴合实际开发中的权限管控需求。

      1.授予视图权限

      语法:GRANT 权限类型 ON 视图名 TO 用户名;

      常用权限类型:SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)、ALL(所有权限)

-- 【实例1-22】授予用户student SELECT权限,允许查询视图v_student_class_teacher_major

GRANT SELECT ON v_student_class_teacher_major TO student;

-- 【实例1-23】授予用户student ALL权限,允许对视图v_studentbasicinfor执行所有操作

GRANT ALL ON v_studentbasicinfor TO student;

      2.撤销视图权限

     语法:REVOKE 权限类型 ON 视图名 FROM 用户名;

-- 【实例1-24】撤销用户student对视图v_student_class_teacher_major的SELECT权限

REVOKE SELECT ON v_student_class_teacher_major FROM student;


-- 【实例1-25】撤销用户student对视图v_studentbasicinfor的所有权限

REVOKE ALL ON v_studentbasicinfor FROM student;

     3.注意事项

  (1)只有视图的创建者或超级用户,才能授予或撤销视图的权限。

  (2)授予用户视图的更新、插入、删除权限时,需确保该用户同时具备视图背后基本表的对应权限,否则权限无效。


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。