Oracle学习笔记(12)------------集合、序列
2015-07-21 15:02
471 查看
一、集合
在数学的操作之中存在交、差、并、补的概念,而在数据的查询中也存在此概念,有如下几个连接符号:
UNION:连接两个查询,相同的部分不显示;
UNION ALL:连接两个查询,相同的部分显示;
INTERSECT:返回两个查询中的相同部分;
MINUS:返回两个查询中的不同部分;
为了验证以上的操作,下面创建一张只包含20部门雇员信息的表:
范例:验证UNION
范例:验证UNION ALL
范例:验证INTERSECT
范例:验证MINUS
在之前讲解分组的时候曾经留过一道未完成的题目:所有领取奖金的人求出平均工资,所有不领取奖金的人求出平均工资,当时的实现代码如下:
这种问题下只能依靠查询的连接操作,准备两个查询:
第一个查询负责查询出所有领取奖金的雇员平均工资;
第二个查询负责查询出所有不领取奖金的雇员平均工资;
对于这种连接查询,只需要清楚其概念即可。
二、序列
在许多的数据表之中都存在一种称为自动增长列的操作,但是在Oracle之中,这种自动增长列并不是自动控制的,而是需要用户手工的控制,这样做主要是为了开发方便,创建序列的语法如下:
范例:创建序列
当一个序列创建完成之后 ,可以通过以下两种方式访问序列:
序列名称.nextval:让序列增长到下一个内容;
序列名称.currval:取得当前序列的内容;
范例:验证序列的操作
可是直接执行上面的程序会发出如下的错误提示:“ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义”
在Oracle之中如果要想操作currval,则首先必须使用nextval;
序列一般都作为主键使用,例如,下面定义一张表:
现在向mytab表中增加数据:
一定要记住,这个过程都是由用户自己手工进行的,不能自动完成。
在默认情况下,序列从0开始,每次增长1,那么现在也可以修改;
范例:创建序列,从10开始,每次增长2
范例:希望定义一个序列,这个序列可以在1、3、5、7、9之间循环出现;
关于序列中的CACHE解释:
在Oracle数据库之中,由于序列被经常使用到,所以Oracle为了揽性能,将序列的操作形式做了如下的处理。
准备了一块空间,这个空间之中,为用户准备好了若干个已经生成好的序列,每次操作的时候都是从这块空间之中取出序列的内容,但是这样有一个问题,如果现在数据库的实例关闭了,那么保存在这块空间中的内容就有可能消失了,但是虽然消失了,可是数据库已经增长好了,这样就会出现跳号的事情,而如果要想取消掉这种问题,则最好的方式是将序列设置为不缓存,使用NOCACHE声明。
在数学的操作之中存在交、差、并、补的概念,而在数据的查询中也存在此概念,有如下几个连接符号:
UNION:连接两个查询,相同的部分不显示;
UNION ALL:连接两个查询,相同的部分显示;
INTERSECT:返回两个查询中的相同部分;
MINUS:返回两个查询中的不同部分;
为了验证以上的操作,下面创建一张只包含20部门雇员信息的表:
CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20;
范例:验证UNION
SELECT * FROM emp UNION SELECT * FROM emp20;
范例:验证UNION ALL
SELECT * FROM emp UNION ALL SELECT * FROM emp20;
范例:验证INTERSECT
SELECT * FROM emp INTERSECT SELECT * FROM emp20;
范例:验证MINUS
SELECT * FROM emp MINUS SELECT * FROM emp20;
在之前讲解分组的时候曾经留过一道未完成的题目:所有领取奖金的人求出平均工资,所有不领取奖金的人求出平均工资,当时的实现代码如下:
SELECT comm,AVG(sal) FROM emp GROUP BY comm;
这种问题下只能依靠查询的连接操作,准备两个查询:
第一个查询负责查询出所有领取奖金的雇员平均工资;
第二个查询负责查询出所有不领取奖金的雇员平均工资;
SELECT 'UNCOMM',AVG(sal) FROM emp WHERE comm IS NULL UNION SELECT 'COMM',AVG(sal) FROM emp WHERE comm IS NOT NULL;
对于这种连接查询,只需要清楚其概念即可。
二、序列
在许多的数据表之中都存在一种称为自动增长列的操作,但是在Oracle之中,这种自动增长列并不是自动控制的,而是需要用户手工的控制,这样做主要是为了开发方便,创建序列的语法如下:
CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n|NOMAXVALUE}] [{MINVALUE n|NOMINVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}];
范例:创建序列
CREATE SEQUENCE myseq;
当一个序列创建完成之后 ,可以通过以下两种方式访问序列:
序列名称.nextval:让序列增长到下一个内容;
序列名称.currval:取得当前序列的内容;
范例:验证序列的操作
SELECT myseq.currval FROM dual;
可是直接执行上面的程序会发出如下的错误提示:“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 );
现在向mytab表中增加数据:
INSERT INTO mytab(id,name) VALUES(myseq.nextval,'姓名');
一定要记住,这个过程都是由用户自己手工进行的,不能自动完成。
在默认情况下,序列从0开始,每次增长1,那么现在也可以修改;
范例:创建序列,从10开始,每次增长2
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 10 MINVALUE 1 CYCLE NOCACHE;
关于序列中的CACHE解释:
在Oracle数据库之中,由于序列被经常使用到,所以Oracle为了揽性能,将序列的操作形式做了如下的处理。
准备了一块空间,这个空间之中,为用户准备好了若干个已经生成好的序列,每次操作的时候都是从这块空间之中取出序列的内容,但是这样有一个问题,如果现在数据库的实例关闭了,那么保存在这块空间中的内容就有可能消失了,但是虽然消失了,可是数据库已经增长好了,这样就会出现跳号的事情,而如果要想取消掉这种问题,则最好的方式是将序列设置为不缓存,使用NOCACHE声明。
相关文章推荐
- Oracle Flashback Technology(闪回技术)
- Oracle学习笔记(11)----------建表、更新、查询综合练习
- Oracle学习笔记(10)----------- 约束
- Oracle学习笔记(9)----------- 表的创建及管理
- Oracle学习笔记(7)-----------数据更新、事务处理、数据伪列
- Oracle学习笔记(6)------------多表查询
- Oracle学习笔记(5)-----------单行函数
- Oracle学习笔记(4)------------简单查询
- Oracle学习笔记(3)-----------命令大全
- Oracle学习笔记(2)------------体系结构2
- Oracle学习笔记(1)-------------Oracle体系结构
- java调用oracle存储过程,返回结果集
- oracle中如何对字符串进行去除空格的方法
- RHEL5.8安装oracle-validated RPM包过程
- oracle 11g dgbroker搭建dataguard
- oracle学习笔记(转)
- oracle存储过程返回结果集
- ORACLE数据库对比表结构
- Oracle客户端简易连接报错ORA-12154,TNS-03505
- 【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)