如果在视图中出现表达式,那么应该给表达式一个别名
Create or replace view v1 as select empno,ename,sal*12 年薪,from emp where deptno=30;
Desc v1; -- 查看视图结构
强制创建视图
可使用force选项强制创建视图,create or replace force view myview2 as select empno,ename,job,sal from emp2 where deptno=20;
创建复杂视图
Create or replace view v_sal(deptno,maxsal,minsal,avgsal) as select deptno,max(sal),min(sal),avg(sal) from emp group by deptno;
更新视图
在可更新视图上进行DML操作,可以修改基本表中数据
可更新视图的定义中不能使用分组函数,group by子句,distinct关键字,rownum伪列,字段的定义不能为表达式
由两个以上基表中导出的视图不可更新,基表中非空的列在视图定义中未包括,则不可在视图上进行insert操作。
在视图上进行DML操作,语法与在表上操作相同。Insert,update,delete
创建只读视图
在创建视图时,可使用with read only选项将之设置为只读。
Create or replace force view myview2
As select empno,ename,job,sal from emp2 where deptno=20 with read only;
临时视图
嵌入到SQL语句中的子查询是临时视图
临时视图不是数据库对象,其定义不会长久保存在数据库中,本次运行后即被清除。
Select rownum,a.* from (select * from emp order by sal) a where rownum<=5 --查询TOP 5
索引
一种用于提升查询效率的数据库对象;通过快速定位数据的方法,减少磁盘I/O操作;索引信息与表独立存放;oracle数据库自动使用和维护索引。
索引分类,唯一性索引,非唯一索引
创建索引的两种方式:
自动创建,在定义主键或唯一键约束时系统会自动在相应的字段上创建唯一性索引。
手动创建,用户可以在其它列上创建非唯一的索引,以加速查询。
创建/删除索引
可使用create index语句手动创建索引
Create index myindex on emp(ename);
删除索引
使用drop index语句删除索引
操作者须是索引的所有者,或拥有者drop该index权限。删除表时相关的索引和约束将被自动删除,但视图和序列将保留drop index myindex;
Create index emp_idx1 on emp(ename);
Select * from emp where ename='KING'; -- 这个地方就会用到上面的索引
创建索引的原则
下述情况可以创建索引
字段取值分布范围很广,包含大量空值,经常出现在where子句或连接条件中,表经常被访问,数据量很大,且通常每次访问的数据量小于记录总量的2%-4%
下列情况不适合创建索引
表很小,字段不经常出现在where子句中,每次访问的数据量大于记录总数的2%-4%,表经常更新,被索引的字段作为表达式的一部分被引用。
基于函数的索引
基于表达式的索引被统称为基于函数的索引,索引表达式由表中的字段,常量,SQL函数和自定义函数构建而成。
创建函数索引
Create index myindex on emp(lower(ename));
使用函数索引select * from emp where lower(ename)='king';
序列
系统自动生成的,不重复的整数值,序列是一种数据库对象,可以被多个用户共享。典型用途是做为主键值,它对于每一行必须是唯一的。
序列可以代替应用程序编号,可以对序列值进行缓冲存储,以提高访问效率。
Create sequence sequence_name
Increment by n --每次增加几
Start with n --从多少开始
Maxvalue n | nomaxvalue --可以设置最大值,也可以不设置
Minvalue n | nominvalue --是否用最小值
Cycle | nocycle --循环
Cache n | cache --缓存
Order | noorder --顺序
Create sequence mysequence1
Increment by 1
Start with 1
Nomaxvalue nocycle;
Create sequence mysequence2;
查询数据字典视图user_sequences可获得用户序列信息
使用序列
Nextval/currval伪列
Nextval伪列用于从指定的序列数值中取出下一个值
Currval伪列引用的是指定序列的当前值
Select mysequence1.currval from dual;
Select mysequence1.nextval from dual;
Insert into test1 values(mysequence1.nextval,'Tom');
说明:使用缓存(cache n)可提高访问效率。
序列在下列情况下可能出现不连续的情况:回滚,系统异常,多个表同时使用同一序列。
使用nocache和noorder设置会降低运行效率。
修改序列
Alter sequence sequence
Increment by n
Maxvalue n | nomaxvalue
Minvalue n | nomin value
Cycle | nocycle
Cache n | nocache
Order | noorder
注意事项:
操作者必须是序列的所有者,或者拥有alter该序列的权限;只有未来再生成的序列数受影响;序列的始值不可更改;更改中会进行一些验证,比如新的maxvalue如果小于当前的序列值就会报错。
删除序列
使用drop sequence语句删除序列,操作者须是所有者,或拥有drop的权限。
同义词(相当于别名)
同义词相当于对象的别名,使用同义词可以:方便访问其它用户的对象;缩短对象名字的长度;
创建同义词
Create synonym gt1 for emp; --为emp表创建别名gt1
Select * from gt1; --使用别名
Drop synonym gt1; --删除别名
Create public synonym gt2 for scott.emp; //必须指定用户,当前用户为scott