openGausss视图
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)授予用户视图的更新、插入、删除权限时,需确保该用户同时具备视图背后基本表的对应权限,否则权限无效。
- 点赞
- 收藏
- 关注作者
评论(0)