【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. 逻辑解耦:基表结构变化只需改视图,不影响应用
相关推荐
糖果店的幽灵2 分钟前
【langgraph 从入门到精通graphApi 篇】LangGraphAPI 方式调用 - 初识与核心概念
数据库·人工智能·langgraph
TlSfoward41 分钟前
TLSFOWARD TLS指纹
开发语言·数据库·爬虫·搜索引擎·https·php
️学习的小王1 小时前
MySQL 实战:从建表到索引管理的完整指南
数据库·mysql·oracle
宠友信息3 小时前
MySQL复合索引与Druid优化仿小红书源码个人主页查询链路
数据库·spring boot·websocket·mysql·uni-app
minji...3 小时前
MySQL数据库 (十九) MySQL图像化界面,MySQL连接池
数据库·mysql·navicat·mysql workbench·mysql连接池·数据库图形化界面
文档搬运工3 小时前
Innodb Cluster安装
mysql
想躺平的小羊3 小时前
MySQL中LAST_DAY函数用法
数据库·mysql
光影6274 小时前
MySQL基础入门
数据库·笔记·sql·学习·mysql·学习方法
qetfw4 小时前
CentOS 7 搭建 MariaDB 数据库服务
linux·数据库·centos·mariadb
光影6274 小时前
MySQL 进阶篇 —— 事务 / 外键 / 索引 / 高级查询
数据库·笔记·sql·学习·mysql