集合运算符和序列
--学生表 CREATE TABLE STUDENT (SNO NUMBER(4), NAME VARCHAR2(20), SEX CHAR(2), BIRTHDAY DATE, CLASS NUMBER(6), CONSTRAINT STU_SNO_PK PRIMARY KEY (SNO)); --教员表 CREATE TABLE TEACHER (TNO NUMBER(3), NAME VARCHAR2(20), SEX CHAR(2), BIRTHDAY DATE, DEPART VARCHAR(20),--院系 CONSTRAINT TEA_TNO_PK PRIMARY KEY (TNO)); --并集(去重) SELECT s.sex FROM student s UNION--去重并集 select t.sex FROM teacher t; --将两个子查询分别去重后合并 SELECT DISTINCT s.sex FROM student s UNION ALL select DISTINCT t.sex FROM teacher t; --并集(不去重) SELECT s.name,s.sex FROM student s UNION ALL SELECT t.name,t.sex FROM teacher t; --交集(先去重,后取交集) SELECT s.sex FROM student s intersect SELECT t.sex FROM teacher t; --差集 SELECT s.sex FROM student s except select t.sex FROM teacher t;
-- CREATE SEQUENCE sequencename 创建序列 -- [INCREMENT BY n] 定义序列增长步长,省略为1 -- [START WITH m] 序列起始值,省略为1 -- [{MAXVALUE n | NOMAXVALUE}] 序列最大值, -- [{MINVALUE n | NOMINVALUE}] 序列最小值 -- [{CYCLE | NOCYCLE}] 到达最大值或最小值后,继续产生序列(默认NOCYCLE) -- [{CACHE n | NOCACHE}]; CACHE默认是20 --创建序列 create sequence myseq; --NEXTVAL 和CURRVAL 伪列 --NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用CURRVAL 中存放序列的当前值 --第一次使用时CURRVAL不能用,使用时需要指定序列的对象名,将序列值装入内存可提高访问效率 --序列起始值,省略为1 select myseq.nextval from dual; select myseq.currval from dual; --创建一个表 create table weilie( mid number, name varchar2(50) not null, constraint pk_mid primary key(mid) ); --插入一行 insert into weilie(mid,name) values (myseq.nextval,'Scott'); --插入一行 insert into weilie(mid,name) values (myseq.nextval,'Tom'); --查询 SELECT * FROM weilie; select * from user_sequences; --删除序列 drop sequence myseq; --设置序列的初始值和增长步长 create sequence myseq --初始值 increment by 5 --增长步长 START WITH 30; --步长30 select myseq.nextval from dual; --cache和nocache 默认情况是打开缓存的,默认的大小是20,这里有一个重要的参数是LAST_NUMBER create sequence myseq cache 100; select * from user_sequences; select myseq.nextval from dual; select * from user_sequences; --nocache create sequence myseq nocache; select * from user_sequences; select myseq.nextval from dual;--运行一次增长1 --使用循环序列 -- 循环序列是指每次调用nextval可以产生指定范围的数据,比如在1、3、5、7、9这5个数字中产生 create sequence myseq start with 1 increment BY 3 maxvalue 10 minvalue 1 cycle cache 3; select myseq.nextval from dual; --CACHE_SIZE 变化 select * from user_sequences; --修改序列的注意事项 --必须是序列的拥有者或对序列有ALTER 权限 -- 只有将来的序列值会被改变 --改变序列的初始值只能通过删除序列之后重建序列的方法实现 --其它的一些限制 ALTER SEQUENCE myseq INCREMENT BY 20 MAXVALUE 160 CYCLE;