由于我们上讲复习了前面的所有知识点,所以今天不再去复习之前的知识了,我们直接开始正题。
1.什么是视图?
视图是⼀个虚拟的表,它是基于⼀个或多个基本表或其他视图的查询结果集。视图本⾝不存储数 据,⽽是通过执⾏查询来动态⽣成数据。⽤⼾可以像操作普通表⼀样使⽤视图进⾏查询、更新和管 理。视图本⾝并不占⽤物理存储空间,它仅仅是⼀个查询的逻辑表⽰,物理上它依赖于基础表中的数 据。
2.视图基本概念
- 视图(View):视图是一个虚拟表,基于一个或多个表的查询结果。视图不存储实际数据,它只是在使用时运行SQL查询来生成结果。
- 用途:可以简化复杂的隐藏查询、提升数据安全性(字段)、实现数据聚合或某些分区等功能。
3.创建视图
基本语法
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
示例
假设有一个名为sanguo
的表,包含学生的id
、name
和成绩。我们可以创建一个视图,筛选出所有数学超过 80 的学生:
解释:
- 该视图
see_sanguo
将显示所有数学超过 80 的学生。 - 我们在这里可以看到视图下面有我们刚定义的see_sanguo的视图表
- 视图可以像表一样查询,例如:
SELECT * FROM see_sanguo;
3. 使用视图查询数据
视图一旦创建,就可以像表格一样进行查询:
SELECT * FROM see_sanguo;
视图查询的结果是动态生成的,因此每次执行视图查询时,都是基于原始表当前数据生成的,不需要担心数据同步问题。
4. 修改视图定义
如果需要修改视图的定义,可以使用ALTER VIEW
或CREATE OR REPLACE VIEW
语句。
CREATE OR REPLACE VIEW view_name AS
SELECT new_column1, new_column2, ...
FROM table_name
WHERE new_condition;
示例
我们将see_sanguo
的条件修改为数学超过90:
CREATE OR REPLACE VIEW see_sanguo AS
SELECT *
FROM sanguo
WHERE math > 90;
修改后得视图的定义表
5. 删除视图
如果不再需要某个视图,可以使用DROP VIEW
删除它。
DROP VIEW view_name;
示例
6. 视图应用程序场景
简化综合
视图可以将复杂的SQL查询封装起来,简化查询过程。例如,通过视图创建聚合或计算字段,用户只需查询视图,而不需要重新编写复杂的SQL语句。
数据安全性
可以通过视图限制用户特定访问数据。例如,只给用户提供特定字段或条件下的数据,而隐藏敏感信息。
数据聚合与分组
视图可以用于创建数据的聚合或分组,例如计算命令、总和等统计数据。
7.观点的优缺点
优点
- 简单性:视图可以将复杂的查询封装成⼀个简单的查询。例如,针对⼀个复杂的多表连接查询,可 以创建⼀个视图,⽤⼾只需查询视图⽽⽆需了解底层的复杂逻辑。
- 数据安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的⽤⼾表中,可以创建⼀个不包含 密码列视图,普通⽤⼾只能访问这个视图,⽽不能访问原始表。
- 数据更新同步:视图本质上是一个查询,数据更新时自动反映在视图中。
- 逻辑数据独立性:视图提供了⼀种逻辑数据独⽴性,即使底层表结构发⽣变化,只需修改视图定 义,⽽⽆需修改依赖视图的应⽤程序。使⽤到应⽤程序与数据库的解耦 。
- 重命名列:视图允许⽤⼾重命名列名,以增强数据可读性。
缺点
- 性能问题:ViewQuery每次运行都会重新执行查询,复杂View可能会增加查询负担。
- 更新限制:有些视图不能直接更新数据(特别是多表连接的视图)。
- 依赖:视图依赖基础表结构,如果基础表发生改变,视图可能需要重建。
8. 审查的更新限制
视图并不总是可以更新,更新限制取决于视图的复杂性。以下是一些更新限制的情况:
- 单表视图:仅当视图基于单个表,且不包含聚合、分组等复杂操作时,视图可以更新。
- 多表视图:基于多表的视图通常是不可更新的。
- 含有聚合或分组操作的视图:视图中包含
GROUP BY
、、SUM
等AVG
操作时不可更新。 - DISTINCT、JOIN 等:含有这些关键字的视图通常也是不可更新的。
检查报告是否可以更新
可以通过IS_UPDATABLE
字段来查看视图是否可以更新:
SHOW TABLE STATUS WHERE Name='view_name';
9.注意事项
• 修改真实表会影响视图,修改视图同样也会影响真实表
• 以下视图不可更新:
创建视图时使⽤聚合函数的视图
创建视图时使⽤ DISTINCT
创建视图时使⽤ GROUP BY 以及 HAVING ⼦句
创建视图时使⽤ UNION 或UNION ALL
查询列表中使⽤⼦查询
在FROM⼦句中引⽤不可更新视图
10. 小结
MySQL View提供了一种方便管理复杂查询和提高数据安全性的方式,通过View可以:
- 封装查询;
- 实现数据隔离和数据隐藏;
- 提供聚合或聚合信息。
视图,在性能和数据更新上有一定的限制,使用时要根据业务需求进行权衡。