视图
- 视图:是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用
- 数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。
- 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
创建视图
视图语法:
create [or replace]
view 视图名称 [(列表名称)]
as
select语句
- or replace:用于替换某个视图
- view:表示创建的是视图
- as:视图是一个虚拟表,最终数据来自于select语句
例子:创建视图,视图为emp表中的ename和job列
create or replace
view view1_emp
as
select ename,job from emp;
查看表和视图
show full tables
查询视图
查看创建视图语句:show create view 视图名称;
查看视图数据:select * from 视图名称
修改视图
方法一:alter view 视图名 as select语句;
方法二:create or replace view 视图名;
方法二是靠or replace 来替换掉视图
删除视图
drop view [if exists] 视图名 [,视图名];
更新视图
- 更新视图
create or replace view view1_emp
as
select ename,job from emp;
update view1_emp set ename = '周瑜' where ename = '鲁肃'; -- 可以修改
insert into view1_emp values('孙权','文员'); -- 不可以插入
要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。
如果视图包含以下任何一项,则该视图不可更新:
- 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
- distinct
- group by
- having
- union 或者 union all
视图不可更新
- 视图包含聚合函数不可更新
create or replace view view2_emp
as
select count(*) cnt from emp;
insert into view2_emp values(100);
update view2_emp set cnt = 100;
- 视图包含distinct不可更新
create or replace view view3_emp
as
select distinct job from emp;
insert into view3_emp values('财务');
- 视图包含goup by 、having不可更
create or replace view view4_emp
as
select deptno ,count(*) cnt from emp group by deptno having cnt > 2;
insert into view4_emp values(30,100);
- 视图包含union或者union all不可更新
create or replace view view5_emp
as
select empno,ename from emp where empno <= 1005
union
select empno,ename from emp where empno > 1005;
insert into view5_emp values(1015,'韦小宝');
- 视图包含子查询不可更新
create or replace view view6_emp
as
select empno,ename,sal from emp where sal = (select max(sal) from emp);
insert into view6_emp values(1015,'韦小宝',30000);
视图的检查选项
当我们创建视图的时候,有筛选条件,然后我们向视图里插入数据的时候,由于视图是虚拟的,不存在的,所以插入视图的数据会插入到原表当中,但是如果插入的数据不满足数据创建时的筛选条件时,会插入到原表当中但是不会再是视图中显示,为避免这种事件的发生,检查选项可以组织不满足视图创建条件的命令执行。
语法:
在创建视图的语句后面直接添加with cascaded check option
或者with local check option
当加上了检查选项之后,在向视图中添加数据的时候会检查是否满足筛选条件
creat view v1 as select id,name from student where id<=20;
creat view v2 as select id,name from v1 where id>=15 with cascaded check option ;
creat view v3 as select id,name from v2 where id>=10 with cascaded check option ;
当向v3表中添加数据的时候,v3有检测选项,需要检测数据是否可行,然后递归的向上找,找到v2后需要检测,进行检测,然后再递归的向上找,找到v1,v1没有检测选项,不需要检测
视图作用
-
简单
视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。 -
安全
数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据 -
数据独立
视图可帮助用户屏蔽真实表结构变化带来的影响。
视图的案例
1). 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段
create view tb_user_view
as
select id,name,profession,age,gender,status,createtime
from tb_user;
select * from tb_user_view;
2). 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
create view tb_stu_course_view
as
select s.name student_name , s.no student_no ,c.name course_name
from student s, student_course sc , course c
where s.id =sc.studentid and sc.courseid = c.id;
select * from tb_stu_course_view;