为什么要用到视图?
有的时候,我们可能只关系一张数据表中的某些字段,而另外的一些人只关系同一张数据表的某些字段…
那么把全部的字段都都显示给他们看,这是不合理的。我们应该做到:他们想看到什么样的数据,我们就给他们什么样的数据…一方面就能够让他们只关注自己的数据,另一方面,我们也保证数据表一些保密的数据不会泄露出来…
还有另外一个原因:
我们在查询数据的时候,常常需要编写非常长的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会把序列存放在内存中,可以供几张表使用…
有的同学可能会疑问,我们在分页的时候用到了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>