对于 scott 用户下的 emp 表:
假设:
张三 只关注 EMPNO、ENAME、JOB,张三希望用 select * from emp 语句只能查询到他所关注的字段,其他字段不要;
李四 只关注 ENAME、JOB、MGR,李四希望用 select * from emp 语句只查询到他所关注的三个字段;
王五 只关注 ENAME、SAL、COMM,同样王五也希望用 select * from emp 语句只查询到他所关注的三个字段;
对于这种问题,可以通过视图来解决。
只有视图才能解决,不同的角色,只访问他们所关注的内容。
什么是视图(View):
1、视图是一种虚表;
2、视图是建立在已有表的基础上,视图赖以建立的这些表称为基表;
3、向视图提供数据内容的语句为 select 语句,可以将视图理解为 存储起来的 select 语句;
4、视图向用户提供基表数据的另一种表现形式;
5、视图没有存储真正的数据,真正的数据还是存储在基表中;
6、程序员虽然操作的是视图,但最终视图还是会转换成操作基表;
7、一个基表可以有 0 个或多个视图;
什么情况下会用到视图?
1、如果不想让用户看到所有数据(字段、记录),只想让用户看到某些数据时;
2、如果想简化 sql 查询语句的编写时,可以使用视图;但不会提高查询效率;
视图的作用:
1、限制数据访问;
2、简化复杂查询;
3、提供数据的相互独立;
4、同样的数据,可以有不同的显示方式;
1、基于 emp 表所有列,创建视图 emp_view_1:
语法:create view 视图名 as select 对一张或多张基表的查询;
报错 “权限不足”,查看 scott 用户的权限:
可以发现,scott 用户默认情况下只有一个权限:UNLIMITED TABLESPACE,表示可以无限使用内存空间,即无限建表;
所以,需要通过 sysdba 管理员给 scott 用户赋予 创建视图(create view)的权限:
然后再创建视图就可以成功了:
创建好视图以后,可以通过 select * from tab 语句查看当前用户下的所有对象:
2、调用视图:视图只是一个虚表,视图里存的是 sql 语句,并不是真正的数据;
把视图当做普通的表一样去查询,oracle 服务器会执行视图(emp_view_1)里的 select 语句,真正操作的还是 emp 表;
3、 基于 emp 表指定列,创建视图 emp_view_2,该视图包含 编号、姓名、工资、年薪、年收入(查询中使用列别名):
4、把视图 emp_view_2 看作是一个表,把视图里存储的 select 语句中的别名看作列名,可以直接查看指定的列:
5、基于 emp 表指定列,创建视图 emp_view_3(a,b,c,d,e),包含 编号、姓名、工资、年薪、年收入(视图中使用列名):
此时视图中的列名就是指定的 a、b、c、d、e;
如果创建视图时没有指定列名,默认情况下就用 select 语句中的字段作为 列名,比如 emp_view_2;
6、修改视图 emp_view_3 的列名为 (id,name,salary,annual,income),语法:create or replace view 视图名 as 子查询;
7、查询 emp 表,求出各部门的 最低工资,最高工资,平均工资:
8、如果上面的语句会经常用到,每次都要写,就太麻烦了,可以将上面的语句放入视图中,简化书写:
9、创建视图 emp_view_5,视图中包含 员工编号,姓名,工资,部门名,工资等级(需要用到 3 张表)
10、删除视图 emp_view_1 中的 7788 号员工的记录,使用 delete 操作,会影响基表吗?
11、修改 emp_view_1 为只读视图【with read only】,还能执行上述 delete 操作吗?
结论:对于 只读视图 只能进行 select 操作,insert、update、delete 都不可以;
12、 删除整个视图:
删除的视图不会放入回收站;
删除整个视图不会影响基表中的数据;
注意:如果删除的是基表,虽然视图还在,但是查询视图会报错;因为视图里存储的 sql 语句查不到表 会报错;