【MySQL笔记】视图

目录

一、什么是视图?

视图(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;

二、使用视图的优势

  1. 隐藏敏感字段
    例如账户表 account(id, name, balance, password) 中,通过视图仅暴露非敏感字段,将敏感字段balance,password隐藏:
sql 复制代码
create view v_account as 
select id, name from account;
  1. 统一访问规范
    当表结构变更时,假如 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;

三、视图的创建与使用

  1. 创建语法
sql 复制代码
create view view_name [(列别名1, 列别名2, ...)] as
select 语句; // 任意的查询语句都可以
  1. 视图与表连接查询
    视图可像普通表一样参与连接操作:
sql 复制代码
select * from v_student2 s 
join class c on s.class_id = c.id;
  1. 通过视图更新数据
    注意:更新视图会影响基础表,但需满足特定条件:
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复杂度相关,无额外存储开销
维护建议 视图嵌套不超过两层,避免过度封装