这里写图片描述
还有另外一个原因:
我们在查询数据的时候,常常需要编写非常长的SQL语句,几乎每次都要写很长很长….上面已经说了,视图就是基于查询的一种虚表,也就是说,视图可以将查询出来的数据进行封装。。。那么我们在使用的时候就会变得非常方便…
小总结:
- (1)如果你不想让用户看到所有数据(字段,记录),只想让用户看到某些的数据时,此时可以使用视图
- (2)当你需要减化SQL查询语句的编写时,可以使用视图,但不提高查询效率
基于emp表所有列,创建视图emp_view_1,create view 视图名 as select对一张或多张基表的查询
create view emp_view_1
as
select * from emp;
默认情况下,普通用户无权创建视图,得让sysdba为你分配creare view的权限
以sysdba身份,授权scott用户create view权限
grant create view to scott;
以sysdba身份,撤销scott用户create view权限
revoke create view from scott;
基于emp表指定列,创建视图emp_view_2,该视图包含编号/姓名/工资/年薪/年收入(查询中使用列别名)
create view emp_view_2
as
select empno "编号",ename "姓名",sal "工资",sal*12 "年薪",sal*12+NVL(comm,0) "年收入"
from emp;
基于emp表指定列,创建视图emp_view_3(a,b,c,d,e),包含编号/姓名/工资/年薪/年收入(视图中使用列名)
create view emp_view_3(a,b,c,d,e)
as
select empno "编号",ename "姓名",sal "工资",sal*12 "年薪",sal*12+NVL(comm,0) "年收入"
from emp;
查询emp_view_3创建视图的结构
desc emp_view_3;
修改emp_view_3(id,name,salary,annual,income)视图,create or replace view 视图名 as 子查询
create or replace view emp_view_3(id,name,salary,annual,income)
as
select empno "编号",ename "姓名",sal "工资",sal*12 "年薪",sal*12+NVL(comm,0) "年收入"
from emp;
查询emp表,求出各部门的最低工资,最高工资,平均工资
select min(sal),max(sal),round(avg(sal),0),deptno
from emp
group by deptno;
创建视图emp_view_4,视图中包含各部门的最低工资,最高工资,平均工资
create or replace view emp_view_4
as
select deptno "部门号",min(sal) "最低工资",max(sal) "最高工资",round(avg(sal),0) "平均工资"
from emp
group by deptno;
创建视图emp_view_5,视图中包含员工编号,姓名,工资,部门名,工资等级
create or replace view emp_view_5
as
select e.empno "编号",e.ename "姓名",e.sal "工资",d.dname "部门名",s.grade "工资等级"
from emp e,dept d,salgrade s
where (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal);
删除视图emp_view_1中的7788号员工的记录,使用delete操作,会影响基表吗
delete from emp_view_1 where empno=7788;写法正确,会影响基表
修改emp_view_1为只读视图【with read only】,再执行上述delete操作,还行吗?
create or replace view emp_view_1
as
select * from emp
with read only;
不能进行delete操作了
删除视图中的【某条】记录会影响基表吗?
会影响基表
将【整个】视图删除,会影响表吗?
不会影响基表
删除视图,会进入回收站吗?
不会进入回收站
删除基表会影响视图吗?
会影响视图
闪回基表后,视图有影响吗?
视图又可以正常工作了
同义词
我们在使用多表查询,或者查询出来的表字段意义不清晰的时候,我们就使用别名来替代….当然了,别名只针对列名或表名
现在,我们已经知道的对象有用户/视图/表等等其他对象了,Oracle也提供了同义词【类似于别名】给我们进行使用
同义词的作用
- (1)缩短对象名字的长度
- (2)方便访问其它用户的对象
创建与salgrade表对应的同义词,create synonym 同义词 for 表名/视图/其它对象
create synonym e for salgrade;
create synonym ev5 for emp_view_5;
以sys身份授予scott普通用户create synonym权限
grant create synonym to scott;
以sys身份从scott普通用户撤销create synonym权限
revoke create synonym from scott;
使用同义词操作salgrade表
select * from s;
删除同义词
drop synonym ev5;
删除同义词,会影响基表吗?
不会影响基表
删除基表,会影响同义词吗?
会影响同义词
序列
Mysql的自动增长可以直接在创建表的时候,在字段后面跟上auto increament关键字就行了。那Oracle 有没有自动增长策略呢???
Oracle使用的是序列这么一个对象….
- (1)类似于MySQL中的auto_increment自动增长机制,但Oracle中无auto_increment机制
- (2)是oracle提供的一个产生唯一数值型值的机制
- (3)通常用于表的主健值
- (4)序列只能保证唯一,不能保证连续
- 声明:oracle中,只有rownum永远保持从1开始,且继续
- (5)序列值,可放于内存,取之较快
那oralce中的序列和Mysql中的自动增长有啥区别???
- Mysql每张表都会维护一个自动增长的程序…
- Oralce会把序列存放在内存中,可以供几张表使用…