一、视图的基本概念视图是从基本表中导出的虚表数据库中仅存储视图的定义语句并不存储视图对应的实际数据视图展示的数据仍存放在原始基本表中。视图的查询结果会随基本表的数据变化而实时变化因为每次查询视图本质都是执行其定义中的子查询去基本表中获取最新数据。视图的核心作用简化复杂查询、实现数据访问控制、屏蔽表结构变化对应用的影响。二、视图的创建CREATE VIEW1. 基本语法CREATE VIEW 视图名 [(列名列表)] AS 子查询 [WITH CHECK OPTION];总结仅基于单张基本表、无聚合、无派生列、无分组的视图才能正常执行增删改操作。五、视图的删除DROP VIEW1. 基本语法示例示例⚠️ 注意事项列名列表可选若子查询中包含派生列、聚合列或多表连接有重名列时必须显式指定WITH CHECK OPTION关键约束对视图执行增删改操作时数据库会自动校验操作的行是否满足子查询的条件保证操作后的数据仍能被视图查询到。2. 常见创建场景1单表创建视图带 / 不带 WITH CHECK OPTION场景创建信息系学生的视图仅展示学号、姓名、年龄-- 基础版无校验增删改可能导致数据脱离视图范围 CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept IS; -- 带校验版增删改时强制校验SdeptIS CREATE VIEW IS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept IS WITH CHECK OPTION;2多表连接创建视图场景创建信息系选修 1 号课程的学生视图包含学号、姓名、成绩-- 方式1多表逗号连接 CREATE VIEW IS_S1 (Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Grade FROM Student, SC WHERE Student.Sno SC.Sno AND SC.Cno 1 AND Sdept IS; -- 方式2JOIN显式连接推荐可读性更高 CREATE VIEW IS_S1 (Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Grade FROM Student JOIN SC ON Student.Sno SC.Sno WHERE SC.Cno 1 AND Sdept IS;3基于视图创建视图视图嵌套场景创建信息系选修 1 号课程且成绩 90 分以上的学生视图基于已创建的 IS_S1 视图CREATE VIEW IS_S2 AS SELECT Sno, Sname, Grade FROM IS_S1 WHERE Grade 90;4包含派生属性列的视图场景创建学生视图包含学号、姓名、出生年份出生年份 2014 - 年龄派生列CREATE VIEW BI_S (Sno, Sname, Sbirth) AS SELECT Sno, Sname, 2014 - Sage FROM Student;5分组视图带聚合函数 GROUP BY场景创建学生学号及对应平均成绩的视图聚合函数 AVGGROUP BYCREATE VIEW S_G (Sno, Gavg) AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;6全列筛选创建视图场景创建 Student 表中所有女生的视图显式指定列名CREATE VIEW F_Student (F_sno, name, sex, age, dept) AS SELECT * FROM Student WHERE sex 女;三、视图的查询SELECT查询视图的语法与查询基本表完全一致数据库会自动将视图查询转换为对基本表的子查询执行。1. 单视图简单查询场景在信息系学生视图中查询年龄小于 20 岁的学生SELECT Sno, Sage FROM IS_Student WHERE Sage 20; -- 数据库自动转换为对基本表的查询 -- SELECT Sno, Sage FROM Student WHERE Sdept IS AND Sage 20;2. 视图与表连接查询场景查询选修 1 号课程的信息系学生视图 IS_Student 与表 SC 连接SELECT IS_Student.Sno, Sname FROM IS_Student JOIN SC ON IS_Student.Sno SC.Sno WHERE SC.Cno 1;3. 分组视图的查询场景在平均成绩视图 S_G 中查询平均成绩 90 分以上的学生-- 分组视图已聚合直接用WHERE无需再GROUP BY/HAVING SELECT Sno, Gavg FROM S_G WHERE Gavg 90; -- 若直接查基本表需用HAVINGWHERE不能跟聚合函数 SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade) 90;核心区别WHERE过滤原始行不能跟聚合函数HAVING过滤分组后的聚合行可跟聚合函数。四、视图的更新INSERT/UPDATE/DELETE视图是虚表对视图的增删改操作数据库会自动转换为对基本表的对应操作语法与操作基本表一致。1. 视图的修改UPDATE场景将信息系学生视图 IS_Student 中学号 201215122 的姓名改为刘辰-- 操作视图 UPDATE IS_Student SET Sname 刘辰 WHERE Sno 201215122; -- 数据库自动转换为操作基本表 UPDATE Student SET Sname 刘辰 WHERE Sno 201215122 AND Sdept IS;2. 视图的插入INSERT场景向信息系学生视图 IS_Student 插入一条学生记录-- 操作视图 INSERT INTO IS_Student VALUES (201215129, 赵新, 20); -- 数据库自动转换为操作基本表补充SdeptIS符合视图条件 INSERT INTO Student (Sno, Sname, Sage, Sdept) VALUES (201215129, 赵新, 20, IS);3. 视图的删除DELETE场景从信息系学生视图 IS_Student 中删除学号 201215129 的记录-- 操作视图 DELETE FROM IS_Student WHERE Sno 201215129; -- 数据库自动转换为操作基本表 DELETE FROM Student WHERE Sno 201215129 AND Sdept IS;4. 视图的更新限制并非所有视图都支持更新以下场景的视图不可更新插入 / 修改部分可删除视图由两个及以上基本表导出视图字段来自字段表达式 / 常数如派生列 2014-Sage不可插入 / 修改可删除视图字段来自聚合函数如 AVG、SUM、COUNT视图定义中包含GROUP BY子句、DISTINCT短语视图定义中有嵌套查询且内层查询的 FROM 子句涉及导出该视图的基本表总结仅基于单张基本表、无聚合、无派生列、无分组的视图才能正常执行增删改操作。五、视图的删除DROP VIEW1. 基本语法-- 普通删除仅删除当前视图若有视图基于它创建则报错 DROP VIEW 视图名; -- 级联删除删除当前视图及所有由它导出的视图部分数据库语法DROP VIEW 视图名 CASCADE; DROP VIEW 视图名 CASCADE;2. 删除注意事项基本表被删除后由该基本表导出的所有视图无法使用但视图的定义仍会保存在数据库字典中需手动执行 DROP VIEW 删除若视图上还导出了其他视图直接普通删除该视图会被数据库拒绝执行需使用级联删除。-- IS_S2基于IS_S1创建普通删除IS_S1会报错 DROP VIEW IS_S1; -- 拒绝执行 -- 级联删除IS_S1及由它导出的IS_S2 DROP VIEW IS_S1 CASCADE; -- 成功执行 -- 删除单个无依赖的视图 DROP VIEW BI_S; -- 成功执行六、视图的核心使用总结 优点简化查询将复杂的多表连接、聚合查询封装为视图后续查询直接调用视图减少代码冗余数据安全仅向用户开放视图的访问权限屏蔽基本表中敏感字段如密码、身份证实现精细化的访问控制视图仅存储定义不存储数据频繁查询复杂视图可能影响性能每次查询都要执行子查询WITH CHECK OPTION是保障视图数据一致性的关键涉及视图增删改时建议添加避免多层视图嵌套过多嵌套会导致查询性能下降且不易排查问题分组视图、聚合视图仅用于查询不可更新需明确视图的使用场景。解耦表结构若基本表的结构发生变化如新增列、修改列名只需修改视图的定义无需修改应用程序的查询语句降低维护成本。