视图是一种虚表,视图中的数据并不真实存在,也就是说视图只保存查询的SQL逻辑,不保存查询结果。

创建视图语法:

create or replace view myView as select id,name from tb_user where id<=10;

查看视图数据时把视图当作普通表一样操作即可,比如

select * from myView;

修改视图可以用创建视图一样的语法,也可以用alter代替create or replace

删除视图

Drop view if exists myView;

前面说了视图是虚表,那么我们往视图插入数据会怎么样呢?如果视图是根据表A建立起来的,那么表A就是该视图的基表,往视图插入数据就是往基表插入数据,插入后视图的数据也可能会更新(如果插入数据没满足创建视图的where条件则不更新)。

有时我们需求需要使得插入的数据必须满足创建视图使用的条件,那么我们可以这样创建视图:

create or replace view myView as select id,name from tb_user where id<=20 with local check option;

这样当我们插入的数据不满足id<=20就会报错,数据就不会插入。另外with local check option这里local也有另外一个参数cascaded,它们有什么区别呢?

create view v1 as select id from tb_user where id<=20;

create view v2 as select id from v1 where id>=10 with cascaded check option;

这里我们创建了两个视图,其中v2用了cascaded,那么当我们对v2视图做修改时,其条件不满足id>=10 and id<=20就不会进行修改,如果我们把cascaded改为local,就只判断是否满足id>=10,满足就修改(也会去判断v1的条件是否满足,只是v1没有加检查条件才不用管v1的条件,v1有检查条件还是要管)。

此时我们再来个v3视图:

create view v3 from v2 where id>=15;

如果我们往v3插入id为14的数据可以成功,但是我们插入id为21的数据就是白,因为会有v2和v1的限制。

视图的更新还需要注意:要使视图可更新,就必须让视图中的行与基础表中的行之间必须存在一对一的关系,如果视图中包含以下任何一项,则视图不可更新:

1. 聚合函数(SUM()、MIN()、MAX()、COUNT()等)

2. DISTINCT

3. GROUP BY

4. HAVING

5. UNION 或者 UNION ALL

那么视图有什么作用呢? 

简单

视图可用来简化用户对数据的理解,也可以简化他们的操作。被经常使用的查询可被定义为视图,从而使得用户不必为以后的操作每次指定全部条件。

安全 

数据库的授权不能细化到特定的行或列,那么我们可以通过视图来让用户只能查询或修改他们所能见到的数据。 

方便

有时基表变了可能会影响业务代码,比如name属性名改为了stuname,我们可以通过

create or replace view v1 as select stuname as name from ...

来屏蔽这种修改给业务带来的影响。 

练习

 1. 为了保证用户数据安全性,开发人员在操作tb_user表时,不能看到phone和email两个字段。

create view v1 as select ...(不包含phone和email字段即可)from tb_user;

2. 查询每个学生所选修的课程(s表、c表、sc表),这个功能很多业务都有使用,为了简化操作,定义一个视图。

create view v2 as select s.sno stu_sno,s.name stu_name,c.name course_name 
from s,c,sc where s.sno = sc.sno and c.cno = sc.cno;