Oracle數(shù)據(jù)庫管理、開發(fā)與實(shí)踐 教學(xué)課件 楊永健 劉尚毅SQL語言基礎(chǔ)及調(diào)優(yōu)_第1頁
Oracle數(shù)據(jù)庫管理、開發(fā)與實(shí)踐 教學(xué)課件 楊永健 劉尚毅SQL語言基礎(chǔ)及調(diào)優(yōu)_第2頁
Oracle數(shù)據(jù)庫管理、開發(fā)與實(shí)踐 教學(xué)課件 楊永健 劉尚毅SQL語言基礎(chǔ)及調(diào)優(yōu)_第3頁
Oracle數(shù)據(jù)庫管理、開發(fā)與實(shí)踐 教學(xué)課件 楊永健 劉尚毅SQL語言基礎(chǔ)及調(diào)優(yōu)_第4頁
Oracle數(shù)據(jù)庫管理、開發(fā)與實(shí)踐 教學(xué)課件 楊永健 劉尚毅SQL語言基礎(chǔ)及調(diào)優(yōu)_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、在線教務(wù)輔導(dǎo)網(wǎng): :/教材其余課件及動畫素材請查閱在線教務(wù)輔導(dǎo)網(wǎng)QQ:349134187 或者直接輸入下面地址:本章要求: 第5章 SQL語言基礎(chǔ)及調(diào)優(yōu)了解SQL語言的特點(diǎn)理解用戶模式和模式對象掌握檢索數(shù)據(jù)的方法掌握Oracle常用的系統(tǒng)函數(shù)掌握子查詢的用法掌握操作數(shù)據(jù)庫的3種方法了解如何進(jìn)行事務(wù)處理掌握常用SQL語句的優(yōu)化掌握表連接的優(yōu)化理解合理使用索引對象了解Oracle優(yōu)化器的使用了解SQL重演和Oracle系能顧問主要內(nèi)容1. SQL語言簡介2. 用戶模式3. 檢索數(shù)據(jù)4. Oracle常用系統(tǒng)函數(shù)5. 子查詢的用法6. 操作數(shù)據(jù)庫7. 事務(wù)處理8. 常規(guī)SQL語句優(yōu)化9. 表連接優(yōu)化

2、10.合理使用索引11.優(yōu)化器的使用12.數(shù)據(jù)庫和SQL重演的性能顧問14.綜合實(shí)例查詢工資不小于WARD的員工信息第5章 SQL語言基礎(chǔ)及調(diào)優(yōu)5.1.1 SQL語言的特點(diǎn)5.1.2 SQL語言的分類5.1.3 SQL語言的編寫規(guī)則5.1 SQL語言簡介 SQL語言結(jié)構(gòu)簡潔,功能強(qiáng)大,簡單易學(xué),自從被國際標(biāo)準(zhǔn)化組織(ISO)采納為國際標(biāo)準(zhǔn)以后,SQL語言得到了廣泛的應(yīng)用,它主要有以下特點(diǎn)。(1)集合性 SQL可以在高層的數(shù)據(jù)結(jié)構(gòu)上進(jìn)行工作,工作時(shí)不是單條的處理記錄,而對數(shù)據(jù)進(jìn)程成組的處理。所有SQL語句都接受集合作為輸入,并且返回集合作為輸出,SQL的集合特性允許一條SQL語句的結(jié)果作為另一條

3、SQL語句的輸入。(2)統(tǒng)一性 SQL為許多任務(wù)提供了統(tǒng)一的命令,這樣方便用戶學(xué)習(xí)和使用,基本的SQL命令只需很少時(shí)間就能學(xué)會,甚至最高級的命令也可以在幾天內(nèi)掌握。數(shù)據(jù)庫的操作任務(wù)通常包括以下幾方面:查詢數(shù)據(jù)。在表中插入、修改和刪除記錄。建立、修改和刪除數(shù)據(jù)對象。控制對數(shù)據(jù)和數(shù)據(jù)對象的讀寫。保證數(shù)據(jù)庫一致性和完整性。(3)易于移植性 由于所有主要的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)都支持SQL語言,這樣用戶就比較容易將原先使用SQL的技能從一個(gè)RDBMS轉(zhuǎn)到另一個(gè),而且用兼容SQL標(biāo)準(zhǔn)編寫的程序都是可以移植的。5.1.1 SQL語言的特點(diǎn)5.1.2 SQL語言的分類 SQL是關(guān)系型數(shù)據(jù)庫的基本操作語言,是數(shù)

4、據(jù)庫管理系統(tǒng)與數(shù)據(jù)庫進(jìn)行交互的接口。它將數(shù)據(jù)查詢、數(shù)據(jù)操縱、事務(wù)控制、數(shù)據(jù)定義和數(shù)據(jù)控制功能基于一身,而這些功能又分別對應(yīng)著各自的SQL語言,具體如下。(1)數(shù)據(jù)查詢語言(DQL)用于檢索數(shù)據(jù)庫中的數(shù)據(jù),主要是SELECT語句,它在操作數(shù)據(jù)庫的過程中使用最為頻繁。(2)數(shù)據(jù)操縱語言(DML)用于改變數(shù)據(jù)庫中的數(shù)據(jù),主要包括INSERT,UPDATE和DELETE三條語句。其中,INSERT語句用于將數(shù)據(jù)插入到數(shù)據(jù)庫中,UPDATE語句用于更新數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù),而DELETE語句則用于刪除數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù)。(3)事務(wù)控制語言(TCL)用于維護(hù)數(shù)據(jù)的一致性,包括COMMIT、ROLLB

5、ACK和SAVEPOINT三條語句。其中,COMMIT語句用于提交對數(shù)據(jù)庫的更改,ROLLBACK語句用于取消對數(shù)據(jù)庫的更改,而SAVEPOINT語句則用于設(shè)置保存點(diǎn)。(4)數(shù)據(jù)定義語言(DDL)用于建立、修改和刪除數(shù)據(jù)庫對象。比如,可以使用CREATE TABLE語句創(chuàng)建表;使用ALTER TABlE語句修改表結(jié)構(gòu);使用DROP TABLE語句刪除表,(5)數(shù)據(jù)控制語言(DCL)用于執(zhí)行權(quán)限授予和權(quán)限受賄操作,主要包括GRANT和REVOKE兩條命令。其中,GRANT命令用于給用戶或角色授予權(quán)限,而REVOKE命令則用于收回用戶或角色所具有的權(quán)限。5.1.3 SQL語言的編寫規(guī)則SQL關(guān)鍵字

