【MySQL】(9) 视图
一、什么是视图
视图是一张虚拟表,是表、其它视图的查询结果集。它本身不像基础表(物理表)一样存储数据,而是将 SQL 查询语句包装起来,通过执行查询语句动态生成数据。
二、视图的作用
当我们需要频繁使用一条查询语句(涉及到多表连接)时,每次都写一遍非常地麻烦,把这条查询语句包装成视图(一张表的形式),就可以直接查询联合后的表(视图),让 SQL 语句更简洁。
三、创建视图
1、语法
create view 视图名 (查询列表名) as 查询语句
2、示例
现有一个 SQL 查询语句进行4表连接:
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
order by s.id;
包装成视图(列名存在重复,如 id、name):
要么完整列出视图列名,起不重复的列名:
要么不列出视图列名,在查询语句中给查询列名起别名:
查询视图:
2、隐藏敏感信息
比如查询用户的总分,但不能查询用户的个人信息以及各科分数。
创建一个只包含学生 id、name 和总分的视图(限制只能访问该视图,不能访问 student、score 表即可实现隐藏敏感信息):
3、应用程序与数据库的解耦
如果客户端或者 Java 应用程序能直接访问数据库中的真实表,一旦真实表结构发生改变,客户端就需要修改 SQL 语句,Java 应用程序也需要修改代码。
例如:Java 应用程序访问字段的方式有两种:根据查询结果集的列下标访问(字段顺序发生变化需要修改);根据查询结果集的字段名访问(字段名发生变化需要修改)。
为了让真实表结构发生改变时,客户端或者应用程序不受影响,需要创建一个视图。当真实表改变,修改视图即可。
4、视图的优点
- 简单性。
- 安全性。
- 逻辑数独立性:应用程序的逻辑视图与物理存储的结构之间解耦。
四、修改视图
- 修改基表会影响视图,修改视图会影响基表。
- 以下视图不可更新:
- 使用distinct、聚合函数、group by、having、order by、join、子查询、union、union all 的视图。
- from 子句引用不可更新视图的视图。
示例:创建视图 v_student_score 使用了 order by,无法修改。
五、删除视图
跟删除真实表一样: