獲獎學員:王梓祺
所獲獎項:三等獎
內容:
/*前言:這份資料是結合老師筆記,課堂案例,TTS6.0課件以及個人的理解整理,時間倉促,如有紕漏敬請原諒。*/
Oracle 數據庫
語法順序
select from on where group by having order by
執行順序
from on where group by having select order by
一、關鍵字語法介紹
1、from on from后面接的是需要查詢的表格
on后面接的是表的連接條件和過濾條件
單表查詢直接跟上源表的名字
多表查詢跟上的是源表的名字和兩表之間的連接種類
2、where where語句實現的是對查詢表的結果集的篩選
where語句后面跟的是條件表達式(可以是列名、常量,比較運算符,文字值)
between ..and.. 語句表示一個范圍,是兩邊的閉區間范圍
in 運算符是表示范圍是一個由離散值組成的集合
like運算符配合通配符進行相關字符性的信息查找
%表示0或多個字符 _表示任意單個字符
is null表示值是空值null的行信息
3、group by 根據group by子句指定的表達式將要處理的數據分組
4、having 根據統計結果添加條件對分組后的組進行過濾
只有符合having條件的組被保留
{where和having的區別}
where過濾的是行,having過濾的是分組
where可以跟任意列名、單行函數,having只能包含group by的表達式和組函數
where執行在前,having執行在后
where和having都不允許用列別名
5、select select語句把需要顯示的列的名稱或者是表達式進行設定(查詢的核心步驟)
通過select語句得到需要的信息進行顯示
distinct(去重)跟在select后面,用于對顯示的記錄進行去重操作
6、order by 用于對select語句的結果集進行排序的語句
后面跟上需要依賴進行排序的列名以及asc(升序,默認)或者desc(降序)
7、insert into… 用于把記錄添加到表格當中
insert into tabname(col1,col2/*不寫括號默認添加行的所有列,書寫可以寫進去相應列的記錄,其他保持空值*/) values (val1,val2);
8、drop 用于刪除表格
drop table tabname cascade constraints purge;
/*cascade constraints用在刪除表格前先中斷與其他表格的外鍵約束關系*/
9、alter table 修改表格中的列的信息
alter table tabname modify (colname null);/*not null列改為null列*/
alter table tabname modify (colname default 1 not null);
/* null列改為not null列*/
alter table tabname add(建表時列定義方法);/*添加列*/
alter table tabname drop(colname);/*刪除列*/
10、synonym 同義詞
create synonym account for tarena.account;
/*設置account與tarena.account一致*/
二、數據類型
1、number類型 number(int a,int b) 表示該數值有a位有效數字,b位小數位
ex: number(6);第二個參數不寫默認為0,表示從-999999~999999的整數
umber(4,3);4位有效數字,3位小數位,表示從-9.999~9.999的三位小數數字
umber(3,-3);3位有效數字,-3位小數位,表示(+-)1~(+-)999*103的數字
2、字符類型
a、char類型 按定義的字符長度存
可以不定義長度,缺省為1字節,最大長度2000字節
b、varchar2類型 按字符串的實際長度存
必須定義長度,最大值為4000字節
/*列的取值是定長,定義為char類型;列的取值長度不固定,定義為varchar2類型*/
3、日期函數
缺省日期格式為DD-MON-RR
alter session set nls_date_format = “yyyy-mm-dd hh24:mi:ss”;
/*調整系統date函數缺省格式函數*/
三、比較和邏輯運算符
比較運算符 : = , > , >= , < , <=
比較運算符 : between and , in , like , is null
邏輯運算符 : and , or , not
否定形式 : 比較運算符 : <> , != , ^=
SQL比較運算符 : not between and , not in , not like , is not null
四、函數
1、字符函數
lower 把字符中的字母降為小寫
upper 把字符中的字母升為大寫
initcap 把字符中的首字符轉為大寫
concat 拼接函數的內容
substr 求子串的函數
length 字符串的長度
lpad 右對齊函數,位數不夠的,左邊補指定字符
lpad('a',5,'b') 在a前方補4個b到5位
rpad 左對齊函數,位數不夠的,右邊補指定字符
trim 去掉字符串兩邊的空格和制表符
2、數值函數
round(num,x);對傳進的num數值進行四舍五入,保留x位小數
trunc(num,x);對傳進的num數值進行去尾操作,保留x位小數
3、日期函數
add months(Date date,number a) 一個日期加a各月
months between 兩個日期之間相差幾個月
ext day 下一天
last day 前一天
4、轉換函數
to date(str);把字符串轉為時間函數
to char(Date date,String reg);根據reg傳入的格式把date轉換為字符串
to number(str);把數字的字符串轉為number數據類型
5、一般函數
vl(col1,String str);遍歷col1列所有元素,有空值的會置換為str字符串
五、SQL語句中的分支
1、 case ... then... 對where語句進行優先級篩選,從上到下,有一個滿足便馬上退出case
select base_duration,base_cost,
case when base_duration = 20 then unit_cost + 0.05
when base_duration = 40 then unit_cost + 0.03
else
unit_cost
end
ew_unit_cost from cost;
當base_duration找到符合的值便馬上套用值退出;
如果不添加else語句,不符合case中的base_duration的值此時會輸出null
2、decode 用法與case...when接近
SELECT a2.real_name cunstomer,
DECODE(a1.real_name,a2.real_name,'No recommender', a1.real_name) recommender
FROM account a1 JOIN account a2
ON a1.id = NVL(a2.recommender_id,a2.id);
后面的參數分別是: 需要檢查的列名,條件1,執行語句1,條件2,執行語句2,... 不符合所有條件時返回的執行語句
語句執行的方法是: 找到當前表格的列,檢查列中的每一個值是否符合各項的條件, 一有符合 的條件,馬上跳轉到執行語句上并執行后退出decode; 若列中的值沒有符合條件,則會執行” 不符 合所有條件時返回的執行語句”后結束decode。
六、子查詢
子查詢的概念是在一個查詢里面包含另外一個select語句(一般是where條件語句中)
1、非關聯子查詢
非關聯子查詢,先執行子查詢,子查詢的返回結果作為主查詢的條件,再執行主查詢。
子查詢只執行一遍,子查詢結果若返回多值,會自動去重。
2、關聯子查詢
關聯子查詢,采用循環的方式,查詢先從外部查詢,獲得一條記錄后,并將其傳入內部查詢,內部查詢從其結果中把值傳回外部查詢,若符合條件,就放入結果集,否則放棄。重復執行以上步驟。
3、in函數和exist函數
in函數
多用在非關聯子查詢中,后面跟值或者是表達式
exist函數 多用在關聯子查詢中
采用的是循環(loop)方式,判斷outer表中是否存在記錄只要在inner表中找到一條匹配的記錄即可
in和extst的比較
exist使用循環方式,由outer表的記錄決定循環的次數,所以外表的記錄數要少
in先執行子查詢,返回結果去重后再執行主查詢,子查詢結果越少越適合用in函數
/*哪些客戶申請遠程登錄服務*/
/*關聯子查詢*/ SELECT real_name,id FROM account o
WHERE EXISTS
(SELECT 1 FROM service i WHERE i.account_id = o.id );
/*非關聯子查詢*/ SELECT real_name FROM account
WHERE id IN (SELECT account_id FROM service );
七、多表連接和多表查詢
1、交叉連接 tabname1 cross join tabname2
交叉連接得到的是表1和表2的笛卡爾積(兩個表里的元素一一對應)
2、內連接 tabname1 join tabname2 on tabname.c1 = tabname2.c2 and
內連接所達到的效果是兩表內相關的信息保留,不會顯示沒有交叉的信息
多個條件的情況下,可以加上and繼續添加
執行順序 : 先根據on后面的過濾條件進行過濾,篩選出符合條件的行,
再根據on的連接條件將兩個表進行連接。
{自連接}指的是驅動表和匹配表都是同一張表,方法同內連接一樣,給表起不同表別名
/*哪些os帳號的開通時間比同一臺機器上os帳號的平均開通時間長*/
/*關聯子查詢方法*/ SELECT unix_host,os_username,
ROUND(sysdate-create_date) days
FROM service o
WHERE ROUND(sysdate-create_date) >
(SELECT ROUND(AVG(sysdate-create_date))
FROM service i
WHERE i.unix_host = o.unix_host);
/*多表查詢方法*/ SELECT s.unix_host,s.os_username,
ROUND(sysdate-create_date) day,d.days
FROM service s
JOIN (SELECT unix_host,ROUND(AVG(sysdate-create_date)) days
FROM service
GROUP BY unix_host) d
ON s.unix_host = d.unix_host
AND ROUND(sysdate-s.create_date) > d.days;
3、外連接
(1)left join 驅動表是左邊的表,匹配表是右邊的表
(2)right join 驅動表是右邊的表,匹配表是左邊的表
(3)full join
執行順序 : 先根據on和and條件對要連接的表進行過濾,將過濾后的結果集進行外連接操作(join on),再對外連接的結果集用where子句進行過濾,最后用select語句生成最終結果集。
/*列出客戶姓名以及他的推薦人*/
select t2.real_name cunstomer,nvl(t1.real_name,'No recommender') recommender
from account t1 right join account t2
on t1.id = t2.recommender_id;
4、內連接和外連接的區別
簡單來說,內連接的結果集只顯示兩張關聯表中關聯值的交集記錄,驅動表和匹配表交 換對結果集影響不大;外連接的結果集與驅動表和匹配表的設置有密切關系,驅動表會顯示其所有的記錄,沒有跟匹配表匹配的也會顯示出來。
{表連接,子查詢 共同解決問題}
1.匹配問題 (結果集出自一張表)in exist、表連接(inner join)
匹配問題 (結果集出自多張表) 表連接(inner join)
2.不匹配問題 (結果集出自一張表) not in not exist 表連接(outer join + where ...is null)
3.匹配+不匹配 表連接(outer join)
八、集合
數據庫中的集合的概念與數學上集合的概念基本一致,同樣有union/union all(并運算), intersert(交運算),minus(減運算)。
1、union/union all
union all 實現的是集合(結果集)的并集,簡單做并集,不去重
select name,base_duration,unit_cost+0.05 new_unit_cost from cost
where base_duration = 20
union all
select name,base_duration,unit_cost+0.03 from cost
where base_duration = 40
union all
select name,base_duration,unit_cost from cost
where base_duration not in(20,40)
or base_duration is null
/*這里要注意,要加上空值的保留,否則會忽略了計時和包月兩種套餐*/;
union 實現的是結果的并集,得到的結果集會去掉重復的記錄
2、intersect 實現的是對結果集取交集的運算
/*sun280和sun-server上的遠程登錄業務使用了哪些相同的資費標準*/
select name,id from cost
where id in
( /*加上select from cost where id in ()語句用以獲取相應套餐的名字*/
select cost_id from service s join host h
on s.unix_host = h.id
and h.name = 'sun280'/*利用on的過濾條件把相應的名字篩選出來*/
intersect
select cost_id from service s join host h
on s.unix_host = h.id
and h.name = 'sun-server');
3、minus 實現的是集合A減去A和B的交集,結果集是A中與B不一樣的記錄
select name,id,location from host
minus
select h.name,s.unix_host,h.location from service s join host h
on s.unix_host = h.id;
九、排名分頁
rownum 是一個偽列,對查詢返回的行編號即行好,由1開始一次遞增
=>oracle的rownum數值是在獲取每行之后才賦予的,rownum是不能作為表的一列 存在, 無法通過rownum = 2得到第二行的數據
要利用小于等于偽列某個值之后再利用where確定范圍
/*最晚開通netCTOSS系統的第四到第六名客戶*/
select rn,real_name,create_date
from(
select rownum rn,real_name,create_date
from(
select real_name,create_date
from account
order by create_date desc)
where rownum <=6)
where rn between 4 and 6;
/*經典例題,這里的做法是先通過對account里的記錄按照開通時間的早晚降序排列,
再引入rownum進行編號(如果在排序前引入,則會依照讀取account記錄的順序并添上rownum,再做降序,此時的結果并不能達到預想的效果),并通過where rownum <= a抽出前a個記錄后在嵌套多一個select語句把處在靠后位置的第四到第六的記錄顯示*/
十、約束
1、約束的類型
a、根據約束的性質分類
主鍵約束(primary key,pk) 特性是非空且唯一
唯一約束(unique key,uk) 特性是唯一
檢查約束(check key,ck) 特性是填入的記錄的范圍
非空約束(not null,nn) 特性是非空
外鍵約束(foreign key,fk) 特性是表與表之間的聯系列
b、根據約束的范圍分類
列級約束: 約束直接在列中聲明,只約束一列
表級約束: 約束在列以外表中聲明,可以只約束一列,也可以多列同時約束
2、建立數據庫表格時約束的寫法
create table testmt(
c1 number(3) constraint testmt_c1_pk primary key,/*主鍵約束,列級約束*/
c2 varchar2(10) constraint testmt_c2_uk unique,/*唯一性約束,列級約束*/
c3 char not null,/*非空約束,列級約束*/
c4 number(1) constraint testmt_c4_ck check(c4 in(0,1,2,3)),/*檢查約束,列級約束*/
c5 number(4) constraint testmt_c5_fk references tarena.account(id),
/*外鍵約束,列級約束*/
constraint testmt_c2_c3_uk unique(c2,c3)/*唯一性約束,表級約束*/ );
3、外鍵約束
a、表格的一對多關系的實現
表和表之間的關系: 外鍵約束 1:n
child table(fk) -> parent table(pk/uk)
account 1[id pk]
service m[id(服務),account_id(客戶)
account_id fk-->account(id)]
create table testchild (/*列級約束 外鍵約束寫法*/
c1 number(2) constraint testchild_c1_pk primary key,
c2 number(3) constraint testchild_c2_fk references wzqparent(c1));
create table testchild (/*表級約束 外鍵約束寫法*/
c1 number(2) constraint testchild_c1_pk primary key,
c2 number(3) ,
constraint testchild_c2_fk foreign key(c2) references testparent(c1));
b、表格的多對多關系的實現
表格之間的多對多關系
m : n 通過中間表((t1_pk列名)-->t1.pk列,(t2_pk列名)-->t2.pk列)
表達兩張表(t1,t2)的關系
c、表格的一對一關系的實現
表格之間的一對一關系
把一對一信息的兩列信息各定義成一張表,每張表的id列定義成pk列,其中一張 表的pk列同時定義成fk列,實現一一對應關系
d、合表問題
=>合表問題的三個范式
第一范式 有pk,每一列不可再分。
第二范式 每個非主屬性必須完全依賴pk列(多對多關系的合表)
第三范式 每個非主屬性不能依賴于另一個非主屬性(非主屬性之間不能有依賴關系)
=>表格的一對多關系進行合表--數據冗余
一對多的兩張表要合表會導致數據冗余,違反了第三范式
占用空間,insert每一條服務信息,同時寫account信息。
同一用戶信息出現多條記錄,很可能數據不一致。
=>表格的多對多關系進行合表—違反第二范式
e、外鍵約束定義時的兩種形式
=>on delete cascade--級聯刪除,刪除父表的記錄前,先刪除子表里的相關記錄
create table testchild1 (
c1 number(2) constraint testchild1_c1_pk primary key,
c2 number(3) constraint testchild1_c2_fk references testparent(c1)
on delete cascade);
/*在級聯刪除的情況下,刪除父表的值,子表的同一值下的行也會被自動刪除*/
=>on delete set null-- 刪除父表的記錄前,先將子表中外鍵列的相關值置空
create table testchild1 (
c1 number(2) constraint testchild1_c1_pk primary key,
c2 number(3) constraint testchild1_c2_fk references testparent(c1)
on delete set null
/*update wzqchild2 set c2 = null where c1 = 1;*/
);
4、檢查約束
檢查約束也可以在列級和表級之間實現。
/*列級*/create table testmt(
c1 number(3) constraint testmt_c1_pk primary key,
c2 number(3) constraint testmt_c2_ck check(c2 > 100)
);
/*表級*/create table testmt(
c1 number(3) constraint testmt_c1_pk primary key,
c2 number(2),
c3 number(2),
constraint testmt_c2_c3_ck check((c2+c3) > 100)
/*check的表達式可以是in,可以是= ,也可以是算術表達式*/
);
5、約束的暫停和恢復
在為表格增加記錄的時候,有些記錄在表格所有記錄完全寫入之前受制于表格創建時所 設下的約束條件,導致無法向表格中填入記錄。在這種情況下,除了在創建表格時候不 添加相應的約束,等到記錄全部填入后再寫,或者可以選擇暫時暫停約束的條件,待記 錄錄入完成后恢復。具體的操作如下:
alter table testmt disable constraint testmt_c5_fk;
/*關鍵字disable可以暫時暫停命名為testmt_c5_fk的constraint(約束) */
alter table testmt enable constraint testmt_c5_fk;
/*關鍵字enable可以恢復命名為testmt_c5_fk的constraint(約束) */
注意: 約束的存在不僅僅是為了保持表格于表格之間的聯系(foreign key),同時還有其他例如唯一性(unique key)和主鍵(primary key)等用于限定表格中的記錄以符合業務邏輯的。因此,在暫停約束的時候不能夠隨便暫停,一旦在暫停過程中輸入違反約束條件的記錄就不能正常恢復相應的約束,導致出現工作的延誤和不合理。所以,要根據記錄的輸入和現實中的業務邏輯考慮使用約束的暫停。
6、約束的查詢
select c.constraint_name,c.constraint_type,cc.column_name,position
from user_constraints c join user_cons_columns cc
on c.table_name = cc.table_name
and c.table_name = “ACCOUNT”;
constraint_name:約束名
table_name:表名
column_name:被約束的列
position:單列約束值為1,聯合約束時表示該列在約束定義中的位置
7、約束的操作
alter table tabname drop constraint_name;/*根據約束名刪除約束*/
alter table tabname drop primary key;/*刪除主鍵約束*/
alter table tabname add 表級約束語法;/*添加約束*/
十一、update和delete語法
1、update的語法
--用于更新表中已經存在的記錄,即修改記錄的某列/某些列的值
update tabname set colname1 = value1[,colname2 = value2]
where condition;
2、delete的語法
--刪除已經存在的記錄
delete from tabname where condition;
如果要刪除表格里面的所有記錄,可以簡寫成delete tabname;
{delete和truncate的區別}
delete from tabname 時間長(是否寫rollback/undo segment)
truncate table tabname 把表所有數據刪除(刪除的速度比delete from tabname塊)
delete 不釋放表占用的空間
truncate 釋放表占用的空間
全部刪除大表中的數據用truncate table
十二、事務
事物是由一組DML語句和commit/rollback組成,是改變數據庫數據的最小邏輯單元。如果是commit,表示數據入庫;如果是rollback,表示取消所有的DML操作。
1、事物的特性
a、原子性: 一個事務或者完全發生,或者完全不發生
b、一致性: 事務把數據庫從一個一致狀態轉變到另一個一致狀態
c、隔離性: 隔離級別(read committed只可讀取已經修改的和正在修改的信息),事務提交之前,其他事務覺察不到事務的影響
d、持久性: 一旦事務提交,它是永久的
2、數據庫開發的關鍵挑戰
=>使并行的訪問量達到最大化
=>保證每一個用戶(會話)可以以一致的方式讀取并修改數據
鎖機制:用來管理對一個共享資源的并行訪問
十三、視圖
1、帶子查詢的create table
=>根據子查詢語句創建表并插入數據
=>表結構由子查詢的select語句決定,create table指定列的數量要跟select語句指定的列的數量一致。
/*create table 定義列只能定義命名,缺省值,完整性約束。*/
/*20機器上的業務信息*/
create table service_a
as
select * from tarena.service
where unix_host = '192.168.0.20';
2、帶子查詢的insert
=>根據子查詢語句向表中插入數據
=>insert指定的裂地數量要跟select語句指定的列的數量一致。
=>一次可以插入多條記錄,不能用values子句
/*account_90表中含有所有的90后用戶*/
create table account_w90
as
select * from tarena.account
where 1 = 2;/*用于復制表格的列,但不會復制表格里的數據(where 1 = 2;)*/
insert into account_w90
select * from tarena.account
where to_char(tarena.account.birthdate,'yyyy')
between '1990' and '1999';
3、view視圖的概念
=>類似于快捷方式,利用select語句實現,只在系統表中存儲對視圖的定義
=>視圖在數據庫中不存儲數據值,即不占空間
select test from user_views where view_name = 'test_v11';
select 'c1','c2'from test where c1 = 11;
系統表 user_tables user_views user_objects(系統insert)
用戶表 account service cost(用戶DDL)
select object_name,object_type,status
from user_objects
where object_name = 'test_v11';
[如果在where語句后面加上with check option,就可以只允許符合要求的數據
例如該題目,加上with check option,就只有當c1 = 11情況下才能插入]
[如果在select語句后加上with read only,表明該視圖是只讀屬性]
drop一張表系統自動將所有依賴該表的數據庫對象
(view procedure function)的狀態變為invalid(無效的)
當一個對象是無效時,系統會執行
alter view test_v11 compile; 重新編譯該視圖
4、視圖的應用場景
a、簡化操作,屏蔽了復雜的,直接對視圖操作
b、控制權限,只允許查詢一張表中的部分數據。解決辦法:對其創建視圖,授予用戶讀視圖的權限,而非讀表的權限。
c、通過視圖將多張表union all成一張邏輯表,作為單獨一個數據庫對象,實現表的超集
5、視圖的維護
視圖是一個依賴表的數據庫對象,查詢視圖最終都要通過查詢源表實現。如果源表的結構發生變化,對視圖的操作就有可能出問題。查看視圖的狀態是幫助我們發現視圖是否可用的方法。
十四、索引
創建方式: create index index_name on table(column);
1、掃描表的方式
a、全表掃描FTS
將掃描高水位線一下的所有數據塊
/*高水位線:(high water mark)曾經插入數據的最遠塊*/
b、通過rowid來掃描數據
/*rowid是一個偽列,rowid包含如下信息:
data_object_id 該記錄是屬于哪張表的(哪個數據庫對象)
file_id 該記錄在哪個數據文件里
block_id 該記錄在數據文件的第幾個數據塊里
row_id 該記錄在數據塊里是第幾條記錄
*/
在oracle看來,沒有重復記錄,每條記錄都有rowid。
delete from test o
where rowid<
(select max(rowid) from test i
where o.c1=i.c1
and o.c2=i.c2) 刪除表中重復數據的方法
對于所有的重復記錄,留rowid最大的那條記錄。
delete from test o
where rowid<
(select min(rowid) from test i
where o.c1=i.c1
and o.c2=i.c2) 刪除表中重復數據的方法
對于所有的重復記錄,留rowid最小的那條記錄。
2、索引的結構
B*tree索引由 根塊(root block)、屬于date_block
分支塊(branch block)、
葉子塊(leaf block)組成
*根塊下面是分支塊,擁于導航結構,包含了索引列范圍和另一非根塊(可以是分支塊或葉子塊)的地址
*最底層為葉子塊,包含索引項(index entry),索引項有key值(被索引列的值)和該列所在行的rowid組成
*葉子塊實際上是雙向鏈表。一旦找到葉子塊的“開始”點(一旦找到第一個值),對值進行順序掃描(索引范圍掃描)是很容易的。不必要做結構導航,只要通過葉子塊轉發就行
id列沒建索引,用FTS
id列建索引,找索引,從root塊通過幾步找到葉子塊,找index entry,獲得rowid,select變成where rowid = ''
select real_name,rowid
from tarena.account
索引的順序就是按照order by的順序排列,不然就按照rowid的順序排列
3、索引的類型
唯一性索引(unique) 等價于唯一性約束
非唯一性索引 用于提高查詢效率
單列索引 索引建在一列上
聯合索引 索引建在多列上
4、哪些列適合建索引
經常出現在WHERE子句的列
經常用于表連接的列
該列是高基數數據列(高基數數據列是指有很多不同的值)
該列包含許多null值
表很大,查詢的結果集小
主鍵(PK)列、唯一鍵(UK)列
外鍵(FK)列
經常需要排序(ORDER BY)和分組(GROUP BY)的列,DISTINCT也適合
=>索引不是萬能的,沒有索引是萬萬不能的
5、索引用不了的寫法
函數導致索引用不了--WHERE UPPER(COLNAME)=‘CARMEN’
表達式導致索引用不了--WHERE COLNAME*12=12000
部分隱式數據類型導致索引用不了--WHERE COLNAME1=2(C1為varchar2類型)
LIKE和SUBSTR--WHERE COLNAME LIKE ‘CA%’
--WHERE SUBSTR(COLNAME,1,2)=‘CA’
查詢所有的null值--WHERE COLNAME IS NULL
否定形式--NOT IN 、 < >
十五、序列號
1、序列號的概念
=>為了解決主鍵值和唯一鍵值的唯一性
按照預定義的模式自動生成整數的一種機制,保證數字的自動增長
2、序列號的創建
create sequence sequence1
start with 1/*起始值*/
increment by 1/*步長,下一步所增加的數值*/
maxvalue 999/*最大值,序列號的最大值*/
cycle /*是否循環,默認值為nocycle*/
cache 20/*循環值,表示需要是從1-20的循環*/;
3、實際案例的應用
create table test(c1 number constraint test_c1_pk primary key);
create sequence s_test_c1 start with 1302001;
insert into test values (s_test_c1.nextval);
insert into test values (s_test_c1.nextval); commit;
insert into test values (s_test_c1.nextval); rollback;
insert into test values (s_test_c1.nextval);
select * from test;
C1
----------
1302001