6、不區(qū)分大小寫,既可以使用大寫格式,也可以使用小寫格式,或者大小寫格式混用。【例5-1】 編寫以下3條語句,對關(guān)鍵字(SELECT和FROM)分別使用大寫格式、小寫格式或大小寫混用格式,代碼如下。SQL select empno,ename,sal from scott.emp;SQL SELECT empno,ename,sal FROM scott.emp;SQL selECT empno,ename,sal frOM scott.emp;分別執(zhí)行這3條SELECT語句,會發(fā)現(xiàn)結(jié)果完全相同。對象名和列名不區(qū)分大小寫,它們既可以使用大寫格式,也可以使用小寫格式,或者大小寫格式混用?!纠?-2】

7、 編寫以下3條語句,對“表名和列名”分別使用大寫格式、小寫格式或大小寫混用格式,代碼如下。SQL select empno,ename,sal from scott.emp;SQL select EMPNO,ENAME,SAL from SCOTT.EMP;SQL select emPNO,ename,sAL from scott.EmP;分別執(zhí)行這3條SELECT語句,會發(fā)現(xiàn)結(jié)果完全相同。字符值區(qū)分大小寫。當(dāng)在SQL語句中引用字符值時(shí),必須要給出正確的大小寫數(shù)據(jù),否則,不能得到正確的查詢結(jié)果。 【例5-3】 編寫以下兩條語句,查詢表中職位是“銷售員”的記錄,要求兩條語句的查詢條件分別為“SA

8、LESMAN”和“salesman”,代碼如下。SQL select * from scott.emp where job=SALESMAN;SQL select * from scott.emp where job=salesman; 分別執(zhí)行這兩條SELECT語句,會發(fā)現(xiàn)結(jié)果不相同,因?yàn)椴樵儣l件是不相同的。 在SQL*Plus環(huán)境編寫SQL語句時(shí),如果SQL語句較短,則可以將語句放在一行上顯示;如果SQL語句很長,為了便于用戶閱讀,則可以將語句分行顯示(并且Oracle會在除第一行之外的每一行前面自動加上行號),當(dāng)SQL語句輸入完畢,要以分號作為結(jié)束符。 【例5-4】 檢索表中職位是SAL

9、ESMAN(銷售員)的記錄,并且分行編寫SQL語句,代碼如下。SQL select empno,ename,job 3 where job=SALESMANorder by empno;說明: 在SQL*Plus環(huán)境中編寫較長的SQL語句時(shí),敲回車即可實(shí)現(xiàn)換行。當(dāng)要注意,在敲回車之前不要輸入分號,因?yàn)榉痔柋硎維QL語句的結(jié)束。5.2 用戶模式5.2.1 模式與模式對象5.2.2 示例模式SCOTT5.2.1 模式與模式對象 模式是一個(gè)數(shù)據(jù)庫對象的集合。模式為一個(gè)數(shù)據(jù)庫用戶所有,并且具有與該用戶相同的名稱,比如,SYSTEM模式、SCOTT模式等。在一個(gè)模式內(nèi)部不可以直接訪問其它模式的數(shù)據(jù)庫對象

10、,即使在具有訪問權(quán)限的情況下,也需要指定模式名稱才可以訪問其它模式的數(shù)據(jù)庫對象。 模式對象是由用戶創(chuàng)建的邏輯結(jié)構(gòu),用以存儲或引用數(shù)據(jù)。例如,前面章節(jié)中所講過的段(比如,表、索引等),以及用戶所擁有的其它非段的數(shù)據(jù)庫對象。這些非段的數(shù)據(jù)庫對象通常包括:約束、視圖、同義詞、過程以及程序包等。 那么,簡單的說,模式與模式對象之間的關(guān)系就是擁有與被擁有的關(guān)系,即模式擁有模式對象;而模式對象被模式所擁有。注意: 一個(gè)不屬于某個(gè)用戶所擁有的數(shù)據(jù)庫對象就不能稱之為模式對象,比如角色,表空間及目錄等數(shù)據(jù)庫對象。 為了便于后面章節(jié)的講解,這里介紹一個(gè)典型的示例模式SCOTT模式,因?yàn)樵撃J郊捌渌鶕碛械哪J綄ο笤?/p>

11、本書中經(jīng)常作為被示例。 Oracle提供的SCOTT模式的目的,就是為了給用戶提供一些示例表和數(shù)據(jù)來展示Oracle數(shù)據(jù)庫的一些特性。SCOTT模式擁有的模式對象(都是數(shù)據(jù)表)如圖5-1所示。圖5-1 SCOTT模式擁有的模式對象5.2.2 示例模式SCOTT 【例5-5】 在SCOTT模式下,通過檢索user_tables表來顯示SCOTT模式所擁有的4個(gè)數(shù)據(jù)表,代碼如下。SQL connect scott/tiger已連接。SQL select table_name from user_tables;本例運(yùn)行結(jié)果如圖5-2所示。圖5-2 顯示SCOTT模式中的表 另外,用戶也可以在SYST

12、EM模式下可以查詢SCOTT模式所擁有的數(shù)據(jù)表,但要求使用dba_tables數(shù)據(jù)表。 【例5-6】 在SYSTEM模式下,通過檢索dba_tables表來顯示SCOTT模式所擁有的4個(gè)數(shù)據(jù)表,代碼如下。SQL connect system/1qaz2wsx已連接。SQL select table_name from dba_tables where owner =SCOTT;5.3 檢索數(shù)據(jù)5.3.1 簡單查詢5.3.2 篩選查詢5.3.3 分組查詢5.3.4 排序查詢5.3.5 多表關(guān)聯(lián)查詢 只包含SELECT子句和FROM子句的查詢就是簡單查詢,SELECT子句和FROM子句是SELEC

13、T語句的必選項(xiàng),也就是說每個(gè)SELECT語句都必須包含這兩個(gè)子句。其中,SELECT子句用于選擇想要在查詢結(jié)果中顯示的列,對于這些要顯示的列,即可以使用列名來表示,也可以使用星號(*)來表示。在檢索數(shù)據(jù)時(shí),數(shù)據(jù)將按照SELECT子句后面指定的列名的順序來顯示;如果使用星號(*),則表示檢索所有的列,這時(shí)數(shù)據(jù)將按照表結(jié)構(gòu)的自然順序來顯示。1檢索所有的列 如果要檢索指定數(shù)據(jù)表的所有列,可以在SELECT子句后面使用星號(*)來實(shí)現(xiàn)。在檢索一個(gè)數(shù)據(jù)表時(shí),要注意該表所屬于的模式。如果在指定表所屬的模式內(nèi)部檢索數(shù)據(jù),則可以直接使用表名;如果不在指定表所屬的模式內(nèi)部檢索數(shù)據(jù),則不但要查看當(dāng)前模式是否具有查

