【正文】
,而不需要我們?nèi)ト斯す芾?。The AUTO_INCREMENT attribute can be used to generate a unique identity for new rows:CREATE TABLE animals ( id int NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id))。INSERT INTO animals (name) VALUES (39。dog39。),(39。cat39。),(39。penguin39。), (39。lax39。),(39。whale39。),(39。ostrich39。)。SELECT * FROM animals。但是,oracle中沒有自增類型的字段的,所以通常情況下需要定義一個sequence來作為自動增長類型字段的數(shù)據(jù)。 Oracle中的序列(sequence)如何定義一個序列,格式為: create sequence 序列名稱 start with 起始數(shù) increment by 增長量 [maxvalue值] [minvalue 值] [cycle 當(dāng)?shù)竭_(dá)最大值的時候,將繼續(xù)從頭開始] [Nocycle 一直累加,不循環(huán)] [Cache 緩存]可使用NEXTVAL和CURRVAL關(guān)鍵字訪問序列值。NEXTVAL返回序列中的下一個編號,而CURRVAL提供對當(dāng)前值的訪問。sequence不屬于某個表,也不屬于某個字段,sequence僅僅屬于某個用戶。注意:第一次NEXTVAL返回的是初始值;隨后的NEXTVAL會自動增加你定義的INCREMENT BY值,然后返回增加后的值。CURRVAL 總是返回當(dāng)前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次 SEQUENCE的值。下面創(chuàng)建一個序列:create sequence myseqstart with 1increment by 2maxvalue 9999minvalue 1nocycle。問題:在那里可以查出我們剛剛創(chuàng)建好的序列seq_test?回答:問題:怎樣使用sequence?第一步:創(chuàng)建一個測試表Create table test_seq( nextv number, currv number)。利用序列,插入數(shù)據(jù)庫:Insert into test_seq(nextv,currv) values (, )。查詢,并觀察結(jié)果:Select * from test_seq。然后再插入,再查詢:Insert into test_seq(nextv,currv) values (, )。查詢,觀察結(jié)果:Select * from test_seq。練習(xí):創(chuàng)建一個序列,主鍵自動增長1,并插入數(shù)據(jù)進行測試。9 索引在數(shù)據(jù)庫中,索引的含義與日常意義上的“索引”一詞并無多大區(qū)別(想想查字典時候的索引),它是用于提高數(shù)據(jù)庫表數(shù)據(jù)訪問速度的數(shù)據(jù)庫對象。A)索引可以避免全表掃描。多數(shù)查詢可以僅掃描少量索引頁及數(shù)據(jù)頁,而不是遍歷所有數(shù)據(jù)頁。B)對于非聚集索引,有些查詢甚至可以不訪問數(shù)據(jù)頁。C)聚集索引可以避免數(shù)據(jù)插入操作集中于表的最后一個數(shù)據(jù)頁。D)一些情況下,索引還可用于避免排序操作。當(dāng)然,眾所周知,雖然索引可以提高查詢速度,但是它們也會導(dǎo)致數(shù)據(jù)庫系統(tǒng)更新數(shù)據(jù)的性能下降,因為大部分?jǐn)?shù)據(jù)更新需要同時更新索引。創(chuàng)建索引:創(chuàng)建索引一般有以下兩個目的:維護被索引列的唯一性和提供快速訪問表中數(shù)據(jù)的策略。 在select操作占大部分的表上創(chuàng)建索引; 在where子句中出現(xiàn)最頻繁的列上創(chuàng)建索引; 在選擇性高的列上創(chuàng)建索引(補充索引選擇性,最高是1,eg:primary key) 復(fù)合索引的主列應(yīng)該是最有選擇性的和where限定條件最常用的列小于1M的表,最好不要使用索引來查詢,表越小,越適合用全表掃描。我們常見的數(shù)據(jù)庫系統(tǒng),其索引使用的數(shù)據(jù)結(jié)構(gòu)多是BTree或者B+Tree。例如,MsSql使用的是B+Tree,Oracle及Sysbase使用的是BTree。所以在最開始,簡單地介紹一下BTree。BTree不同于Binary Tree(二叉樹,最多有兩個子樹),一棵M階的BTree滿足以下條件:1)每個結(jié)點至多有M個孩子;2)除根結(jié)點和葉結(jié)點外,其它每個結(jié)點至少有M/2個孩子;3)根結(jié)點至少有兩個孩子(除非該樹僅包含一個結(jié)點);4)所有葉結(jié)點在同一層,葉結(jié)點不包含任何關(guān)鍵字信息;5)有K個關(guān)鍵字的非葉結(jié)點恰好包含K+1個孩子;另外,對于一個結(jié)點,其內(nèi)部的關(guān)鍵字是從小到大排序的。以下是BTree(M=4)的樣例:對于每個結(jié)點,主要包含一個關(guān)鍵字?jǐn)?shù)組Key[],一個指針數(shù)組(指向兒子)Son[]。在BTree內(nèi),查找的流程是:使用順序查找(數(shù)組長度較短時)或折半查找方法查找Key[]數(shù)組,若找到關(guān)鍵字K,則返回該結(jié)點的地址及K在Key[]中的位置;否則,可確定K在某個Key[i]和Key[i+1]之間,則從Son[i]所指的子結(jié)點繼續(xù)查找,直到在某結(jié)點中查找成功;或直至找到葉結(jié)點且葉結(jié)點中的查找仍不成功時,查找過程失敗。接著,我們使用以下圖片演示如何生成BTree(M=4,依次插入1~6):從圖可見,當(dāng)我們插入關(guān)鍵字4時,由于原結(jié)點已經(jīng)滿了,故進行分裂,基本按一半的原則進行分裂,然后取出中間的關(guān)鍵字2,升級(這里是成為根結(jié)點)。其它的依類推,就是這樣一個大概的過程。一條索引記錄中包含的基本信息包括:鍵值(即你定義索引時指定的所有字段的值)+邏輯指針(指向數(shù)據(jù)頁或者另一索引頁)。當(dāng)你為一張空表創(chuàng)建索引時,數(shù)據(jù)庫系統(tǒng)將為你分配一個索引頁,該索引頁在你插入數(shù)據(jù)前一直是空的。此頁此時既是根結(jié)點,也是葉結(jié)點。每當(dāng)你往表中插入一行數(shù)據(jù),數(shù)據(jù)庫系統(tǒng)即向此根結(jié)點中插入一行索引記錄。當(dāng)根結(jié)點滿時,數(shù)據(jù)庫系統(tǒng)大抵按以下步驟進行分裂:A)創(chuàng)建兩個兒子結(jié)點B)將原根結(jié)點中的數(shù)據(jù)近似地拆成兩半,分別寫入新的兩個兒子結(jié)點C)根結(jié)點中加上指向兩個兒子結(jié)點的指針通常狀況下,由于索引記錄僅包含索引字段值(以及49字節(jié)的指針),索引實體比真實的數(shù)據(jù)行要小許多,索引頁相較數(shù)據(jù)頁來說要密集許多。一個索引頁可以存儲數(shù)量更多的索引記錄,這意味著在索引中查找時在I/O上占很大的優(yōu)勢,理解這一點有助于從本質(zhì)上了解使用索引的優(yōu)勢。注意:mysql下有可能不支持。示例1:在emp表中的empno字段上創(chuàng)建索引。 Create index index_empno on emp(ename)。刪除索引:drop index index_empno。驗證索引的作用:使用10章中的test_seq表做測試表::建立索引:create index test_seq_currv on (currv)。 然后再進行查詢:查詢時間有所減少,但是不是很明顯,建議測試的時候多插入一些數(shù)值。練習(xí):自己創(chuàng)建一個名叫student表,有兩個字段,學(xué)號sno,和學(xué)生姓名sname,sno表利用sequence生成數(shù)值進行插入,而sname可以隨意給值,向表里插入十萬行左右的的數(shù)據(jù),比較建立索引和沒有建立索引進行查詢時時間的差別。10 視圖(view)視圖是一種特殊的表(虛擬表),它其實質(zhì)就是一條查詢語句的別名,而這個表的數(shù)據(jù),就是這條查詢語句所查詢的結(jié)果。視圖在數(shù)據(jù)庫中沒有實際的存儲數(shù)據(jù),數(shù)據(jù)是查詢時生成的。視圖在開發(fā)中使用中比較多,往往開發(fā)中通過視圖來實現(xiàn)一些權(quán)限控制,安全性控制,封裝復(fù)雜查詢等等作用。視圖:是一個封裝了各種復(fù)雜查詢的語句,就稱為視圖。視圖是一個虛擬表,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。從數(shù)據(jù)庫系統(tǒng)內(nèi)部來看,視圖是由一張或多張表中的數(shù)據(jù)組成的,從數(shù)據(jù)庫系統(tǒng)外部來看,視圖就如同一張表一樣,對表能夠進行的一般操作都可以應(yīng)用于視圖,例如查詢,插入,修改,刪除操作等。 * 簡單性??吹降木褪切枰摹R晥D不僅可以簡化用戶對數(shù)據(jù)的理解,也可以簡化他們的操作。那些被經(jīng)常使用的查詢可以被定義為視圖,從而使得用戶不必為以后的操作每次指定全部的條件。 * 安全性。通過視圖用戶只能查詢和修改他們所能見到的數(shù)據(jù)。數(shù)據(jù)庫中的其它數(shù)據(jù)則既看不見也取不到。數(shù)據(jù)庫授權(quán)命令可以使每個用戶對數(shù)據(jù)庫的檢索限制到特定的數(shù)據(jù)庫對象上,但不能授權(quán)到數(shù)據(jù)庫特定行和特定的列上。通過視圖,用戶可以被限制在數(shù)據(jù)的不同子集上: * 邏輯數(shù)據(jù)獨立性。視圖可幫助用戶屏蔽真實表結(jié)構(gòu)變化帶來的影響。語法:CREATE VIEW 視圖名字(字段) AS 子查詢(雇員的編號、姓名、工資)CREATE VIEW v_emp_dept20 AS SELECT empno,ename,sal FROM emp WHERE deptno=20 。其他操作,如查詢,刪除等等操作和表一樣。練習(xí):1:創(chuàng)建一個包含傭金高于其薪金的雇員視圖2:創(chuàng)建一個包含所有雇員的雇員編號、雇員名稱、部門名稱和薪金的視圖3:創(chuàng)建一個包含各種工作的薪金總和的視圖作業(yè):登陸下面的網(wǎng)址,并自學(xué)和復(fù)習(xí)SQL。新疆大學(xué)軟件學(xué)院數(shù)據(jù)庫原理與技術(shù)SQL教程 廖彬 liaobin665@