对象 | 描述 |
表 | 基本的数据存储集合,由行和列组成。 |
视图 | 从表中抽出的逻辑上相关的数据集合。 |
序列 | 提供有规律的数值。 |
索引 | 提高查询的效率。 |
同义词 | 给对象起的别名 |
一、Oracle的视图介绍与创建
什么是视图?
- 视图是一个虚拟的表。
- 视图建立在已有表的基础上,视图赖以建立的这些表称为基表。
- 向视图提供数据内容的语句为select语句。
为什么要使用视图?主要出于以下两个原因:
- 安全原因限制数据访问。
- 视图可使复杂的查询易于理解和使用。
视图的分类:简单视图、复杂视图、连接视图、只读视图。
--创建简单试图(必须具有create view权限的用户才可以创建视图)
--创建用于查询员工号、姓名、工资的视图
create view emp_view
as
select empno,ename,sal from emp;
--查询视图
select * from emp_view;
--为视图的列取别名
create view emp_view2(员工号,姓名,工资)
as
select empno,ename,sal from emp;
select * from emp_view2;
--连接视图
--创建用于获得部门号为10的部门号、部门名称及员工信息
create view dept_emp_view(部门编号,部门名称,雇员编号,雇员名称,雇员职位)
as
select d.deptno,d.dname,e.empno,e.ename,e.job
from dept d,emp e
where d.deptno=e.deptno and d.deptno=10;
select * from dept_emp_view;
--只读视图
--建立查看10号部门员工信息的视图
create view emp_view3
as
select * from emp where deptno=10
with read only;
select * from emp_view3;
二、 Oracle视图的查询修改与删除
--视图上的DML操作
create view empnew_view
as
select empno,ename,sal from empnew;
select * from empnew_view;
--注意:针对视图的更新操作(insert、update、delete)实际改变的是基表中的数据。
--1、insert
insert into empnew_view(empno,ename,sal)values(8888,'LAYNA',6666);
select * from empnew;
--2、update
update empnew_view set sal= sal+100 where empno=8888;
--3、delete
delete from empnew_view where empno=8888;
commit;
--在创建视图时定义check约束
create view empnew_view2
as
select * from empnew where deptno=20
with check option constraint ck_view;
select * from empnew_view2;
--insert\update
update empnew_view2 set deptno=30 where empno=7566;
--语句执行失败,必须满足deptno=20
--修改视图:使用 create or replace view 子句修改视图
select * from empnew_view;
create or replace view empnew_view
as
select * from emp where job ='SALEMAN';
--删除视图(只会删除视图的定义,并不会删除视图所依赖的基表中的数据)
drop view empnew_view;
三、Oracle的复杂视图
什么时复杂视图?
复杂视图是指包含函数、表达式、或者分组数据的视图,它主要用于执行查询操作。注意:当定义复杂视图时,必须要为函数或表达式定义列别名。
复杂视图执行DML操作的原则
delete操作原则:视图中包含以下元素之一不能执行delete操作:
- group by子句
- 分组函数
- distinct关键字
- rownum伪列
update操作原则:视图中包含以下元素之一不能执行update操作:
- group by子句
- 分组函数
- distinct关键字
- rownum伪列
- 使用表达式定义的列
insert操作原则:视图中包含以下元素之一不能执行insert操作:
- group by子句
- 分组函数
- distinct关键字
- rownum伪列
- 使用表达式定义的列
- 视图上没有包含基表的not null列
--创建用于获得每个岗位平均工资、工资总和、最高工资和最低工资的视图
create view job_view(job,avgsal,sumsal,maxsal,minsal)
as
select job,avg(sal),sum(sal),max(sal),min(sal) from emp group by job;
select * from job_view;
create view job_view(job,avgsal,sumsal,maxsal,minsal)
as
select job,avg(sal),sum(sal),max(sal),min(sal) from emp group by job;