14、詢的權(quán)限,而且還要在表名前面加上其所屬的模式名稱。5.3.1 簡單查詢 【例5-7】 在SCOTT模式下,在SELECT語句中使用星號(*)來檢索dept表中所有的數(shù)據(jù),代碼如下。SQL connect scott/1qaz2wsx已連接。SQL select * from dept;本例運(yùn)行結(jié)果如圖5-3所示。圖5-3 檢索dept表中所有的數(shù)據(jù)說明:上面的SELECT語句若要在SYSTEM模式下執(zhí)行,則需要在表dept前面加上scott,即“”。 在上面的例子中,from子句的后面只有一個(gè)數(shù)據(jù)表,實(shí)際上可以在from子句的后面指定多個(gè)數(shù)據(jù)表,每個(gè)數(shù)據(jù)表名之間使用逗號(,)分隔開,其語法格式

15、如下:FROM table_name1, table_name2, table_name3table_namen 【例5-8】 在SCOTT模式下,在from子句中指定兩個(gè)數(shù)據(jù)表dept和salgrade,代碼如下。SQL select * from dept,salgrade;2檢索指定的列 用戶可以指定查詢表中的某些列而不是全部列,并且被指定列的順序不受限制,指定部分列也稱作投影操作。這些列名緊跟在SELECT關(guān)鍵字的后面,每個(gè)列名之間用逗號隔開。其語法格式如下:SELECT column_name1,column_name2,column_name3,column_namen說明:利用S

16、ELECT指定列的好處就是可以改變列在查詢結(jié)果中的默認(rèn)顯示順序。 在SELECT語句中使用WHERE子句可以實(shí)現(xiàn)對數(shù)據(jù)行的篩選操作,只有滿足WHERE子句中判斷條件的行才會顯示在結(jié)果集中,而那些不滿足WHERE子句判斷條件的行則不包括在結(jié)果集中。這種篩選操作是非常有意義的,通過篩選數(shù)據(jù),可以從大量的數(shù)據(jù)中得到用戶所需要的數(shù)據(jù)。在SELECT語句中,WHERE子句位于FROM子句之后,其語法格式如下:SELECT columns_listFROM table_nameWHERE conditional_expression參數(shù)說明如下:columns_list:字段列表。table_name:表

17、名。conditional_expression:篩選條件表達(dá)式。接下來對幾種常用的篩選情況進(jìn)行詳細(xì)講解。1比較篩選 可以在WHERE子句中使用比較運(yùn)算符來篩選數(shù)據(jù),這樣只有滿足篩選條件的數(shù)據(jù)行才會被檢索出來,不滿足比較條件的數(shù)據(jù)行則不會被檢索出來?;镜摹氨容^篩選”操作主要有以下6種情況。A=B:比較A與B是否相等。A!B或AB:比較A與B是否不相等。AB:比較A是否大于B。A=B:比較A是否大于或等于B。A select empno,ename,sal from emp where sal 1500;本例運(yùn)行結(jié)果如圖5-9所示。圖5-9 查詢工資大于1500的記錄 另外,除了基本的“比較篩

18、選”操作外,還有兩個(gè)特殊的“比較篩選”操作,具體如下:AoperatorANY(B):表示A與B中的任何一個(gè)元素進(jìn)行operator運(yùn)算符的比較,只要有一個(gè)比較值為true,就返回?cái)?shù)據(jù)行。A=operatorALL(B):表示A與B中的所有元素進(jìn)行operator運(yùn)算符的比較,只有與所有元素比較值都為true,才返回?cái)?shù)據(jù)行。 數(shù)據(jù)分組的目的是用來匯總數(shù)據(jù)或?yàn)檎麄€(gè)分組顯示單行的匯總信息,通常在查詢結(jié)果集中使用GROUP BY子句對記錄進(jìn)行分組。在SELECT語句中,GROUP BY子句位于FROM子句之后,其語法格式如下:SELECT columns_listFROM table_nameWHE

19、RE conditional_expressionGROUP BY columns_list參數(shù)說明如下:columns_list:字段列表,這GROUP BY子句中也可以指定多個(gè)列分組。table_name:表名。conditional_expression:篩選條件表達(dá)式。 GROUP BY子句可以基于指定某一列的值將數(shù)據(jù)集合劃分為多個(gè)分組,同一組內(nèi)所有記錄在分組屬性上具有相同值,也可以基于指定多列的值將數(shù)據(jù)集合劃分為多個(gè)分組。5.3.3 分組查詢 【例5-25】 在emp表中,按照部門編號(deptno)和職務(wù)(job)列進(jìn)行分組,具體代碼如下。SQL select deptno,job

20、 from emp group by deptno,job order by deptno;本例運(yùn)行結(jié)果如圖5-19所示。圖5-19 分組顯示 GROUP BY子句是經(jīng)常與聚集函數(shù)一起使用。如果SELECT子句中包含聚集函數(shù),則計(jì)算每組的匯總值,當(dāng)用戶指定GROUP BY時(shí),選擇列表中任一非聚集表達(dá)式內(nèi)的所有列都應(yīng)包含在GROUP BY列表中,或者GROUP BY表達(dá)式必須與選擇列表表達(dá)式完全匹配。5.3.4 排序查詢 在檢索數(shù)據(jù)時(shí),如果把數(shù)據(jù)從數(shù)據(jù)庫中直接讀取出來,這時(shí)查詢結(jié)果將按照默認(rèn)順序排列,但往往這種默認(rèn)排列順序并不是用戶所需要看到的。尤其返回?cái)?shù)據(jù)量較大時(shí),用戶查看自己想要的信息非常不

21、方便,因此需要對檢索的結(jié)果集進(jìn)行排序。在SELECT語句中,可以使用ORDER BY子句對檢索的結(jié)果集進(jìn)行排序,該子句位于FROM子句之后,其語法格式如下:SELECT columns_listFROM table_nameWHERE conditional_expressionGROUP BY columns_listORDER BY order_by_expression ASC | DESC ,.n 參數(shù)說明如下:columns_list:字段列表,這GROUP BY子句中也可以指定多個(gè)列分組。table_name:表名。conditional_expression:篩選條件表達(dá)式。or

22、der_by_expression:表示要排序的列名或表達(dá)式。關(guān)鍵字ASC表示按升序排列,這也是默認(rèn)的排序方式;關(guān)鍵字DESC表示按降序排列。 ORDER BY子句可以根據(jù)查詢結(jié)果中的一個(gè)列或多個(gè)列對查詢結(jié)果進(jìn)行排序,并且第一個(gè)排序項(xiàng)是主要的排序依據(jù),其次那些是次要的排序依據(jù)。 【例5-28】 在SCOTT模式下,檢索emp表中的所有數(shù)據(jù),并按照部門編號(deptno)、員工編號(empno)排序,具體代碼如下。SQL select deptno,empno,ename from emp order by deptno,empno;本例運(yùn)行結(jié)果如圖5-22所示。圖5-22 檢索emp表中的所有

