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

來源:互聯網
上載者:User

一、集合

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

  • UNION:串連兩個查詢,相同的部分不顯示;
  • UNION ALL:串連兩個查詢,相同的部分顯示;
  • INTERSECT:返回兩個查詢中的相同部分;
  • MINUS:返回兩個查詢中的不同部分;

為了驗證以上的操作,下面建立一張只包含20部門僱員資訊的表:

CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20;

範例:驗證UNION

SELECT * FROM emp  UNIONSELECT * FROM emp20;

範例:驗證UNION ALL

SELECT * FROM emp  UNION ALLSELECT * FROM emp20;

範例:驗證INTERSECT

SELECT * FROM emp  INTERSECTSELECT * FROM emp20;

範例:驗證MINUS

SELECT * FROM emp  MINUSSELECT * FROM emp20;

在之前講解分組的時候曾經留過一道未完成的題目:所有領取獎金的人求出平均工資,所有不領取獎金的人求出平均工資,當時的實現代碼如下:

SELECT comm,AVG(sal)FROM empGROUP BY comm;

這種問題下只能依靠查詢的串連操作,準備兩個查詢:

  • 第一個查詢負責查詢出所有領取獎金的僱員平均工資;
  • 第二個查詢負責查詢出所有不領取獎金的僱員平均工資;
SELECT 'UNCOMM',AVG(sal) FROM emp WHERE comm IS NULL  UNIONSELECT '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聲明。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.