为什么使用视图
封装查询
数据库虽然可以存储海量数据,但是在数据表设计上却不可能为每种关系创建数据表。例如,对于学生表,存储了学生信息,学生的属性包括学号、姓名、年龄、家庭地址等信息;而学生成绩表只存储了学生学号、科目、成绩等信息。现需获得学生姓名及成绩信息,那么就需要创建一个关系,该关系需要包含学生姓名、科目、成绩。但为该关系创建一个新的数据表,并利用实际信息进行填充,以备查询使用,是不适宜的。因为这种做法很明显的造成了数据库中数据的大量冗余。视图则是解决该问题的最佳策略。因为视图可以存储查询定义(或者说关系运算),那么,一旦使用视图存储了查询定义,就如同存储了一个新的关系。用户可以直接对视图中所存储的关系进行各种操作,就如同面对的是真实的数据表。这就像mybatis在关联查询时使用中间表的概念是一样的。
灵活的控制安全性
一个数据表可能含有很多列。但是这些列的信息,对于不同角色的用户,可访问的权限有可能不同。例如,在员工表中,可能存在着员工工号、员工姓名、员工年龄、员工职位、员工家庭住址、员工社会关系等信息。对于普通用户(例如普通员工),有可能需要访问员工表,来查看某个工号的员工的姓名、职位等信息,而不允许查看家庭住址、社会关系等信息;对于高级用户(例如人事经理),则需要关注所有信息。那么,这就涉及数据表的安全性。利用视图可以灵活地实现这一策略。例如,可以首先创建名为vw_employees的视图。该视图的查询定义为,选择员工表中员工工号、员工姓名、员工职位等3列。这相当于在员工关系中,进行投影运算,即选择员工工号、员工姓名、员工职位这3个属性,形成新的关系,如图11-2所示
图11-2 利用投影运算获得普通用户使用的视图vw_employees
同样,对于高级用户,可以创建名为vw_employees_hr的视图,该视图选择员工表中所有列,如图11-3所示。
视图的操作
-
创建视图
-
Mysql创建两张表,学生表和课程表
-
-
-
-
如果有需要要求我们列出每个学生所学修的课程名称。当然这个需求比较简单,在复杂的查询中视图的作用很更加明显
-
创建视图:
-
create view new_stu(id,NAME,gend) as select s.id,s.`name`,s.gender from student s;
视图创建后,数据直接就存放在视图中,实际上视图就是一张虚拟的表。实际上我在想,视图是不是也提升了性能。 -
-
查询视图
-
查看视图的基本信息,DESC
-
-
此处大部分信息显示为NULL,更加说明了视图只是一张虚拟表
-
删除视图用drop命令,更新视图可以之间删除重新创建。
-