【MySQL】视图:简化查询、保障安全的虚拟表

文章目录

一、什么是视图

视图是基于一张或多张基表/其他视图的查询结果集。特点:

  • 虚拟性:不占用物理存储空间,数据实时来自基表,基表变视图同步变;
  • 逻辑封装:把复杂多表关联、聚合查询存为一个视图,调用时像查普通表一样简单;
  • 权限隔离:可隐藏敏感字段,控制用户可访问的数据范围;
  • 双向联动:修改基表影响视图,符合条件的视图修改也会同步到基表。

二、视图语法

sql 复制代码
-- 1. 创建视图
create view 视图名 [(列名列表)] as 查询语句;

-- 2. 查询视图(和普通表完全一样)
select * from 视图名 [where 条件];

-- 3. 删除视图
drop view 视图名;

三、学生成绩系统视图案例

用 student(学生)、class(班级)、course(课程)、score(成绩)四张表演示。

1. 多表关联查询封装为视图

原始多表查询要写大量关联条件,复用性极差

sql 复制代码
-- 多表查询
select 
  s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
  c.id class_id, c.name class_name,
  co.id course_id, co.name course_name,
  sc.id score_id, sc.score
from student s, class c, course co, score sc
where s.class_id = c.id
  and sc.student_id = s.id
  and sc.course_id = co.id
order by s.id;

方式1:创建视图并给列起别名

sql 复制代码
create view v_student_score as
select 
  s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
  c.id as class_id, c.name as class_name,
  co.id as course_id, co.name as course_name,
  sc.id as score_id, sc.score
from student s, class c, course co, score sc
where s.class_id = c.id
  and sc.student_id = s.id
  and sc.course_id = co.id
order by s.id;

方式2:创建时直接指定列名

sql 复制代码
create view v_student_score_v1 
(id, name, sno, age, gender, enroll_date, 
class_id, class_name,
course_id, course_name, 
score_id, score) 
as 
select 
  s.id, s.name, s.sno, s.age, s.gender, s.enroll_date,
  c.id, c.name, co.id, co.name, sc.id, sc.score
from student s, class c, course co, score sc
where s.class_id = c.id
  and sc.student_id = s.id
  and sc.course_id = co.id;

一键查询视图

sql 复制代码
select * from v_student_score;
select * from v_student_score_v1;

2. 聚合统计视图

隐藏学号、各科成绩,只展示学生姓名与总分。

sql 复制代码
-- 创建总分视图
create view v_student_total_points as
select 
  s.id, s.name, sum(sc.score) total
from student s, score sc 
where s.id = sc.student_id 
group by s.id 
order by s.id;

-- 查询视图
select * from v_student_total_points;

3. 视图与基表联动更新

① 修改基表 → 视图自动更新

sql 复制代码
update score set score = 99 where student_id = 1 and course_id = 1;
select * from v_student_score;

② 视图更新 → 基表同步

sql 复制代码
-- 含 order by,更新失败
update v_student_score set score = 99 where score_id = 3;

-- 简单视图可更新
update v_student_score_v1 set score = 99 where score_id = 3;
select * from score where student_id = 1 and course_id = 5;

四、不可更新的视图

以下视图不能 update/insert/delete:

  1. 使用聚合函数(sum/count/avg/min/max)
  2. 使用 distinct / group by / having
  3. 使用 union / union all
  4. 查询列表包含子查询
  5. 引用不可更新视图

五、视图的优点

  1. 简化查询:封装复杂多表查询,一行调用
  2. 数据安全:隐藏敏感字段,控制访问范围
  3. 逻辑解耦:基表结构变化只需改视图,不影响应用
相关推荐
IvorySQL24 分钟前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
刘胡子大叔1 小时前
SQL 脚本的导入顺序
数据库·sql
代码什么用1 小时前
Spring对IoC的实现
数据库·spring
hz567893 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC3 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday3 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
半杯咖啡半行码4 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
Yyyyyy~4 小时前
[ Mysql ] 库的操作
mysql
小米里的大麦4 小时前
16 MySQL 事务
数据库·mysql
西柚小萌新4 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库