23、數(shù)據(jù)5.3.5 多表關(guān)聯(lián)查詢 在實(shí)際的應(yīng)用系統(tǒng)開發(fā)中會設(shè)計(jì)多個(gè)數(shù)據(jù)表,每個(gè)表的信息不是獨(dú)立存在的,而是若干個(gè)表之間的信息存在一定的關(guān)系,這樣當(dāng)用戶查詢某一個(gè)表的信息時(shí),很可能需要查詢關(guān)聯(lián)數(shù)據(jù)表的信息,這就是多表關(guān)聯(lián)查詢。SELECT語句自身是支持多表關(guān)聯(lián)查詢的,多表關(guān)聯(lián)查詢要比單表查詢復(fù)雜得多。在進(jìn)行多表關(guān)聯(lián)查詢時(shí),可能會涉及到表別名、內(nèi)連接、外連接、自然連接和交叉連接等概念,下面將對這些內(nèi)容進(jìn)行講解。1表的別名 在多表關(guān)聯(lián)查詢時(shí),如果多個(gè)表之間存在同名的列,則必須使用表名來限定列的引用。例如,在SCOTT模式中,DEPT表和EMP表都有DEPTNO列,那么當(dāng)用戶使用該列關(guān)聯(lián)查詢兩個(gè)表時(shí),就需

24、要通過指定表名來區(qū)分這兩個(gè)列的歸屬。但是,隨著查詢變得越來越復(fù)雜,語句就會因?yàn)槊看蜗薅斜仨気斎氡砻兊萌唛L乏味。對于這種情況,SQL語言提供了設(shè)定表別名的機(jī)制,使用簡短的表別名就可以替代原有較長的表名稱,這樣就可以大大縮減語句的長度?!纠?-29】 在SCOTT模式下,通過DEPTNO(部門號)列來關(guān)聯(lián)emp表和dept表,并檢索這兩個(gè)表中相關(guān)字段的信息,代碼及運(yùn)行結(jié)果如下。SQL select e.empno as 員工編號, e.ename as 員工名稱, d.dname as 部門 2 from emp e,dept d 4 and e.job=MANAGER; 員工編號 員工名稱

25、 部門- - - 7782 CLARK ACCOUNTING 7566 JONES RESEARCH 7698 BLAKE SALES在上面的SELECT語句中,F(xiàn)ROM子句最先執(zhí)行,然后才是WHERE子句和SELECT子句,這樣當(dāng)在FROM子句中指定表的別名后,當(dāng)需要限定引用列時(shí),其它所有子句都可以使用表的別名。 5.4 Oracle常用系統(tǒng)函數(shù)5.4.1 字符類函數(shù)5.4.2 數(shù)字類函數(shù)5.4.3 日期和時(shí)間類函數(shù)5.4.4 轉(zhuǎn)換類函數(shù)5.4.5 聚合類函數(shù)5.4.1 字符類函數(shù) 字符類函數(shù)是專門用于字符處理的函數(shù),處理的對象可以是字符或字符串常量,也可以是字符類型的列,常用的字符類函數(shù)有

26、如下幾種。(1)ASCII(c)函數(shù)和CHR(i)函數(shù) ASCII(c)函數(shù)用于返回一個(gè)字符的ASCII碼,其中參數(shù)c表示一個(gè)字符;CHR(i)函數(shù)用于返回給出ASCII碼值所對應(yīng)的字符,i表示一個(gè)ASCII碼值。從這兩個(gè)函數(shù)的功能中可以看出,它們二者之間具有互逆的關(guān)系?!纠?-37】 分別求得字符“Z、H、D和空格”的ASCII值,具體代碼及運(yùn)行結(jié)果如下:SQL select ascii(Z) Z,ascii(H) H,ascii(D) D ,ascii( ) space 2 from dual; Z H D SPACE- - - - 90 72 68 32說明: dual是Oracle系統(tǒng)

27、內(nèi)部提供的一個(gè)用于實(shí)現(xiàn)臨時(shí)數(shù)據(jù)計(jì)算的特殊表,它只有一個(gè)列DUMMY,類型為VARCHAR2(1),后續(xù)相關(guān)內(nèi)容若用到,將不再重復(fù)。 【例5-38】 對于上個(gè)例子中求得的ASCII值,使用chr函數(shù)再返回其對應(yīng)的字符,具體代碼及運(yùn)行結(jié)果如下:SQL select chr(90),chr(72),chr(68),(32) S from dual;C C C S- - - -Z H D 32(2)CONCAT(s1,s2)函數(shù) 該函數(shù)將字符串s2連接到字符串s1的后面,如果s1為null,則返回s2;如果s2為null,則返回s1;如果s1和s2都為空,則返回null?!纠?-39】 使用conca

28、t函數(shù)連接“Hello ”和“World”兩個(gè)字符串,具體代碼及運(yùn)行結(jié)果如下:SQL select concat(Hello ,World!) information from dual;INFORMATION-Hello World!(3)INITCAP(s)函數(shù) 該函數(shù)將字符串s的每個(gè)單詞的第一個(gè)字母大寫,其它字母小寫。單詞之間用空格、控制字符、標(biāo)點(diǎn)符號來區(qū)分。函 數(shù)說 明ABS(n)返回n的絕對值CEIL(n)返回大于或等于數(shù)值n的最小整數(shù)COS(n)返回n的余弦值,n為弧度EXP(n)返回e的n次冪,e=2.71828183FLORR(n)返回小于或等于n的最大整數(shù)LOG(n1,n2)

29、返回以n1為底n2的對數(shù)MOD(n1,n2)返回n1除以n2的余數(shù)POWER(n1,n2)返回n1的n2次方ROUND(n1,n2)返回舍入小數(shù)點(diǎn)右邊n2位的n1的值,n2的默認(rèn)值為0,這會返回小數(shù)點(diǎn)最接近的整數(shù)。如果n2為負(fù)數(shù),就舍入到小數(shù)點(diǎn)左邊相應(yīng)的位上,n2必須是整數(shù)SIGN(n)若n為負(fù)數(shù),則返回-1,若n為正數(shù),則返回1,若n=0,則返回0SIN(n)返回n的正弦值,n為弧度SQRT(n)返回n的平方根,n為弧度TRUNC(n1,n2)返回結(jié)尾到n2位小數(shù)的n1的值,n2默認(rèn)設(shè)置為0,當(dāng)n2為默認(rèn)設(shè)置時(shí),會將n1截尾為整數(shù),如果n2為負(fù)值,就截尾在小數(shù)點(diǎn)左邊相應(yīng)的位上 數(shù)字類函數(shù)主要

30、用于執(zhí)行各種數(shù)據(jù)計(jì)算,所有的數(shù)字類函數(shù)都有數(shù)字參數(shù)并返回?cái)?shù)字值。Oracle系統(tǒng)提供了大量的數(shù)字類函數(shù),這些函數(shù)大大增強(qiáng)了Oracle系統(tǒng)的科學(xué)計(jì)算能力。下面就列出Oracle系統(tǒng)中常見的數(shù)字類函數(shù),如表5-1所示。表5-1數(shù)字類函數(shù)及其說明5.4.2 數(shù)字類函數(shù)(1)CEIL(n)函數(shù)該函數(shù)返回大于或等于數(shù)值n的最小整數(shù),它適合一些比較運(yùn)算。【例5-47】 使用ceil函數(shù)返回3個(gè)指定小數(shù)的整數(shù)值,具體代碼及運(yùn)行結(jié)果如下:SQL select ceil(7.3),ceil(7),ceil(-7.3) from dual; CEIL(7.3) CEIL(7) CEIL(-7.3)- - - 8

