MySQL视图(Views)是基于一条或多条SQL查询语句的虚拟表,它本身不存储实际的数据,每次查询视图时都会动态执行对应的底层查询逻辑。视图可以把复杂的查询逻辑封装起来,同时也能对数据访问权限做精细化控制,在实际开发中有非常高的实用价值。

什么是MySQL视图
视图可以理解为一个保存好的查询语句别名,当你查询视图时,MySQL会先执行视图定义中的查询语句,再把结果返回给你。视图的结构和普通表类似,有行有列,但是所有数据都来自底层的基础表,对视图的增删改操作最终也会映射到基础表上,不过不是所有视图都支持写操作。
视图的基本特性
- 虚拟性:不占用额外的存储空间存储数据,仅保存查询定义
- 动态性:每次查询视图都会重新执行底层查询,数据始终和基础表保持一致
- 权限独立性:可以给视图单独设置访问权限,和基础表的权限互不干扰
用视图简化复杂查询
实际业务中经常会遇到需要多表关联、多次条件过滤的复杂查询,如果每次业务需要都写一遍完整的复杂SQL,不仅代码冗余,还容易出错。这时候就可以把复杂查询封装成视图,后续只需要查询视图即可。
场景示例:多表关联查询封装
假设我们有用户表user和订单表order,需要经常查询用户的订单总金额,原始查询语句如下:
-- 原始复杂查询,需要关联两张表并做聚合计算
SELECT
u.id AS user_id,
u.name AS user_name,
SUM(o.amount) AS total_order_amount
FROM
user u
LEFT JOIN
order o ON u.id = o.user_id
WHERE
u.status = 1
GROUP BY
u.id, u.name;
我们可以把这个查询封装成视图user_order_stat:
-- 创建视图封装复杂查询
CREATE VIEW user_order_stat AS
SELECT
u.id AS user_id,
u.name AS user_name,
SUM(o.amount) AS total_order_amount
FROM
user u
LEFT JOIN
order o ON u.id = o.user_id
WHERE
u.status = 1
GROUP BY
u.id, u.name;
后续需要查询用户订单统计信息时,只需要执行简单的查询即可:
-- 查询视图,等价于执行上面的复杂查询 SELECT * FROM user_order_stat WHERE user_id = 1001;
用视图增强数据安全性
MySQL的权限控制可以精确到表级别,但是很多时候我们需要更细粒度的权限控制,比如只允许某个用户查看用户表的id和name字段,不能查看手机号、身份证等敏感字段,这时候视图就能发挥作用。
场景示例:敏感字段脱敏
用户表user包含手机号phone、身份证号id_card等敏感字段,我们可以创建一个不包含敏感字段的视图,只给普通业务人员开放这个视图的查询权限:
-- 创建不包含敏感字段的视图
CREATE VIEW user_public_info AS
SELECT
id,
name,
age,
gender
FROM
user
WHERE
status = 1;
然后给普通用户只授予user_public_info视图的查询权限,不授予user表的任何权限:
-- 创建普通业务用户 CREATE USER 'biz_user'@'localhost' IDENTIFIED BY 'password123'; -- 只授予视图的查询权限 GRANT SELECT ON test_db.user_public_info TO 'biz_user'@'localhost'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
这样biz_user用户就只能查询到视图中暴露的非敏感字段,无法直接访问user表,也无法获取敏感信息,有效提升了数据安全性。
视图的注意事项
- 视图的查询性能取决于底层基础表的查询性能,如果底层查询很复杂,视图的查询也会比较慢,必要时可以给基础表添加合适的索引
- 不是所有视图都支持INSERT、UPDATE、DELETE操作,比如包含聚合函数、GROUP BY、DISTINCT的视图就不支持写操作
- 修改基础表结构后,最好检查依赖的视图是否还能正常运行,避免出现查询错误
视图与表的对比
为了更清晰区分视图和普通表,我们可以看下面的对比:
| 对比项 | 普通表 | 视图 |
|---|---|---|
| 数据存储 | 存储实际数据 | 不存储实际数据,仅保存查询定义 |
| 占用空间 | 占用磁盘存储空间 | 几乎不占用额外存储空间 |
| 查询性能 | 取决于表结构和索引 | 取决于底层查询和基础表性能 |
| 权限控制 | 表级别权限 | 可做到字段、行级别权限 |
视图是MySQL中非常实用的功能,合理使用视图可以大幅降低复杂查询的维护成本,同时也能实现更灵活的数据权限控制,建议大家在合适的业务场景中尝试使用。