目录
一、什么是视图?
视图(View)是一种虚拟表,不存储实际数据,而是通过执行预定义的查询动态生成数据。用户可以像操作普通表一样对视图进行查询、更新和管理,但其数据完全依赖于基础表。视图的核心价值在于:
- 封装复杂查询,简化数据访问。
- 隐藏敏感字段(如密码、余额)。
- 对外提供一致的列名和结构,避免业务代码频繁修改。
sql
-- 示例:创建学生成绩视图
create view v_student_score as
select
s.id,
s.name,
s.sno,
cls.name as class_name,
c.name as course_name,
sco.score
from
student s,
class cls,
score sco,
course c
where s.class_id = cls.id,
and sco.student_id = s.id,
and sco.course_id = c.id;
二、使用视图的优势
- 隐藏敏感字段
例如账户表 account(id, name, balance, password) 中,通过视图仅暴露非敏感字段,将敏感字段balance,password隐藏:
sql
create view v_account as
select id, name from account;
- 统一访问规范
当表结构变更时,假如 DBA 修改了 student 表,将列 sno 重命名为 number,如果不使用视图,那么就需要大量改动业务代码,将列 sno 重命名为 number,但是如果使用视图,则只需调整视图定义,业务代码不需要改动,只需要将查询语句的 sno 改为 number 即可,对外访问的"接口"依旧是 sno:
sql
-- 旧视图
create view v_student (id, name, sno) as
select id, name, sno from student;
-- 新视图(适应列名变更)
create view v_student (id, name, sno) as
select id, name, number from student;
三、视图的创建与使用
- 创建语法
sql
create view view_name [(列别名1, 列别名2, ...)] as
select 语句; // 任意的查询语句都可以
- 视图与表连接查询
视图可像普通表一样参与连接操作:
sql
select * from v_student2 s
join class c on s.class_id = c.id;
- 通过视图更新数据
注意:更新视图会影响基础表,但需满足特定条件:
sql
-- 更新视图(会影响基础表score)
update v_student_score1 set score = 95 where id = 1;
四、不能更新视图的场景
以下类型的视图不支持更新操作:
- 使用聚合函数(如 SUM(), COUNT())。
- 使用 distinct 或 group by / having。
- 使用 union 或 union all。
- 包含子查询的 select 列表。
- from 子句中引用不可更新视图。
- 包含 order by 子句,可能导致更新失败。
五、删除视图
sql
-- 可以删除单个视图
drop view v_student;
-- 可以批量删除视图
drop view v_student2, v_student_score;
六、总结
特性 | 说明 |
---|---|
存储 | 不存储数据,依赖基础表动态生成 |
核心用途 | 简化复杂查询、隐藏敏感字段、统一数据接口 |
更新限制 | 避免聚合、分组、排序等场景 |
性能影响 | 查询性能与底层SQL复杂度相关,无额外存储开销 |
维护建议 | 视图嵌套不超过两层,避免过度封装 |