31、 7 -7(2)ROUND(n1,n2)函數(shù)該函數(shù)返回舍入小數(shù)點(diǎn)右邊n2位的n1的值,n2的默認(rèn)值為0,這會返回小數(shù)點(diǎn)最接近的整數(shù)。如果n2為負(fù)數(shù),就舍入到小數(shù)點(diǎn)左邊相應(yīng)的位上,n2必須是整數(shù)?!纠?-48】 使用round函數(shù)返回PI為兩位小數(shù)的值,具體代碼及運(yùn)行結(jié)果如下:SQL select round(3.1415926,2) from dual;ROUND(3.1415926,2)-(3)POWER(n1,n2)函數(shù)該函數(shù)返回n1的n2次方。其中n1和n2都為整數(shù)?!纠?-49】 使用power函數(shù)計(jì)算2的3次方的值,具體代碼及運(yùn)行結(jié)果如下:SQL select power(2,3)

32、from dual;POWER(2,3)- 在Oracle 11g中,系統(tǒng)提供了許多用于處理日期和時(shí)間的函數(shù),通過這些函數(shù)可以實(shí)現(xiàn)計(jì)算需要的特定日期和時(shí)間,常用的日期和時(shí)間函數(shù)如表5-2所示。表5-2日期和時(shí)間類函數(shù) 日期類型的默認(rèn)格式是“DD-MON-YY”,其中“DD”表示兩位數(shù)字的“日”,MON表示3位數(shù)字的“月份”。YY表示兩位數(shù)字的“年份”,例如,“01-10月-11”表示2011年10月1日。下面看幾個(gè)常用函數(shù)的具體應(yīng)用。5.4.3 日期和時(shí)間類函數(shù)函 數(shù)說 明ADD_MONTHS(d,i)返回日期d加上i個(gè)月之后的結(jié)果。其中,i為任意整數(shù)LAST_DAY(d)返回包含日期d月份的

33、最后一天MONTHS_BETWEEN(d1,d2)返回d1和d2之間的數(shù)目,若d1和d2的日期都相同,或者都是該月的最后一天,則返回一個(gè)整數(shù),否則返回的結(jié)果將包含一個(gè)小數(shù)NEW_TIME(d1,t1,t2)其中,d1是一個(gè)日期數(shù)據(jù)類型,當(dāng)時(shí)區(qū)t1中的日期和時(shí)間是d1時(shí),返回時(shí)區(qū)t2中的日期和時(shí)間。t1和t2是字符串SYSDATE()返回系統(tǒng)當(dāng)前的日期(1)SYSDATE()函數(shù)該函數(shù)返回系統(tǒng)當(dāng)前的日期。【例5-50】 使用sysdate函數(shù)返回當(dāng)期系統(tǒng)的日期,具體代碼及運(yùn)行結(jié)果如下:SQL select sysdate as 系統(tǒng)日期 from dual;系統(tǒng)日期-29-9月 -11(2)AD

