视图
- 视图(view)是一个从单张或多张基础数据表或其他视图中构建出来的虚拟表。
- 同基础表一样,视图中也包含了一系列带有名称的列和行数据,但是数据库中只是存放视图的定义,也就是动态检索数据的查询语句,而并不存放视图中的数据,只有当用户使用视图时才去数据库请求相对应的数据,即视图中的数据是在引用视图时动态生成的。
- 如果基本表中的数据发生了变化,视图中相应的数据也会跟着改变。
视图的好处
- 简化用户操作:视图可以使用户将注意力集中在所关心地数据上,而不需要关心数据表的结构、与其他表的关联条件以及查询条件等
- 对机密数据提供安全保护:有了视图,就可以在设计数据库应用系统时,对不同的用户定义不同的视图,避免机密数据出现在不应该看到这些数据的用户视图上。
SQL示例
-- 视图
-- 创建/替换单表视图:
create or replace view myview01
as
select empno,ename,job,deptno
from emp
where deptno = 20
with check option;
-- 删除视图
drop view myview01;
-- 查看视图:
select * from myview01;
-- 在视图中插入数据:
insert into myview01 (empno,ename,job,deptno) values (9999,'lili','CLERK',20);
-- 在视图中插入数据,会相应的插入到真实数据表中
insert into myview01 (empno,ename,job,deptno) values (8888,'nana','CLERK',30);
-- 创建视图的时候,如果没有加 check option的话,上面这条语句会成功将数据同步插入到真实数据中
insert into myview01 (empno,ename,job,deptno) values (7777,'feifei','CLERK',30);
-- 而创建视图的时候,添加了 check option 那么上面这条语句就不会执行成功,会出现下面的错误
-- > 1369 - CHECK OPTION failed 'mytestdb.myview01'
-- 创建/替换多表视图:
create or replace view myview02
as
select e.empno,e.ename,e.sal,d.deptno,d.dname
from emp e
join dept d
on e.deptno = d.deptno
where sal > 2000 ;
select * from myview02;
-- 创建统计视图:
create or replace view myview03
as
select e.deptno,d.dname,avg(sal),min(sal),count(1)
from emp e
join dept d
using(deptno)
group by e.deptno ;
select * from myview03;
-- 创建基于视图的视图:
create or replace view myview04
as
select * from myview03 where deptno = 20;
select * from myview04;