Oracle知识点总结—集合操作和序列

来源:互联网 发布:python遍历字符串 编辑:程序博客网 时间:2024/05/20 07:20

1、集合操作
UNION 连接两个查询,相同的部分不显示
UNION ALL 连接两个查询,相同的部分显示
INTERSECT 返回两个查询的相同部分
MINUS 返回两个查询中的不同部分

统计出领取佣金和不领取佣金的雇员的人数及平均工资
select nvl(comm,0),count(*),avg(sal) from emp group by nvl(comm,0);

select 'uncomm',AVG(sal),count(*) count from emp where comm is null
union
select 'comm',AVG(sal),count(*) count from emp where comm is not null;

2、序列
CREATE SEQUENCE 序列名
[ INCREMENT BY n]
[ START WITH n]
[{ MAXVALUE/ MINVALUE n|NOMAXVALUE}]
[{ CYCLE|NOCYCLE}]
[{CACHE n|NOCACHE}];
在Oracle中,这种自动增长列并不是自动控制的,而是需要用户手工控制的,这样做的主要是为了开发方便,而是创建序列
创建序列
create SEQUENCE myseq;
序列创建完成之后,所有的自动增长应该由用户自己处理,所以在序列中提供了以下两种操作:
序列名.nextVal:取得序列的下一个内容
序列名.currVal:取得序列的当前内容
select myseq.currval from dual;
执行上面的sql语句,会出现如下的错误提示:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义
在Oracle中如果要想操作currval,则必须先使用nextval
select myseq.nextval from dual;
select myseq.currval from dual;
序列一般都作为主键使用

drop table mytab purge;
create table mytab(
id number primary key,
name varchar2(20) not null
);
insert into mytab(id,name) values(myseq.nextval,'张三');
这个过程是由用户手工完成的,不能自动完成
默认情况下,序列从0开始,每次增加1,但是也可以修改

创建从10开始的序列
drop sequence myseq;
create sequence myseq increment by 2 start with 10;
创建一个序列,这个序列可以在1、3、5、7、9之间循环出现
drop sequence myseq;
create sequence myseq increment by 2 start with 1 MAXVALUE 9 MINVALUE 1 CYCLE;
出现如下错误:
ORA-04013: CACHE 值必须小于 CYCLE 值
关于序列中的cache解释
在Oracle数据库之中,由于序列经常使用到,所以Oracle为了提升性能,将序列的操作形式做了如下的处理
首先,如果在用户每次使用序列的时候序列在增加,则肯定会造成一些性能上的损耗,所以Oracle中专门为用户准备了一块空间,这个空间之中,为用户准备好了若干个已经生成好的序列的内容,但是这样做有一个问题,如果现在数据库的实例关闭了,那么保存在这块空间中的内容就有可能消失了,但是虽然消失了,可是数据已经增长好了,这样就会出现跳号的事情,而如果要想取消这种问题,则最好的方式是将序列设置为不缓存,使用NOCACHE声明。


drop sequence myseq;
create sequence myseq increment by 2 start with 1 MAXVALUE 9 MINVALUE 1 CYCLE NOCACHE;