一、集合
在數學的操作之中存在交、差、並、補的概念,而在數據的查詢中也存在此概念,有如下幾個連接符號:
- 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聲明。