Oracle筆記(十二) 集合、序列

一、集合

在數學的操作之中存在交、差、並、補的概念,而在數據的查詢中也存在此概念,有如下幾個連接符號:

  • 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聲明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章