34、D_MONTHS(d,i)函數(shù)該函數(shù)返回日期d加上i個(gè)月之后的結(jié)果。其中,i為任意整數(shù)。【例5-51】 使用ADD_MONTHS函數(shù)在當(dāng)前日期下加上6個(gè)月,并顯示其值,具體代碼及運(yùn)行結(jié)果如下:SQL select ADD_MONTHS(sysdate,6) from dual;ADD_MONTHS(SYS-29-3月 -12 在操作表中的數(shù)據(jù)時(shí),經(jīng)常需要將某個(gè)數(shù)據(jù)從一種類型轉(zhuǎn)換為另外一種數(shù)據(jù)類型,這時(shí)就需要轉(zhuǎn)換類型函數(shù)。比如常見的,有把具有“特定格式”字符串轉(zhuǎn)換為日期、把數(shù)字轉(zhuǎn)換成字符等。常用的轉(zhuǎn)換函數(shù)如表5-3所示。表5-3轉(zhuǎn)換類函數(shù)5.4.4 轉(zhuǎn)換類函數(shù)函 數(shù)說 明CHARTORWIDA(

35、s)該函數(shù)將字符串s轉(zhuǎn)換為RWID數(shù)據(jù)類型CONVERT(s,aset,bset)該函數(shù)將字符串s由bset字符集轉(zhuǎn)換為aset字符集ROWIDTOCHAR()該函數(shù)將ROWID數(shù)據(jù)類型轉(zhuǎn)換為CHAR類型TO_CHAR(x,format)該函數(shù)實(shí)現(xiàn)將表達(dá)式轉(zhuǎn)換為字符串,format表示字符串格式TO_DATE(s,formatlan)該函數(shù)將字符串s轉(zhuǎn)換成date類型,format表示字符串格式,lan表示所使用的語言TO_NUMBER(s,formatlan)該函數(shù)將返回字符串s代表的數(shù)字,返回值按照format格式進(jìn)行顯示,format表示字符串格式,lan表示所使用的語言下面來看幾個(gè)常用

36、轉(zhuǎn)換函數(shù)的具體應(yīng)用。(1)TO_CHAR()函數(shù)該函數(shù)實(shí)現(xiàn)將表達(dá)式轉(zhuǎn)換為字符串,format表示字符串格式【例5-52】 使用to_char函數(shù)轉(zhuǎn)換系統(tǒng)日期為“YYYY-MM-DD”格式,具體代碼及運(yùn)行結(jié)果如下。SQL select sysdate as 默認(rèn)格式日期, to_char(sysdate,YYYY-MM-DD) as 轉(zhuǎn)換后日期 from dual;默認(rèn)格式日期 轉(zhuǎn)換后日期-29-9月 -11 2011-09-29(2)TO_NUMBER(s,formatlan)函數(shù)該函數(shù)將返回字符串s代表的數(shù)字,返回值按照format格式進(jìn)行顯示,format表示字符串格式,lan表示所使用的

37、語言【例5-53】 使用to_number函數(shù)把16進(jìn)制數(shù)“18f”轉(zhuǎn)轉(zhuǎn)為10進(jìn)制數(shù),具體代碼及運(yùn)行結(jié)果如下:SQL select to_number(18f, xxx) as 十進(jìn)制數(shù) from dual; 十進(jìn)制數(shù)- 339 使用聚合類函數(shù)可以針對一組數(shù)據(jù)進(jìn)行計(jì)算,并得到相應(yīng)的結(jié)果。比如常有的操作有計(jì)算平均值、統(tǒng)計(jì)記錄數(shù)、計(jì)算最大值等。Oracle 11g所提供的主要聚合函數(shù)如表5-4所示。表5-4聚合函數(shù) 在實(shí)際的應(yīng)用系統(tǒng)開發(fā)中,聚合函數(shù)應(yīng)用比較廣泛,比如統(tǒng)計(jì)平均值、記錄總數(shù)等。下面來看一個(gè)例子。5.4.5 聚合類函數(shù)函 數(shù)說 明AVG(xDISTINCT|ALL)計(jì)算選擇列表項(xiàng)的平均值

38、,列表項(xiàng)目可以是一個(gè)列或多個(gè)列的表達(dá)式COUNT(xDISTINCT|ALL)返回查詢結(jié)果中的記錄數(shù)MAX(xDISTINCT|ALL)返回選擇列表項(xiàng)目中的最大數(shù),列表項(xiàng)目可以是一個(gè)列或多個(gè)列的表達(dá)式MIN(xDISTINCT|ALL)返回選擇列表項(xiàng)目中的最小數(shù),列表項(xiàng)目可以是一個(gè)列或多個(gè)列的表達(dá)式SUM(xDISTINCT|ALL)返回選擇列表項(xiàng)目的數(shù)值總和,列表項(xiàng)目可以是一個(gè)列或多個(gè)列的表達(dá)式VARIANCE(xDISTINCT|ALL)返回選擇列表項(xiàng)目的統(tǒng)計(jì)方差,列表項(xiàng)目可以是一個(gè)列或多個(gè)列的表達(dá)式STDDEV(xDISTINCT|ALL)返回選擇列表項(xiàng)目的標(biāo)準(zhǔn)偏差,列表項(xiàng)目可以是一個(gè)列

39、或多個(gè)列的表達(dá)式 【例5-54】 在SCOTT模式下,使用count函數(shù)計(jì)算員工總數(shù),使用avg函數(shù)計(jì)算平均工資,具體代碼及運(yùn)行結(jié)果如下:SQL select count(empno) as 員工總數(shù),round(avg(sal),2) as 平均工資 from emp; 員工總數(shù) 平均工資-5.5 子查詢的用法5.5.1 什么是子查詢5.5.2 單行子查詢5.5.3 多行子查詢5.5.4 關(guān)聯(lián)子查詢 子查詢是在SQL語句內(nèi)的另外一條SELECT語句,也被稱為內(nèi)查詢或是內(nèi)SELECT語句。在SELECT、INSERT、UPDATE或DELETE命令中允許是一個(gè)表達(dá)式的地方都可以包含子查詢,子查

40、詢甚至可以包含在另外一個(gè)子查詢中。 【例5-55】 在SCOTT模式下,在emp表中查詢部門名稱(dname)為“RESEARCH”的員工信息,具體代碼如下。SQL select empno,ename,job from emp 2 where deptno=(select deptno from dept 3 where dname=RESEARCH);本例運(yùn)行結(jié)果如圖5-32所示。圖5-32 子查詢5.5.1 什么是子查詢 在一般情況下,外查詢語句語句檢索一行,子查詢語句需要檢索一遍數(shù)據(jù),然后判斷外查詢語句的條件是否滿足。如果條件滿足,則外查詢語句將檢索到的數(shù)據(jù)行添加到結(jié)果集中,如果條件不

41、滿足,則外查詢語句繼續(xù)檢索下一行數(shù)據(jù),所以子查詢相對多表關(guān)聯(lián)查詢要慢一些。另外,在使用子查詢時(shí),還應(yīng)注意以下規(guī)則:子查詢必須用括號“()”括起來。子查詢中不能包括ORDER BY子句。子查詢允許嵌套多層,但不能超過255層。 在Oracle 11g中,通常把子查詢再細(xì)化為單行子查詢、多行子查詢和關(guān)聯(lián)子查詢3種,下面對這些子查詢進(jìn)行詳細(xì)講解。 單行子查詢是指返回一行數(shù)據(jù)的子查詢語句。當(dāng)在WHERE子句中引用單行子查詢時(shí),可以使用單行比較運(yùn)算符(=、=、=和)。【例5-56】 在emp表中,查詢出既不是最高工資,也不是最低工資的員工信息,具體代碼如下:SQL select empno,ename,

42、sal from emp 2 where sal (select min(sal) from emp) 3 and sal select empno,ename,job 2 from emp where deptno in 3 (select deptno from dept where dnameSALES);本例運(yùn)行結(jié)果如圖5-34所示。圖5-34 多行子查詢2使用ANY運(yùn)算符ANY運(yùn)算符必須與單行操作符結(jié)合使用,并且返回行只要匹配子查詢的任何一個(gè)結(jié)果即可。5.5.3 多行子查詢 【例5-58】 在emp表中,查詢工資大于部門編號為10的任意一個(gè)員工工資即可的其它部門的員工信息,具體代碼如

43、下:SQL select deptno,ename,sal from emp where sal any 2 (select sal from emp where deptno = 10) and deptno 10;本例運(yùn)行結(jié)果如圖5-35所示。圖5-35 ANY運(yùn)算符3使用ALL運(yùn)算符ALL運(yùn)算符必須與單行運(yùn)算符結(jié)合使用,并且返回行必須匹配所有子查詢結(jié)果。【例5-59】 在emp表中,查詢工資大于部門編號為10的所有員工工資的員工信息,具體代碼如下:SQL select deptno,ename,sal from emp where sal all 2 (select sal from e

44、mp where deptno = 30);本例運(yùn)行結(jié)果如圖5-36所示。圖5-36 ALL運(yùn)算符 在當(dāng)行子查詢和多行子查詢中,內(nèi)查詢和外查詢是分開執(zhí)行的,也就是說內(nèi)查詢的執(zhí)行與外查詢的執(zhí)行是沒有關(guān)系的,外查詢僅僅是使用內(nèi)查詢的最終結(jié)果。在一些特殊需求的子查詢中,內(nèi)查詢的執(zhí)行需要借助于外查詢,而外查詢的執(zhí)行又離不開內(nèi)查詢的執(zhí)行,這時(shí),內(nèi)查詢和外查詢是相互關(guān)聯(lián)的,這種子查詢就被稱為關(guān)聯(lián)子查詢?!纠?-60】 在emp表中,使用“關(guān)聯(lián)子查詢”檢索工資大于同職位的平均工資的員工信息,具體代碼如下。SQL select empno,ename,sal 2 from emp f 3 where sal

45、(select avg(sal) from emp where job = f.job) 4 order by job;本例運(yùn)行結(jié)果如圖5-37所示。圖5-37 關(guān)聯(lián)子查詢5.5.4 關(guān)聯(lián)子查詢5.6 操作數(shù)據(jù)庫5.6.1 插入數(shù)據(jù)(INSERT 語句)5.6.2 更新數(shù)據(jù)(UPDATE語句)5.6.3 刪除數(shù)據(jù)(DELETE語句和TRUNCATE語句) 插入數(shù)據(jù)就是將數(shù)據(jù)記錄添加到已經(jīng)存在的數(shù)據(jù)表中,Oracle數(shù)據(jù)庫通過INSERT語句來實(shí)現(xiàn)插入數(shù)據(jù)記錄。該語句既可以實(shí)現(xiàn)向數(shù)據(jù)表中一次插入一條記錄,也可以使用SELECT子句將查詢結(jié)果集批量插入數(shù)據(jù)表。單條插入數(shù)據(jù)是INSERT語句最基本的

46、用法,其用法格式如下:INSERT INTO table_name (column_name1,column_name2)VALUES(express1,express2)參數(shù)說明如下:table_name:表示要插入的表名。column_name1和column_name2:指定表的完全或部分列名稱。express1和express2:表示要插入的值列表 在INSERT語句的幾種使用方式中,最常用的形式是在INSERT INTO子句中指定添加數(shù)據(jù)的列,并在VALUES子句中為各個(gè)列提供一個(gè)值。5.6.1 插入數(shù)據(jù)(INSERT 語句)【例5-61】 在dept表中,使用INSERT語句添加一

47、條記錄,具體代碼及運(yùn)行結(jié)果如下:SQL insert into dept(deptno,dname,loc) 2 values(88,design,beijing);已創(chuàng)建 1 行。 在上面的示例中,INSERT INTO子句中指定添加數(shù)據(jù)的列,既可以是數(shù)據(jù)表的全部列,也可以是部分列。在指定部分列時(shí),需要注意不許為空(NOT NULL)的列必須被指定出來,并且在values子句中的對應(yīng)賦值也不許為NULl,否則系統(tǒng)顯示“無法將 NULL 插入”的錯(cuò)誤信息提示。例如,修改上面的例子,在INSERT INTO子句不指定deptno列(通過desc dept命令可以看到該列是NOT NULL的),將

48、出現(xiàn)如圖5-38所示的錯(cuò)誤提示。圖5-38 不許為空的錯(cuò)誤提示說明: 在使用INSERT INTO子句指定為表的部分列添加數(shù)據(jù)時(shí),為了防止產(chǎn)生不許為空值的錯(cuò)誤,可以使用DESC命令查看數(shù)據(jù)表中的哪些列不許為空。對于可以為空的列,用戶可以不指定其值。 在向表的所有列添加數(shù)據(jù)時(shí),也可以省略INSERT INTO 子句后面的列表清單,使用這種方法時(shí),必須根據(jù)表中定義的列的順序,為所有的列提供數(shù)據(jù)。用戶可以使用DESC命令來查看表中定義列的順序。 如果表中的數(shù)據(jù)不正確或不符合需求,那么就需要對其進(jìn)行修改。Oracle數(shù)據(jù)庫通過UPDATE語句來實(shí)現(xiàn)修改現(xiàn)有的數(shù)據(jù)記錄。 在更新數(shù)據(jù)時(shí),更新的列數(shù)可以由用

49、戶自己指定,列于列之間用逗號(“,”)分隔;更新的條數(shù)可以通過WHERE子句來加以限制,使用WHERE子句時(shí),系統(tǒng)只更新符合WHERE條件的記錄信息。UPDATE語句的語法格式如下:UPDATE table_nameSET column_name1=express1,column_name2=express2.| (column_name1,column_name2)=(selectSubquery)WHERE condition參數(shù)說明如下:table_name:表示要修改的表名。column_name1和column_name2:表示指定要更新的列名。selectSubquery:任何合法

50、的SELECT語句,其所選列的個(gè)數(shù)和類型要與語句中的column對應(yīng)。condition:篩選條件表達(dá)式,只有符合篩選條件的記錄才被更新。5.6.2 更新數(shù)據(jù)(UPDATE語句)【例5-62】 在SCOTT模式下,把emp表中職務(wù)是銷售員(SALESMAN)的工資上調(diào)20%,具體代碼及運(yùn)行結(jié)果如下:SQL update emp 3 where job=SALESMAN;已更新4行。 上面的代碼中,UPDATE語句更新記錄的數(shù)量通過WHERE子句實(shí)現(xiàn)控制的,這里限制只更新銷售員的工資,若取消WHERE子句的限制,則系統(tǒng)會將emp表中所有人員的工資都上調(diào)20%。另外,同INSERT語句一樣,UPD

51、ATE語句也可以與SELECT語句組合使用來達(dá)到更新數(shù)據(jù)的目的。【例5-63】 在SCOTT模式下,把emp表中工資小于2000的雇員工資調(diào)整為管理者的平均工資水平,具體代碼及運(yùn)行結(jié)果如下:SQL update emp 2 set sal = (select avg(sal) 3 from emp where job = MANAGER) 4 where sal delete from scott.emp where empno = 7369;已刪除 1 行。上面的代碼中,DELETE語句刪除記錄的數(shù)量通過WHERE子句實(shí)現(xiàn)控制的,這里限制只刪除職務(wù)編號(job_id)是“PRO”記錄,若取消

52、WHERE子句的限制,則系統(tǒng)會將jobs表中所有人員的記錄都刪除。 2TRUNCATE語句 如果用戶確定要?jiǎng)h除表中的所有記錄,則除了可以使用DELETE語句之外,還可以使用TRUNCATE語句,而且Oracle本身也建議使用TRUNCATE語句。 使用TRUNCATE語句刪除表中的所有記錄要比DELETE語句快得多。這是因?yàn)槭褂肨RUNCATE語句刪除數(shù)據(jù)時(shí),它不會產(chǎn)生回滾記錄。當(dāng)然,執(zhí)行了TRUNCATE語句的操作也就無法使用ROLLBACK語句撤銷。5.7 事務(wù)處理5.7.1 事務(wù)概述5.7.2 操作事務(wù)5.7.1 事務(wù)概述 當(dāng)使用事務(wù)修改多個(gè)數(shù)據(jù)表時(shí),如果在處理的過程中出現(xiàn)了某種錯(cuò)誤,例

