Oracle总结【视图、索引、事务、用户权限、批量操作】二

为什么要用到视图?

有的时候,我们可能只关系一张数据表中的某些字段,而另外的一些人只关系同一张数据表的某些字段…

那么把全部的字段都都显示给他们看,这是不合理的。我们应该做到:他们想看到什么样的数据,我们就给他们什么样的数据…一方面就能够让他们只关注自己的数据,另一方面,我们也保证数据表一些保密的数据不会泄露出来…

Oracle总结【视图、索引、事务、用户权限、批量操作】二


还有另外一个原因:

我们在查询数据的时候,常常需要编写非常长的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会把序列存放在内存中,可以供几张表使用…

Oracle总结【视图、索引、事务、用户权限、批量操作】二

有的同学可能会疑问,我们在分页的时候用到了rownum这么一个伪列,为啥不用它来做自动增长的呢???

rownum的值虽然是唯一和连续的,但是不能一直唯一标识该记录…也就是说,一旦该记录删除了,那么rownum的值是会变的

为什么要用序列

  • (1)以前我们为主健设置值,需要人工设置值,容易出错
  • (2)以前每张表的主健值,是独立的,不能共享
为emp表的empno字段,创建序列emp_empno_seq,create sequence 序列名
create sequence emp_empno_seq;
删除序列emp_empno_seq,drop sequence 序列名
drop sequence emp_empno_seq;
查询emp_empno_seq序列的当前值currval和下一个值nextval,第一次使用序列时,必须选用:序列名.nextval
select emp_empno_seq.nextval from dual;
select emp_empno_seq.currval from dual;
使用序列,向emp表插入记录,empno字段使用序列值
insert into emp(empno) values(emp_empno_seq.nextval);
insert into emp(empno) values(emp_empno_seq.nextval);
insert into emp(empno) values(emp_empno_seq.nextval);
修改emp_empno_seq序列的increment by属性为20,默认start with是1,alter sequence 序列名
alter sequence emp_empno_seq
increment by 20;
修改修改emp_empno_seq序列的的increment by属性为5
alter sequence emp_empno_seq
increment by 5;
修改emp_empno_seq序列的start with属性,行吗
alter sequence emp_empno_seq
start with 100;
有了序列后,还能为主健手工设置值吗?
insert into emp(empno) values(9999);
insert into emp(empno) values(7900);
删除表,会影响序列吗?
你无法做insert操作,表真正亡,序列亡
删除序列,会影响表吗?
不会
在hibernate中,如果是访问oracle数据库服务器,那么User.hbm.xml映射文件中关于<id>标签如何配置呢?
<id name="id" column="id">
   <generator class="increment/identity/uuid/【sequence】/【native】"/>
</id>


上一篇:mysql用户管理、常用sql语句、mysql数据库备份恢复


下一篇:ORA-00600: internal error code, arguments: [2662]