← 返回首页
MySQL基础教程(十八)
发表时间:2020-03-18 13:03:53
讲解MySQL视图

视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。

1.为什么要使用视图

1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。 2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。 3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

2.如何创建视图

基本语法如下:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
   [WITH [CASCADED | LOCAL] CHECK OPTION]

实例: 测试数据延续使用"MySQL连接"章节所用到的三张数据表:学生表、课程表和成绩表。

创建students_score_view视图。

create or replace view students_score_view as
select stu.sid ,sname,s.cid ,c.cname, score 
from score s 
inner join students stu on s.sid = stu.sid 
inner join course c on s.cid = c.cid

3.视图的操作

使用show create view 视图名字 来查看视图信息。 例如:

show create view students_score_view

视图一旦创建完毕,就可以像一个普通表那样使用,视图主要用来查询。

select sid as 学号,sname as 姓名,cid as 课程编号,cname as 课程名称,score as 分数 from students_score_view;

++DML操作更新视图++

因为视图本身没有数据,因此对视图进行的dml操作最终都体现在基表中。 例如:

update students_score_view set sname = '张三丰' where sid = 1;
select * from students;

当然,视图的DML操作,不是所有的视图都可以做DML操作。

有下列内容之一,视图不能做DML操作: 1.select子句中包含distinct 2.select子句中包含组函数 3.select语句中包含group by子句 4.select语句中包含order by子句 5.select语句中包含union 、union all等集合运算符 6.where子句中包含相关子查询 7.from子句中包含多个表 8.如果视图中有计算列,则不能更新 9.如果基表中有某个具有非空约束的列未出现在视图定义中,则不能做insert操作。

++删除视图++

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不动基表,其语法如下:

DROP VIEW [IF EXISTS]   
view_name [, view_name] ...

例如:

DROP VIEW IF EXISTS  students_score_view

++WITH CHECK OPTION约束++

对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束。

例如:

create or replace view students_score_view as
select stu.sid ,sname,s.cid ,c.cname, score 
from score s 
inner join students stu on s.sid = stu.sid 
inner join course c on s.cid = c.cid
where score >=70 with check option;  /*只查询考试分数大于70的视图*/

select * from students_score_view

通过视图尝试修改编号为1的学生成绩为60,会抛出异常:

update students_score_view set score=60 where sid = 1;
> 1369 - CHECK OPTION failed 'myschool.students_score_view'
> 时间: 0s

通过,观察尝试执行插入操作也不行(即便是插入成绩大于70的数据),因为视图from子句中包含有多张表。

insert into students_score_view (sname,cid,cname,score) values ('王大锤','C001','Java',80)
> 1393 - Can not modify more than one base table through a join view 'myschool.students_score_view'
> 时间: 0s

++嵌套视图++

定义在另一个视图的上面的视图。

例如:

create or replace view students_score_view_sub as
select sname,cname, score 
from students_score_view;

select * from students_score_view_sub

4.视图与表的区别

1、视图是已经编译好的sql语句。而表不是。 2、视图没有实际的物理记录。而表有。 3、表是内容,视图是窗口 4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改 5、表是内模式,视图是外模式 6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。 7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。 8、视图的建立和删除只影响视图本身,不影响对应的基本表。