53、如系統(tǒng)死機(jī)或突然斷電等情況,則返回結(jié)果是數(shù)據(jù)全部沒有被保存。因?yàn)槭聞?wù)處理的結(jié)果只有兩種:一種是在事務(wù)處理的過程中,如果發(fā)生了某種錯(cuò)誤則整個(gè)事務(wù)全部回滾,使所有對數(shù)據(jù)的修改全部撤銷,事務(wù)對數(shù)據(jù)庫的操作是單步執(zhí)行的,當(dāng)遇到錯(cuò)誤時(shí)可以隨時(shí)地回滾;另一種是如果沒有發(fā)生任何錯(cuò)誤且每一步的執(zhí)行都成功,則整個(gè)事務(wù)全部被提交。從而可以看出,有效地使用事務(wù)不但可以提高數(shù)據(jù)的安全性,而且還可以增強(qiáng)數(shù)據(jù)的處理效率。 事務(wù)包含4種重要的屬性,被統(tǒng)稱為ACID(原子性、一致性、隔離性和持久性),一個(gè)事務(wù)必須通過ACID。(1)原子性(Atomic):事務(wù)是一個(gè)整體的工作單元,事務(wù)對數(shù)據(jù)庫所做的操作要么全部執(zhí)行,要么全部

54、取消。如果某條語句執(zhí)行失敗,則所有語句全部回滾。(2)一致性(ConDemoltent):事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。如果事務(wù)成功,則所有數(shù)據(jù)將變?yōu)橐粋€(gè)新的狀態(tài);如果事務(wù)失敗,則所有數(shù)據(jù)將處于開始之前的狀態(tài)。(3)隔離性(Isolated):由事務(wù)所作的修改必須與其他事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)時(shí)數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會查看中間狀態(tài)的數(shù)據(jù)。(4)持久性(Durability):當(dāng)事務(wù)提交后,對數(shù)據(jù)庫所做的修改就會永久保存下來。5.7.

55、2 操作事務(wù) Oracle 11g中的事務(wù)是隱式自動開始的,它不需要用戶顯示地執(zhí)行開始事務(wù)語句。但對于事務(wù)的結(jié)束處理,則需要用戶進(jìn)行指定的操作,通常在以下情況時(shí),Oracle認(rèn)為一個(gè)事務(wù)結(jié)束了。(1)執(zhí)行COMMIT語句提交事務(wù)。(2)指定ROLLBACK語句撤銷事務(wù)。(3)執(zhí)行一條數(shù)據(jù)定義語句,比如,CREATE、DROP或ALTER等語句。如果該語句執(zhí)行成功,那么Oracle系統(tǒng)會自動執(zhí)行COMMIT命令;否則,則Oracle系統(tǒng)會自動執(zhí)行ROLLBACK命令。(4)執(zhí)行一個(gè)數(shù)據(jù)控制命令,比如,GRANT、REVOKE等控制命令,這種操作執(zhí)行完畢,Oracle系統(tǒng)會自動執(zhí)行COMMIT命令

56、。(5)正常地?cái)嚅_數(shù)據(jù)庫的連接、正常地退出SQL*Plus環(huán)境,則Oracle系統(tǒng)會自動執(zhí)行COMMIT命令;否則,則Oracle系統(tǒng)會自動執(zhí)行ROLLBACK命令。 綜合上面5種情況可知,Oracle結(jié)束一個(gè)是事務(wù)歸根結(jié)底要么執(zhí)行COMMIT語句,要么執(zhí)行ROLLBACK語句,下面對這兩種語句進(jìn)行介紹。1提交事務(wù)(COMMIT語句) 提交事務(wù)是指把對數(shù)據(jù)庫進(jìn)行的全部操作持久性地保存到數(shù)據(jù)庫中,這種操作通常使用COMMIT語句來完成。在使用該語句提交事務(wù)時(shí),Oracle系統(tǒng)內(nèi)部會按照如下順序進(jìn)行處理。(1)首先在回滾段內(nèi)記錄當(dāng)前事務(wù)已提交,并且聲稱一個(gè)唯一的系統(tǒng)該編號(SCN),以唯一標(biāo)識這個(gè)

57、事務(wù)。(2)然后啟動后臺的日志寫入進(jìn)程(LGWR),將SGA區(qū)的重做日志緩沖區(qū)中的數(shù)據(jù)和當(dāng)前事物的SCN寫入重做日志文件中。(3)接著Oracle服務(wù)器開始釋放事務(wù)處理所使用的系統(tǒng)資源。(4)最后顯示通知,告訴用戶事務(wù)已經(jīng)成功提交完畢?!纠?-65】 實(shí)現(xiàn)向scott模式下的emp表中添加數(shù)據(jù),并提交事務(wù),代碼即運(yùn)行結(jié)下:SQL insert into scott.emp(empno,ename,job) values(7901,LUCY,CLERK);已創(chuàng)建 1 行。SQL commit;提交完成。在上面的示例中,如果用戶不使用commit提交事務(wù),此時(shí),再開啟一個(gè)SQL*Plus環(huán)境(但要

58、求當(dāng)前的SQL*Plus環(huán)境不退出,若退出,Oracle系統(tǒng)會自動執(zhí)行commit語句提交數(shù)據(jù)庫),然后在HR模式下查詢jobs_temp表,會發(fā)現(xiàn)新增加的記錄不存在。若用戶使用commit語句提交事務(wù),則在另一個(gè)SQL*Plus環(huán)境下就能夠查詢到新增加的記錄。2回滾事務(wù)(ROLLBACK語句)回退事務(wù)是指撤銷對數(shù)據(jù)庫進(jìn)行的全部操作,Oracle利用回退段來存儲修改前的數(shù)據(jù),通過重做日志來記錄對數(shù)據(jù)所做的修改。如果要回退整個(gè)事務(wù),Oracle系統(tǒng)內(nèi)部將會執(zhí)行如下操作過程。(1)首先使用回退段中的數(shù)據(jù)撤銷對數(shù)據(jù)庫所做的修改。(2)然后Oracle后臺服務(wù)進(jìn)程釋放掉事務(wù)所使用的系統(tǒng)資源。(3)最后

59、顯示通知,告訴用戶事務(wù)回退成功。Oracle不僅允許回退整個(gè)未提交的事務(wù),還允許回退事務(wù)的一部分,這是可以通過“保存點(diǎn)”來完成。在事務(wù)的執(zhí)行過程中,用戶可以通過建立保存點(diǎn)將一個(gè)較長的失誤分隔為幾部分。這樣用戶就可以有選擇性地回退到某個(gè)保存點(diǎn),并且該保存點(diǎn)之后的操作都將被取消 【例5-66】 新建stu表,并向表中先后添加兩條數(shù)據(jù),使用保存點(diǎn)(savepoint)回滾最后添加的記錄,代碼及運(yùn)行結(jié)果如下。SQL create table stu(sid number primary key,sname varchar(10),sage number);表已創(chuàng)建。SQL insert into st

60、u values(1,lili,25);已創(chuàng)建 1 行。SQL savepoint sp;保存點(diǎn)已創(chuàng)建。SQL insert into stu values(2,lucy,26);已創(chuàng)建 1 行。SQL select * from stu; SID SNAME SAGE- - - 1 lili 25 2 lucy 26SQL rollback to savepoint sp;回退已完成。SQL commit;提交完成。SQL select * from stu; SID SNAME SAGE- - - 1 lili 255.8 常規(guī)SQL語句優(yōu)化5.8.1 建議不用“*”來代替所有列名5.8.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論