




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Oracle11G課程總結(jié)Oracle11G總結(jié)HYPERLINK數(shù)據(jù)庫概念HYPERLINKOracle體系結(jié)構(gòu)HYPERLINKOracle安裝(高級安裝)HYPERLINK啟動OracleHYPERLINKSQL語句HYPERLINKOracle數(shù)據(jù)類型HYPERLINKSQL語句使用HYPERLINKSQL函數(shù)HYPERLINKOracle數(shù)據(jù)庫對象HYPERLINKdirectory目錄HYPERLINK外部表HYPERLINK臨時表HYPERLINK序列HYPERLINK視圖HYPERLINK同義詞HYPERLINK索引HYPERLINK表分區(qū)HYPERLINK并發(fā)與鎖HYPERLINK行級鎖HYPERLINK表級鎖HYPERLINKPL/SQL基礎(chǔ)HYPERLINKPL/SQL簡介HYPERLINKPL/SQL塊基本結(jié)構(gòu)HYPERLINKPL/SQL變量與常量HYPERLINKPL/SQL控制結(jié)構(gòu)HYPERLINKPL/SQL集合HYPERLINK游標管理HYPERLINK異常處理HYPERLINKOracle數(shù)據(jù)字典HYPERLINK子程序和程序包HYPERLINK過程HYPERLINK函數(shù)HYPERLINK自主事務(wù)處理HYPERLINK程序包HYPERLINK觸發(fā)器和內(nèi)置程序包HYPERLINK觸發(fā)器HYPERLINK內(nèi)置程序包HYPERLINK備份與恢復HYPERLINK使用PowerDesignser設(shè)計數(shù)據(jù)庫HYPERLINK創(chuàng)建CDMHYPERLINK創(chuàng)建PDMHYPERLINKPD連接Oracle數(shù)據(jù)HYPERLINK去除生成Oracle腳本中雙引號HYPERLINK逆向工程HYPERLINK疑難HYPERLINK無法啟動OracleTNSListener監(jiān)聽服務(wù)HYPERLINK刪除Oracle中奇怪的表名稱BIN$…的方法周三擴展課HYPERLINK2011年2月16日SQL語句處理過程HYPERLINK2011年2月23日Oracle優(yōu)化器及執(zhí)行計劃HYPERLINK2011年3月2日動態(tài)SQL語句、Java創(chuàng)建及調(diào)用存儲過程(重點)
數(shù)據(jù)庫概念Oracle、DB2、SQLServer屬于關(guān)系型數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫采用結(jié)構(gòu)化查詢語言(SQL)作為客戶端程序與數(shù)據(jù)庫服務(wù)器間溝通的橋梁——客戶端發(fā)送SQL指令到服務(wù)器端,服務(wù)器端執(zhí)行相關(guān)的指令并返回其查詢的結(jié)果。數(shù)據(jù)建模要將顯示世界中客觀存在的事物以數(shù)據(jù)的形式存儲到計算機中并進行處理,就需要對其進行分析、抽象,進而確定數(shù)據(jù)的結(jié)構(gòu)以及數(shù)據(jù)間的內(nèi)在聯(lián)系,這一過程成為數(shù)據(jù)建模。數(shù)據(jù)模型應(yīng)滿足三個方面要求:能夠比較真實地模擬現(xiàn)實世界容易為人所理解便于計算機實現(xiàn)數(shù)據(jù)模型三要素:數(shù)據(jù)結(jié)構(gòu)-描述事物的靜態(tài)特性數(shù)據(jù)操作-描述事物的動態(tài)特性完整性約束-描述事物內(nèi)部和事物間的約束性關(guān)系E-R模型在E-R模型中,現(xiàn)實世界時由一且成為實體的對象和這些對象之間的關(guān)系組成的。在E-R模型三要素:實體、關(guān)系、屬性。E-R圖是描述概念事物,建立概念模型的實用工具。E-R三要素:實體-用矩形表示屬性-用橢圓形表示,并用連線與實體連在一起。實體間聯(lián)系-用菱形框表示,并用連線分別與相關(guān)實體相連,且需在連線上注明聯(lián)系類型。實體間聯(lián)系類型:一對一關(guān)系(1:1):兩個實體集A和B,若A中的每個實體至多和B中一個實體有聯(lián)系,反之,B中的每個實體至多和A中的一個實體有聯(lián)系,稱A對B或B對A是一對一關(guān)系。一對多關(guān)系(1:N):兩個實體集A和B,如果A中每個實體可以和B中的0~多個實體有聯(lián)系,而B中的每個實體至多和A中的一個實體有聯(lián)系,則稱A對B為一對多關(guān)系。多對多關(guān)系(M:N):兩個實體集A和B,若A中的每個實體可與B中的多個實體有聯(lián)系,反之亦然,稱A對B或B對A是多對多關(guān)系。
Oracle體系結(jié)構(gòu)Oracle數(shù)據(jù)庫特點:全球化、跨平臺的數(shù)據(jù)庫Oracle遵守數(shù)據(jù)存取語言、操作系統(tǒng)、用戶接口和網(wǎng)絡(luò)通信協(xié)議的工業(yè)標準支持多用戶、高性能的事務(wù)處理強大的安全性控制和完整性控制支持分布式數(shù)據(jù)庫和分布處理OracleDBMS(Oracle數(shù)據(jù)庫管理系統(tǒng))由Oracle數(shù)據(jù)庫和Oracle實例組成。Oracle數(shù)據(jù)庫:Oracle數(shù)據(jù)庫包含操作系統(tǒng)文件(也稱為數(shù)據(jù)庫文件),這些文件為數(shù)據(jù)庫信息提供了實際的物理存儲。Oracle數(shù)據(jù)庫:物理組件數(shù)據(jù)文件(.DBF)日志文件(.LOG)控制文件(.CTL)邏輯組件(由小到大)數(shù)據(jù)塊:最小存儲單元(默認8K)區(qū):最小分配單元(8/16個塊)段:數(shù)據(jù)段、回退段、臨時段、索引段,由區(qū)組成,分類型存儲物理組件的之間交互順序:Oracle啟動→init.ora→控制文件→數(shù)據(jù)文件、日志文件。Oracle實例(例程):Oracle實例是由內(nèi)存結(jié)構(gòu)和后臺進程組成。只有啟動實例后,才能訪問數(shù)據(jù)庫中的數(shù)據(jù)。Oracle實例內(nèi)存結(jié)構(gòu):SGA:Oracle核心引擎所需內(nèi)存。(見下圖)PGA:服務(wù)器進程所需的內(nèi)存。UGA:用戶進程所需的內(nèi)存SGA包括:數(shù)據(jù)緩沖區(qū):用于存儲從磁盤數(shù)據(jù)文件中讀入的數(shù)據(jù),所有用戶共享。服務(wù)器進程將讀入的數(shù)據(jù)保存在數(shù)據(jù)緩沖區(qū)中,當后續(xù)的請求需要這些數(shù)據(jù)時可以在內(nèi)存中找到,不需要再從磁盤讀取,提高了讀取速度。日志緩沖區(qū):日志記錄數(shù)據(jù)庫的所有修改信息,日志信息首先產(chǎn)生于日志緩沖區(qū)。當日志緩沖區(qū)的日志數(shù)據(jù)達到一定數(shù)量時,由后臺進程將日志數(shù)據(jù)寫入日志文件中。相對來說,日志緩沖區(qū)對數(shù)據(jù)庫的性能影響較小。共享池:共享池是對SQL、PL/SQL程序進行語法分析、編譯、執(zhí)行的內(nèi)存區(qū)域共享池由庫高速緩存和數(shù)據(jù)字典緩存組成。庫高速緩存:主要負責執(zhí)行過的SQL語句。數(shù)據(jù)字典高速緩沖:數(shù)據(jù)字典的信息。共享池的大小直接影響數(shù)據(jù)庫的性能。Java池:使用Java程序時需要的內(nèi)存。大型共享池(大池):寫入或讀取大型文件、多媒體所需的內(nèi)存。Oracle實例后臺進程:SMON:系統(tǒng)監(jiān)控進程在實例失敗之后,重新打開數(shù)據(jù)庫時自動恢復實例。整理數(shù)據(jù)文件的自由空間,將相鄰區(qū)域結(jié)合起來。釋放不再使用的臨時段。PMON:進程監(jiān)控進程清理出現(xiàn)故障的進程。釋放所有當前掛起的鎖定。釋放故障進程使用的資源。DBWR:數(shù)據(jù)寫入器進程管理數(shù)據(jù)緩沖區(qū),將最近使用過的塊保留在內(nèi)存中。將修改后的緩沖區(qū)數(shù)據(jù)寫入數(shù)據(jù)文件中。LGWR:日志寫入器進程負責將日志緩沖區(qū)中的日志數(shù)據(jù)寫入日志文件。系統(tǒng)有多個日志文件,該進程以循環(huán)的方式將數(shù)據(jù)寫入文件。CKPT:檢查點進程(校驗點,同步點)在這個點,數(shù)據(jù)文件與日志文件是完全同步的。ARCH:歸檔進程查看Oracle體系結(jié)構(gòu)信息1,查看塊信息sql>Selectname,valuefromv$parameterwherename=‘db_block_size’2,查看盤區(qū)信息sql>select*fromuser_extents3,查看段信息sql>select*fromuser_segments4,查看段信息sql>select*fromuser_tablespaces;5,查看數(shù)據(jù)文件sql>select*fromv$datafile;5,查看控制文件sql>Select*fromv$controlfile;6,查看系統(tǒng)全局區(qū)sql>select*fromv$sga;7,查看數(shù)據(jù)緩沖區(qū)sql>selectname,value,DESCRIPTIONfromv$parameterwherenamelike'db_cache_size';8,查看共享池sql>selectname,value,DESCRIPTIONfromv$parameterwherenamelike'shared_pool_size';9,查看日志緩沖區(qū)sql>selectname,value,DESCRIPTIONfromv$parameterwherenamelike'log_buffer';10,程序全局區(qū)sql>selectname,value,DESCRIPTIONfromv$parameterwherename='pga_aggregate_target';
安裝Oracle11GORACLE提供ORACLEUniversalInstaller(ORACLE通用安裝工具,簡稱為OUI)是一個基于java技術(shù)的圖形界面安裝工具,利用它可以完成在不同操作系統(tǒng)平臺上實現(xiàn)ORACLE的安裝。無論是什么操作系統(tǒng)平臺都有OUI工具。11G可以進行基本安裝和高級安裝?;景惭b較為簡單,高級安裝較為復雜,但可以較對安裝有一個全面的了解。我們在此就進行高級安裝。步驟1:我們以administrator登錄后,雙擊databases文件夾中的setup.exe文件步驟2:啟動OUI后出現(xiàn)“選擇安裝方式”窗口,我們選擇:高級安裝步驟3:出現(xiàn)“選擇安裝類型”窗口,選擇我們需要安裝的版本。我們在此肯定是選擇企業(yè)版。至于產(chǎn)品語言不用選擇,它會根據(jù)當前系統(tǒng)的語言自動調(diào)整!步驟4:出現(xiàn)“安裝位置”窗口Oracle基目錄:用于安裝各種與ORACLE軟件和配置有關(guān)的文件的頂級目錄。軟件位置:用于存放安裝具體ORACLE產(chǎn)品的主目錄和路徑。在此我們使用默認的配置。在此ORACLE會選擇剩余空間最多的盤作為基目錄和安裝目錄的所在盤??梢暂斎胍粋€電子郵件或是metalink接收安全問題通知,在此我直接輸入一個電子郵件,當然也可以是metalink用戶信息!步驟5:再向下就是對安裝環(huán)境進行檢測,如果不滿足條件則會給出相應(yīng)的提示,如圖所示:在此是因為我的內(nèi)存不足,所以會報此提示,那么我們在此調(diào)整內(nèi)存,以滿足條件后再繼續(xù)安裝。步驟6:出現(xiàn)“選擇配置選項”如圖:在此選擇安裝數(shù)據(jù)庫。如果是“配置自動存儲管理”,則自動存儲管理(ASM)可用來自動化和簡化對數(shù)據(jù)文件、控制文件和日志文件的優(yōu)化布局。自動存儲管理(ASM)將每個文件切割成許多小擴展文件,并將它們平均分散在一個磁盤組的所有磁盤上。一旦自動存儲管理(ASM)磁盤組建立,創(chuàng)建和刪除文件的時候,Oracle數(shù)據(jù)庫都會從磁盤組自動分配存儲空間。如果是“僅安裝軟件”,則只安裝ORACLE軟件,在安裝之后還需要再運行數(shù)據(jù)庫配置助手創(chuàng)建數(shù)據(jù)庫。步驟7:出現(xiàn)“選擇數(shù)據(jù)庫配置”窗口,在此需要選擇在安裝過程中創(chuàng)建的數(shù)據(jù)庫類型。一般用途/事務(wù)處理:適合各種用途的預配置數(shù)據(jù)庫。數(shù)據(jù)倉庫:創(chuàng)建適用于特定需求并運行復雜查詢環(huán)境。常用于存儲并快速訪問大量記錄數(shù)據(jù)。高級:安裝結(jié)束后運行ORACLEDBCA后,用戶才可以配置數(shù)據(jù)庫。在此我們選擇“一般用途/事務(wù)處理”步驟8:單獨下一步后,出現(xiàn)“指定數(shù)據(jù)庫配置選項”全局數(shù)據(jù)庫名:主要用于在分布式數(shù)據(jù)庫系統(tǒng)中,區(qū)分不同的數(shù)據(jù)庫使用,如北京有一個數(shù)據(jù)庫db1,上海也有一個同名數(shù)據(jù)庫,怎么區(qū)分它們呢,在此可以使用數(shù)據(jù)庫名.域名的形式,這樣即使數(shù)據(jù)庫名相同,也可以區(qū)分開。SID(系統(tǒng)ID):主要是區(qū)分同一臺計算機上的不同數(shù)據(jù)庫。應(yīng)用在同一個計算機上的不高數(shù)據(jù)庫的不同實例。步驟9:再向下就是“指定數(shù)據(jù)庫的詳細資料”:在此一般都保持默認即可,但是可以選擇“創(chuàng)建帶樣本方案的數(shù)據(jù)庫”也就是一個可供大家練習的一個樣本數(shù)據(jù)庫。步驟10:下一步后,出現(xiàn)下圖使用默認配置即可,可以使用ORACLEEnterpriseManager(OEM)在本地管理每個ORACLE數(shù)據(jù)庫。步驟11:下一步后,出現(xiàn)“數(shù)據(jù)庫存儲選項”,選擇存儲數(shù)據(jù)庫文件的方法和存儲位置在此選擇使用文件系統(tǒng),默認配置即可,但一般推薦此位置最好不是系統(tǒng)分區(qū)步驟12:指定備份和恢復選項:我們在此使用默認配置:不啟用自動備份步驟13:指定數(shù)據(jù)庫口令:如圖所示我們在此為了方便記憶使用所有帳戶都使用同一個口令。步驟14:出現(xiàn)“ORACLEConfigurationManage注冊”界面,如圖所示:但需要在此輸入客戶帳號及用戶名,但如果沒有CSI及metalink帳戶,則只能是在此不安裝此組件。步驟15:出現(xiàn)摘要后,點擊下一步,開始安裝:最后需要注意的是,安裝成功能后會有一個"口令管理",在此需要進行相應(yīng)設(shè)置,如圖所示:在此可以對相應(yīng)的用戶進行解鎖或是鎖定操作,但scott一定要解鎖,并設(shè)置口令,一般口令習慣設(shè)置為:tiger,因為一些工具軟件如ONCA或ONM會默認使用此口令進行連接.然后根據(jù)提示即可完成ORACLE11G的安裝!五、
安裝后的測試:一般來說,只要是安裝的過程中不出現(xiàn)任何問題,則說明安裝是正常的,但我們還是需要一個可行的方法來驗證安裝是否正常。首先:我們可以查看開始菜單,會多出與ORACLE相關(guān)的程序組:再次,可以查看ORACLE相關(guān)的服務(wù):ORACLE安裝成功后,也是以服務(wù)的形式存在于系統(tǒng)中,所以我們會看到在系統(tǒng)中存在以下的服務(wù):OracleOrclVSSWriterService:Oracle對VSS(卷影)的支持服務(wù)OracleDBConsoleorcl:控制臺服務(wù),也就是ORACLE的企業(yè)管理器OracleJobSchedulerORCL:定時器服務(wù),用于數(shù)據(jù)庫工作日程調(diào)度。OracleOraDb11g_home1TNSListener:監(jiān)聽器服務(wù),此服務(wù)只有在數(shù)據(jù)庫需要遠程訪問時才需要。OracleServiceORCL:數(shù)據(jù)庫服務(wù),這算是ORACLE的核心服務(wù),用于啟動和停止ORACLE服務(wù).再次,當ORACLE安裝完成后會修改環(huán)境變量:如圖所示再有,就是ORACLE也和一般的軟件一樣,安裝的過程也是向硬盤上復制文件和修改注冊表,在這里不再詳細描述。三、啟動Oracle首先啟動Oracle核心服務(wù)OracleServiceXXX核心服務(wù)。OracleTNSListener監(jiān)聽服務(wù)(默認1521端口),如刷新多次后,該服務(wù)仍未啟動,即重新配置監(jiān)聽程序。(見下文※重新配置監(jiān)聽程序)3.OracleDBConsoleXXX控制臺工具(基于Web客戶端),如無法啟動,有可能是主機名更改過,可到(上文oracle基本概念第5部分網(wǎng)絡(luò)配置修改tnsnames.ora文件)。啟動以上3個服務(wù)后,可通過以下方式啟動Oracle11GPL/SQLDeveloperSQLPlusSQLDeveloperPL/SQLDeveloper啟動:1.雙擊PL/SQLDeveloper圖標后,出現(xiàn)以下登錄界面。2.登錄后界面,標題欄將會顯示登錄用戶名和身份。3.選中菜單欄中“File”—“New”—“CommandFile”打開命令窗口,執(zhí)行相關(guān)SQL語句操作。SQLPlus啟動:打開SQLPlus。必需輸入用戶名和密碼才能登錄,格式:用戶名/密碼,如果是sys賬號登錄必需加sysdba,格式:用戶名/密碼assysdba,成功登錄后,方可進行相關(guān)操作。SQLDeveloper啟動(后添加)
SQL語句SQL語句類別:DDL,數(shù)據(jù)定義語言(create、alter、drop、truncate)DML,數(shù)據(jù)操縱語言(insert、update、delete、select)DCL,數(shù)據(jù)控制語言(grant、revoke)TCL,事務(wù)性控制語言(commit、rollback、savepoint)數(shù)據(jù)定義語言(DDL):用于改變庫結(jié)構(gòu),創(chuàng)建,更改,刪除操作表結(jié)構(gòu)的數(shù)據(jù)定義語言有:createtable 新建表alerttable 修改表droptable 刪除表結(jié)構(gòu)truncatetable 刪除表內(nèi)容,不可回滾deletefrom,truncatetable,droptable三者的區(qū)別:deletefrom刪除表內(nèi)容,可以回滾truncatetable快速刪除,刪除表全部內(nèi)容,并且不可回滾droptable刪除表結(jié)構(gòu),不可回滾查看表結(jié)構(gòu):descdescemp;利用現(xiàn)有表創(chuàng)建新表:createtablenew2_empasselect*fromempwhererownum<11 將查詢結(jié)果插入另一張表:insertintonew2_empselect*fromempwhererownum<6;Oracle提供一張?zhí)摂M表:dual,可用于函數(shù)計算結(jié)果的顯示,如:selectto_date('2008-10-01','yyyy-MM-dd')astodayfromdual;事務(wù)控制語言(TCL):事務(wù)是最小的工作單元,作為整體進行工作保證事務(wù)的整體成功或失敗,稱事務(wù)控制。事務(wù)控制語言有:commit:提交并結(jié)束事務(wù)處理rollback:撤銷事務(wù)已完成的全部工作savepoint:標記事務(wù)中可以回滾的點,用于回滾,但這破壞了事件的原子性。注意:回滾只能對DML語句的執(zhí)行進行回滾,如:插入,更新,刪除 不能對DDL等語句的執(zhí)行結(jié)果回滾,如:建表,修改表結(jié)構(gòu),刪除表。 數(shù)據(jù)控制語言(DCL):grant,revoke分配權(quán)限:grantdbatowyqwithadminoption;withadminoption;表示wyq擁有權(quán)限可以再受權(quán),即再次次此權(quán)限受給其它用戶grantselect,update(job,sal)onemptowyq;可以對表的權(quán)限進行細粒度分配,如:update(job,sal)Oracle數(shù)據(jù)類型SQL數(shù)據(jù)類型分兩大類:數(shù)據(jù)庫類型,用在列上PL/SQL類型,用在變量上以下詳解數(shù)據(jù)庫類型:字符數(shù)據(jù)類型:char,varchar2,long當需要固定長度的字符串時,使用char,長度為1-2000個字節(jié) varchar2存儲可變大小的字符串,大小為1-4000個字節(jié) long存儲可變長度數(shù)據(jù),長度2GBRAW:存儲二進制數(shù)據(jù),最多存儲2000字節(jié)LONGRAW:可變長度的二進制數(shù)據(jù)類型,最長存儲2GB數(shù)值數(shù)據(jù)類型:number 可存儲整數(shù),浮點數(shù),實數(shù),最高精度38位 聲明:number[p[,s]],P為精度,為小數(shù)點前后位數(shù)相加,S為小數(shù)精度,日期時間數(shù)據(jù)類型:Date:存儲日期和時間,精確到秒Timestamp:時間戳,存儲日期,時間,時區(qū)信息,秒值精確到小數(shù)點后6位(微秒)LOB(largeobjectB):大對象類型,存儲最大4GB的非結(jié)構(gòu)信息,如音頻,視頻等。 CLOB:characterLOB,字符LOB,用于存儲大量字符。 BLOB:BinaryLOB,二進制LOB,存儲較大二進制對象,如:圖像,聲音,視頻。 BFILE:BinaryFile,二進制文件,用于將二進制文件存儲在數(shù)據(jù)庫外部的操作系統(tǒng)文件中。存儲一個指針,指示到實際存儲的位置。偽列:Oracle中的偽列就像一個表的列,但它并沒有存儲在表中,偽列可以從表中查詢,但不能插入,更新,刪除它們的值,Oracle自動維護其值。常用偽列有:rowid,rownumrowid:表示行在表中的唯一標識。rownum:是查詢返回的結(jié)果集中的行的序號,可以使用它來限制查詢返回的行數(shù),即結(jié)果集中的行的序號。只能用“<”,“<=”不能用“>”,“=”。如:select*fromempwhererownum<6;只返回結(jié)果集中的前5條記錄SQL語句使用用戶&權(quán)限類創(chuàng)建用戶:SQL>createuserchopidentifiedbychop;分配角色:SQL>grantdbatochop;將某表權(quán)限賦給某用戶:SQL>grantall[select|update|delete|insert]ontoytochop02;從某用戶收回某表權(quán)限:SQL>revokeallontoyfromchop02;解鎖用戶:SQL>alteruserscottaccountunlock;表操作類:創(chuàng)建表:SQL>createtabletoy(toy_idintprimarykey,toy_namevarchar2(20));修改表(增加列):SQL>altertabletoyaddtoy_pricenumber;刪除表:SQL>droptablenew_toy;查看當前用戶擁有的表:SQL>select*fromtab;查看表結(jié)構(gòu):SQL>desctoy;查看表:SQL>select*fromtoy;復制表(包括表內(nèi)容和表結(jié)構(gòu)):SQL>createtablenew_toyasselect*fromtoy;復制表(復制其他用戶的表):SQL>createtableempasselect*fromscott.emp;增刪改查類:插入數(shù)據(jù):SQL>insertintotoy(toy_id,toy_name)values(001,'toy001');修改數(shù)據(jù):SQL>updatetoysettoy_price=100wheretoy_id=001;刪除數(shù)據(jù):SQL>deletetoywheretoy_id=3;單表查詢:SQL>select*fromtoy;多表查詢:SQL>SELECTe.*,d.* FROMempe,deptdWHEREe.deptno=d.deptno表達式:
SQL函數(shù)SQL函數(shù)帶有一個或多個參數(shù)并返回一個值SQL函數(shù)分類:單行函數(shù)分組函數(shù)分析函數(shù)Oracle中函數(shù)較多,不可能全部講解和記牢,在須要使用時,可以查看文檔,如:Ora9iSQLRef.chm單行函數(shù):單行函數(shù)對于從表中查詢的每一行只返回一個值,可以出現(xiàn)在SELECT子句中和WHERE子句中單行函數(shù)可以大致劃分為:日期函數(shù),數(shù)字函數(shù),字符函數(shù),轉(zhuǎn)換函數(shù),其他函數(shù)日期函數(shù)add_months(sysdate,1):在當前月份上加1sysdate獲取系統(tǒng)時間months_between:返回兩個時間相差月份,前邊的減去后邊的months_between(add_months(sysdate,1),sysdate),結(jié)果為1last_day(sysdate):返回日期所在月份的最后一天。round(sysdate):將當前日期四舍五入next_day(sysdate,'星期一'):返回距第一個參數(shù)的下一個星期一。注意:在中文系統(tǒng)中,第二個參數(shù)為中文,英文系統(tǒng)中使用英語(Monday)trunc(sysdate,'yy'):截取日期中指定部分的第一天,如:2009-1-1如果取的是“day”,剛返回的是所在星期的第一天(星期日)sysdate=2009-5-7,trunc(sysdate,'year'):2009-1-1trunc(sysdate,'mm'):2009-5-1trunc(sysdate,'dd'):2009-5-7trunc(sysdate,'day'):2009-5-3trunc(sysdate,'hh'):2009-5-717:00:00trunc(sysdate,'mi'):2009-5-717:43:00extract:取出日期或時間戳中的指定部分。sysdate=2009-5-7,extract(yearfromsysdate):2009extract(monthfromsysdate):5extract(dayfromsysdate):7extract(yearfromdate'2009-10-15'):2009extract(hourfromtimestamp'2009-5-719:02:34'):19extract(minutefromtimestamp'2009-5-719:02:34'):2extract(secondfromtimestamp'2009-5-719:02:34'):34注意:取日期使用date類型,timestamp可以取日期和時間。字符函數(shù):Initcap(char):將一個或一系列單詞的首字母轉(zhuǎn)換為大寫initcap(‘hello’):HelloLower(char):將字符串全部字母轉(zhuǎn)換成小寫lower(‘FUN’):funUpper(char):將字符串全部字母轉(zhuǎn)換成大寫upper(‘sun’):SUNLtrim(char,set):將字符串char左側(cè)中set指定的字符集全部字符刪除。如果無set,默認空格。ltrim(‘xyzadams’,’xyz’):adamsRtrim(char,set):將字符串char中右側(cè)set指定的字符集全部字符刪除。如果無set,默認空格。rtrim(‘xyzadams’,’ams’):xyzadtrim(setfromchar):將字符串char兩側(cè)set指定的字符全部字符刪除。如果無set,默認空格。注意,set只能包含一個字符。trim(0from0009872348900):98723489Translate(char,from,to):將char中的from用to代替。translate(‘jack’,’j’,’b’):backReplace(char,searchstring,[repstring]):將字符串char中的searchstring用repstring替換,如果未指定repstring,則刪除searchshtringreplace(‘jackandjue’,’j’,’bl’):blackandblueInstr(char,m,n):查找一個字符在某字符串中的位置,沒有則返回0。n表示開始查找的位置,沒有則從第一個開始查找。instr(‘worldwide’,’d’):5Substr(char,m,n) :從字符串中截取一個子串substr(‘a(chǎn)bcdefg’,3,2):cdConcat(expr1,expr2):連接兩個字符串。相當于“||”concat(‘Hello’,’world’):HelloworldCHR(number):返回number的ASCII對應(yīng)的字符。ASCII(chat):返回char的ASCII值。LPAD(str1,length,str2):用str1的左側(cè),用str2填充為指定長度。lpad('smith',10,'x'):xxxxxsmithRPAD(str1,length,str2):用str1的右側(cè),用str2填充為指定長度。rpad('smith',10,'x'):smithxxxxxLENGTH:返回字符串長度。轉(zhuǎn)換函數(shù):TO_CHAR:將日期轉(zhuǎn)換為指定的字符格式。TO_CHAR(sysdate,'YYYY"年"fmMM"月"fmDD"日"HH24:MI:SS')TO_DATE:將字符格式轉(zhuǎn)換為日期格式。TO_DATE(‘2005-12-06’,‘yyyy-mm-dd’)TO_NUMBER:將數(shù)字字符轉(zhuǎn)換成數(shù)值。TO_NUMBER('100')其他函數(shù):NVL(列名,代替值):將空值用指定的值代替。 selectename,nvl(comm,0)fromemp;NVL2(列名,代替值1,代替值2):當列不為空是,用第二個參數(shù)代替,當列為空是,用第三個參數(shù)代替。 selectename,comm,nvl2(comm,comm,'0')fromemp;NULLIF(exp1,exp2):當exp1與exp2不相等時,使用exp2代替。DECODE()將特定的數(shù)據(jù)轉(zhuǎn)換為另一種表示。如:員工表中,將部門號顯示出部門名稱,不需要聯(lián)表查詢,性能提高很多。
Oracle數(shù)據(jù)庫對象directory目錄:directory讓我們可以在Oracle數(shù)據(jù)庫中靈活的對文件進行讀寫操作,極大的提高了Oracle的易用性和可擴展性創(chuàng)建目錄:CREATE[ORREPLACE]DIRECTORYdirectoryAS'pathname';SQL>createorreplacedirectorytest_diras'd:/test';目錄授權(quán)GRANTREAD[,WRITE]ONDIRECTORYdirectoryTOusername;SQL>grantread,writeondirectorytest_dirtochop;外部表:把外部文件的數(shù)據(jù)導入數(shù)據(jù)庫內(nèi)部,一般外部文件都是txt文件。外部表是表結(jié)構(gòu)被存儲在數(shù)據(jù)字典中,而表數(shù)據(jù)被存放在OS文件中的表。創(chuàng)建外部表:test目錄下有個a.txt文件:1|1|2|1createtableusers(idnumber(10),usernamevarchar2(20),passwordvarchar2(20),agenumber(10))organizationexternal(typeoracle_loader–固定語句defaultdirectorytest_dir–-目錄(上面創(chuàng)建時,創(chuàng)建的目錄)accessparameters(recordsdelimitedbynewlinebadfiletest_dir:'a.bad'logfiletest_dir:'a.log'fieldsterminatedby'|'--字段按照”|”符號分隔)location(test_dir:'a.txt')–-txt文件位置)rejectlimitunlimited--指定對在查詢外部數(shù)據(jù)時可能產(chǎn)生的錯誤的數(shù)量沒有限制的創(chuàng)建后:Select*fromusers;修改外部表:下面的語句修改外部表EXT_EMP的默認DIRECTORY對象為EXT_NEW:SQL>altertableusersdefaultdirectoryext_new;臨時表:Oracle創(chuàng)建臨時表來保存會話私有數(shù)據(jù),這些數(shù)據(jù)只在事務(wù)或會話期間保存。臨時表分類:事務(wù)型臨時表:
數(shù)據(jù)在事務(wù)持續(xù)期內(nèi)數(shù)據(jù)存在會話型臨時表
會話持續(xù)期間數(shù)據(jù)存在創(chuàng)建臨時表:CREATEGLOBALTEMPORARYTABLETABLE_NAME
(COUMNS…)
ASSELECT…FROMTABLE…
ONCOMMITDELETEROWS|ONCOMMITPRESERVEROWS;
ONCOMMITDELETEROWS定義了建立事務(wù)級臨時表的方法
ONCOMMITPRESERVEROWS定義了創(chuàng)建會話級臨時表的方法創(chuàng)建事務(wù)型臨時表:SQL>createglobaltemporarytabletable_tmp(idnumber)oncommitdeleterows;插入數(shù)據(jù)測試:(commit后數(shù)據(jù)將會被刪除)創(chuàng)建會話型臨時表:(當注銷用戶或者退出用戶后,數(shù)據(jù)會被刪除)SQL>createglobaltemporarytabletable2_tmp(idnumber)oncommitpreserverows;序列:序列是用于生成唯一、連續(xù)序號的對象,即實現(xiàn)列id的自增長。序列可以是升序的,也可以是降序的。創(chuàng)建序列CREATESEQUENCEemp_seq [STARTWITH10] 起始值,默認1 [INCREMENTBY10] 增長間隔,默認1 [MAXVALUE2000] 最大值,默認無限 [MINVALUE10] 最小值,默認1 [NOCYCLE] 是否循環(huán),默認不循環(huán) [CACHE10]; 在緩存中預生成的個數(shù),默認20創(chuàng)建成功后,可在數(shù)據(jù)字典(user_sequences)中查看: select*fromuser_sequences; STARTWITH和MINVALUE最好相同MAXVALUE和STARTWITH之間的差,最好大于CACHE,因為CACHE是預先生成在內(nèi)存的,如果生成的個數(shù)多于最多的個數(shù),則可能會出錯,這里試驗的環(huán)境不會出錯。 序列創(chuàng)建后,通過偽列來訪問: NEXTVAL返回序列的下一個值CURRVAL返回序列的當前值 創(chuàng)建完成后,currval是沒有值的,訪問出錯,只有執(zhí)行nextval后,currval才有值。 SQL>selecttoys_seq.nextvalfromdual;SQL>selecttoys_seq.currvalfromdual;SQL>insertintodeptvalues(seq.nextval,1,1);--插入主鍵修改序列: ALTERSEQUENCEemp_seqMAXVALUE5000CYCLE; 不能更改序列的STARTWITH參數(shù) 刪除序列: DROPSEQUENCEemp_seq; 在insert語句中使用序列: insertintoemp(empno,ename)values(emp_seq.nextval,'wyq'); 序列生成的數(shù)值,不能和表中已有數(shù)據(jù)沖突,否則可能會違反約束。 建議如果使用序列,則整個表都使用序列生成id,而不使用應(yīng)編碼。 例子: 創(chuàng)建一個序列emp_seq,只指定名字,其余使用默認值: createsequenceemp_seq; 創(chuàng)建成功提示:Sequencecreated 使用數(shù)據(jù)字典(user_sequences)查看序列 select*fromuser_sequences; 可以看到一條記錄,sequence_name為emp_seq 使用偽列currval查看序列中當前值: selectemp_seq.currvalfromdual; 錯誤提示:ORA-08002:序列EMP_SEQ.CURRVAL尚未在此進程中定義 因為序列還沒有使用,所以當前值未定義。 使用偽列nextval查看序列中下一個值: selectemp_seq.nextvalfromdual; 得到下一個值是1: 再次查看當前值: selectemp_seq.currvalfromdual; 得到當前值為1: 在insert中使用序列: insertintoemp(empno,ename)values(emp_seq.nextval,'wyq'); 使用emp_seq.nextval生成下empno 查詢emp表: select*fromemp; 可以看到剛插入的數(shù)據(jù): 在emp表中插入一條數(shù)據(jù):insertintoemp(empno,ename)values(3,'3333'); 再次使用emp_seq自動生成empno:insertintoemp(empno,ename)values(emp_seq.nextval,'wyq'); 錯誤提示:ORA-00001:違反唯一約束條件(SCOTT.PK_EMP) 因為emp_seq.nextval的下個id號是3,和剛插入的數(shù)據(jù)沖突重復 刪除序列: dropsequenceemp_seq; 刪除成功提示:Sequencedropped 重新創(chuàng)建序列emp_seq: createsequenceemp_seqstartwith1000INCREMENTBY10MAXVALUE1200MINVALUE10NOCYCLECACHE10 查看下一個值: selectemp_seq.nextvalfromdual; 得到startwith指定的值1000: 多運行幾次上一條語句,當值超過1200后,提示錯誤: ORA-08004:序列EMP_SEQ.NEXTVALexceedsMAXVALUE無法例程化 刪除序列,重新創(chuàng)建,將NOCYCLE改為CYCLE,使用循環(huán),再重復上述操作:可以看到,當?shù)玫降闹党^1200后,重新開始循環(huán),得到MINVALUE指定的值10,所以startwith和MINVALUE最好相同。視圖:視圖以經(jīng)過定制的方式顯示來自一個或多個表的數(shù)據(jù)視圖可以視為“虛擬表”或“存儲的查詢”創(chuàng)建視圖所依據(jù)的表稱為“基表”視圖的優(yōu)點有:提供了另外一種級別的表安全性隱藏的數(shù)據(jù)的復雜性簡化的用戶的SQL命令隔離基表結(jié)構(gòu)的改變通過重命名列,從另一個角度提供數(shù)據(jù)創(chuàng)建視圖: CREATE[ORREPLACE][FORCE]VIEWview_nameASselect_statement[WITHCHECKOPTION][WITHREADONLY]; ORREPLACE:如果存在剛替換。 FORCE:強制創(chuàng)建,通常在還沒有基本先創(chuàng)建視圖是使用。WITHCHECKOPTION:檢查約束,限制update,要求update后的數(shù)據(jù)必須符合創(chuàng)建視圖時查詢語句中的where條件,即修改后的數(shù)據(jù),必須還能顯示在視圖。 WITHREADONLY:設(shè)定視圖是只讀的。刪除視圖: DROPVIEWtoys_view;在視圖中的DML語句: 在視圖上也可以使用修改數(shù)據(jù)的DML語句,如INSERT、UPDATE和DELETE視圖上的DML語句有如下限制:只能修改一個底層的基表如果修改違反了基表的約束條件,則無法更新視圖如果視圖包含連接操作符、DISTINCT關(guān)鍵字、集合操作符、聚合函數(shù)或GROUPBY子句,則將無法更新視圖如果視圖包含偽列或表達式,則將無法更新視圖 鍵保留表 在基表中的主鍵同樣用于標識視圖中記錄的列,所在的表,稱鍵保留表,即聯(lián)接結(jié)果中的主鍵。 視圖中可以使用單行函數(shù)、分組函數(shù)和表達式試驗:為emp表創(chuàng)建視:createviewemp_viewasselectempno,ename,salfromemp;創(chuàng)建成功提示:Viewcreated在數(shù)據(jù)字典(user_views)中查看: select*fromuser_views; 結(jié)果可以看到有一條剛創(chuàng)建的視圖的記錄查詢視圖:select*fromemp_view;為一個不存在的基本xxx創(chuàng)建視圖:createviewxxx_viewasselect*fromxxx;錯誤提示:ORA-00942:表或視圖不存在指定force關(guān)鍵字強制創(chuàng)建:createforceviewxxx_viewasselect*fromxxx; 警告提示:Warning:Viewcreatedwithcompilationerrors查詢視圖: select*fromemp_view; 錯誤提示:view"SCOTT.XXX_VIEW"有錯誤 因為基本不存在,在創(chuàng)建時提示的警告 創(chuàng)建表xxx,并插入三條數(shù)據(jù): createtablexxx(idnumber);insertintoxxxvalues(1);insertintoxxxvalues(2);insertintoxxxvalues(3); 查詢視圖: select*fromemp_view; 可以正常得到結(jié)果 使用WITHCHECKOPTION創(chuàng)建視圖xxx_view2: createviewxxx_view2asselect*fromxxxwhereid>2WITHCHECKOPTION 查詢視圖: select*fromxxx_view2; 可以看到只有一條記錄:3 修改記錄3到1,使他不符合whereid>2: updatexxx_view2setid=1whereid=3 錯誤提示:ORA-01402:視圖WITHCHECKOPTIDN違反where子句因為使用了WITHCHECKOPTION 使用WITHCHECKOPTION創(chuàng)建視圖xxx_view3: createviewxxx_view3asselect*fromxxxWITHreadonly 修改視圖中的記錄: updatexxx_view3setid=1whereid=3; 錯誤提示:ORA-01733:此處不允許虛擬列 刪除視圖xxx_view3: dropviewxxx_view3; 刪除成功:Viewdropped同義詞:同義詞是現(xiàn)有對象的一個別名。使用同義詞有如下好處:簡化SQL語句隱藏對象的名稱和所有者提供對對象的公共訪問同義詞共有兩種類型:私有同義詞:只能在其模式內(nèi)訪問,且不能與當前模式的對象同名。公有同義詞:可被所有的數(shù)據(jù)庫用戶訪問同義詞的創(chuàng)建:create[orreplace][public]synonymwyqforscott.emp;創(chuàng)建表scott.emp的同義詞為wyqorreplace:可選,如果同義詞存在,則替換。public:創(chuàng)建公有同義詞。不加創(chuàng)建私有同義詞。私有同義詞在權(quán)限更高的用戶中可以通過scott.wyq來訪問。 刪除同義詞 drop[public]synonymwyq;試驗:創(chuàng)建emp的私有同義詞wyq: createpublicsynonymwyqforemp; 創(chuàng)建成功提示:Synonymcreated 創(chuàng)建完成后,可以在數(shù)據(jù)字典(user_synonyms)中查看: select*fromuser_synonyms; 結(jié)果顯示一條記錄,synonym_name為wyq 使用wyq訪問emp表 select*fromwyq; 使用sys用戶登錄,再執(zhí)行上句: 錯誤提示:ORA-00942:表或視圖不存在 sys用戶具備所有權(quán)限,有權(quán)訪問,應(yīng)該使用用戶名.同義詞的形式: select*fromscott.wyq;為scott用戶分配創(chuàng)建公有同義詞的權(quán)限:grantdbatoscott;重新用scott用戶連接,創(chuàng)建公有同義詞: createpublicsynonymwyq2toemp;重新用用sys連接:使用wyq2查詢: select*fromwyq2; 查詢成功,可見公有同義詞前不需要加用戶名scott在sys用戶連接中執(zhí)行: createpublicsynonymwyq2foremp; 提示:ORA-00955:名稱已由現(xiàn)有對象使用 使用orreplace替換: createorreplacepublicsynonymwyq2foremp; 創(chuàng)建成功, 刪除同義詞: dropsynonymwyq; 刪除成功提示:Synonymdropped索引: 索引(Index)是為了加快數(shù)據(jù)的查找而創(chuàng)建的數(shù)據(jù)庫對象。 索引是由Oracle自動使用和維護。索引是獨立于表的數(shù)據(jù)庫結(jié)構(gòu),即表和索引是分開存放的,當刪除索引時,對擁有索引的表的數(shù)據(jù)沒有影響。用于提高SQL語句的性能。列或數(shù)據(jù)較少的表中,不適合創(chuàng)建索引在導入大量數(shù)據(jù)時,最好是將觸發(fā)器屏蔽,刪除所有索引,當數(shù)據(jù)導入完畢后,再開啟觸發(fā)器和重建索引,這樣性能會提高很多。索引優(yōu)點: 提高查詢性能索引缺點: 降低增刪改的性能 增加磁盤空間的開銷創(chuàng)建索引的條件:建在上面。經(jīng)常使用where/groupby/orderby的列。頻繁執(zhí)行的SQL如:select*fromAwhereA=1;。數(shù)據(jù)量較多?;鶖?shù)高的列(數(shù)據(jù)中的重復值),基數(shù)越高,重復值越少,反之。頻繁增刪改的表,經(jīng)測試選定。在主鍵上建立的唯一索引。關(guān)系表上主鍵組合索引。使用函數(shù)索引的列。索引分類(即B樹索引,默認索引,最常用索引): 唯一索引,位圖索引,組合索引,基于函數(shù)的索引,反向鍵索引索引創(chuàng)建(默認索引):CREATEINDEXitem_indexONitemfile(itemcode)TABLESPACEindex_tbs;item_index:索引名字,通常以_idx結(jié)尾 itemfile:表名 itemcode:字段列表SQL>createindextoys_idxontoys(toy_id); 索引重建:ALTERINDEXitem_indexREBUILD;REBUILD:重新創(chuàng)建索引,一個索引使用時間后,可以重建索引來提高查詢效率。SQL>alterindextoys_idxrebuild; 刪除索引: DROPINDEXitem_index; SQL>dropindextoys_idx; 唯一索引: CREATEUNIQUEINDEXitem_indexONitemfile(itemcode); 唯一索引確保在定義索引的列中沒有重復值Oracle自動在表的主鍵列上創(chuàng)建唯一索引使用CREATEUNIQUEINDEX語句創(chuàng)建唯一索引 如:SQL>createuniqueindexename_idxonemp(ename);組合索引: CREATEINDEXcomp_indexONitemfile(p_category,itemrate); 組合索引是在表的多個列上創(chuàng)建的索引索引中列的順序是任意的如果SQL語句的WHERE子句中引用了組合索引的所有列或大多數(shù)列,則可以提高檢索速度 如:SQL>createindexempno_ename_idxonemp(empno,ename);反向鍵索引:REVERSE CREATEINDEXrev_indexONitemfile(itemcode)REVERSE; ALTERINDEXrev_indexREBUILDNOREVERSE; 反向鍵索引反轉(zhuǎn)索引列鍵值的每個字節(jié)通常建立在值是連續(xù)增長的列上,使數(shù)據(jù)均勻地分布在整個索引上創(chuàng)建索引時使用REVERSE關(guān)鍵字可以將反向鍵索引轉(zhuǎn)換為普通索引,但此過程不可逆,即只能將反向鍵索引轉(zhuǎn)換為普通索引,而不能將普通索引轉(zhuǎn)換為反向鍵索引。數(shù)據(jù)塊爭用:兩條數(shù)據(jù)的id相鄰時,很可能存放在同一個數(shù)據(jù)塊,如果兩事物同時訪問同一數(shù)據(jù)塊,而數(shù)據(jù)塊只允許一個事物訪問,這里就會引起數(shù)據(jù)塊的爭用。 將id反轉(zhuǎn),就可以將數(shù)據(jù)存放地區(qū)分開,但會影響查詢性能。 示例:兩個相鄰Id“10001”“10002”,反轉(zhuǎn)后為:“10001”“20001”(內(nèi)部實現(xiàn)應(yīng)為字節(jié)反轉(zhuǎn)) 如:SQL>createindexename_idxonemp(ename)reverse; SQL>alterindexename_idxrebuildnoreverse; 位圖索引:BITMAP,常用于數(shù)據(jù)倉庫 CREATEBITMAPINDEXbit_indexONorder_master(orderno); 位圖索引適合創(chuàng)建在低基數(shù)列上位圖索引不直接存儲ROWID,而是存儲字節(jié)位到ROWID的映射減少響應(yīng)時間節(jié)省空間占用基數(shù)=列上不同值的個數(shù)/總行數(shù)低基數(shù):相同值多 如:SQL>createbitmapindexename_idxonemp(ename);索引組織表:聚集索引,常用于數(shù)據(jù)倉庫 只能在創(chuàng)建表時創(chuàng)建索引組織表 CREATETABLEind_org_tab(vencodeNUMBER(4)PRIMARYKEY,vennameVARCHAR2(20))ORGANIZATIONINDEX; 索引組織表的數(shù)據(jù)存儲在與其關(guān)聯(lián)的索引中索引中存儲的是行的實際數(shù)據(jù),而不是ROWID基于主鍵訪問數(shù)據(jù)CREATETABLE命令與ORGANIZATIONINDEX子句一起用于創(chuàng)建索引組織表普通表與索引組織表的比較:普通表索引組織表ROWID唯一地標識行主鍵唯一地標識行隱式的ROWID列沒有隱式的ROWID列基于ROWID的訪問基于主鍵的訪問順序掃描返回所有行完全索引掃描返回所有行,并按主鍵順序排列支持分區(qū)不支持分區(qū)如:createtablexxx(idintprimarykey,namevarchar(20))organizationindex 基于函數(shù)的索引: CREATEINDEXlowercase_idxONtoys(LOWER(toyname)); 基于一個或多個列上的函數(shù)或表達式創(chuàng)建的索引表達式中不能出現(xiàn)聚合函數(shù)不能在LOB類型的列上創(chuàng)建創(chuàng)建時必須具有QUERYREWRITE權(quán)限 注:在10g,11g中不再需要擁有此權(quán)限 如:SQL>createindexename_idxonemp(lower(ename)); 在索引中使用分區(qū): 可以將索引存儲在不同的分區(qū)中與分區(qū)有關(guān)的索引有三種類型:局部分區(qū)索引:在分區(qū)表上創(chuàng)建的索引,在每個表分區(qū)上創(chuàng)建獨立的索引,索引的分區(qū)范圍與表一致全局分區(qū)索引:在分區(qū)表或非分區(qū)表上創(chuàng)建的索引,索引單獨指定分區(qū)的范圍,與表的分區(qū)范圍或是否分區(qū)無關(guān)全局非分區(qū)索引:在分區(qū)表上創(chuàng)建的全局普通索引,索引沒有被分區(qū) 與索引有關(guān)的數(shù)據(jù)字典: USER_INDEXES-用戶創(chuàng)建的索引的信息USER_IND_PARTITIONS-用戶創(chuàng)建的分區(qū)索引的信息USER_IND_COLUMNS-與索引相關(guān)的表列的信息
表分區(qū)ORACLE的分區(qū)是一種處理超大型表、索引等的技術(shù)。表分區(qū)優(yōu)點:增強可用性:如果表的某個分區(qū)出現(xiàn)故障,表在其他分區(qū)的數(shù)據(jù)仍然可用;維護方便:如果表的某個分區(qū)出現(xiàn)故障,需要修復數(shù)據(jù),只修復該分區(qū)即可;均衡I/O:可以把不同的分區(qū)映射到磁盤以平衡I/O,改善整個系統(tǒng)性能;改善查詢性能:對分區(qū)對象的查詢可以僅搜索自己關(guān)心的分區(qū),提高檢索速度。表分區(qū)缺點:分區(qū)表相關(guān):已經(jīng)存在的表沒有方法可以直接轉(zhuǎn)化為分區(qū)表。不過Oracle提供了在線重定義表的功能。該缺點可以忽略,可以先創(chuàng)建有表分區(qū)的表,再將舊表的數(shù)據(jù)導去有表分區(qū)的新表。創(chuàng)建表分區(qū):Oracle允許用戶將一個表分成多個分區(qū)用戶可以執(zhí)行查詢,只訪問表中的特定分區(qū)將不同的分區(qū)存儲在不同的磁盤,提高訪問性能和安全性可以獨立地備份和恢復每個分區(qū)分區(qū)方法:范圍分區(qū)散列分區(qū)列表分區(qū)復合分區(qū)范圍分區(qū) 以表中的一個列或一組列的值的范圍分區(qū),如:日期,價格 語句: PARTITIONBYRANGE(column_name) ( PARTITIONpart1VALUELESSTHAN(range1), PARTITIONpart2VALUELESSTHAN(range2), ... [PARTITIONpartNVALUELESSTHAN(MAXVALUE)] ); column_name:創(chuàng)建分區(qū)依據(jù)列 part:分區(qū)的名字 range:分區(qū)存放的值的范圍(小于range) [PARTITIONpartNVALUELESSTHAN(MAXVALUE)]:可選,格式固定,表示前邊分區(qū)的剩余值。 示例:CREATETABLESales(Product_IDvarchar2(5),Sales_Costnumber(10))PARTITIONBYRANGE(Sales_Cost)(PARTITIONP1VALUESLESSTHAN(1000),PARTITIONP2VALUESLESSTHAN(2000),PARTITIONP3VALUESLESSTHAN(3000),PARTITIONP4VALUESLESSTHAN(MAXVALUE)); 解釋: 使用Sales_Cost字段創(chuàng)建分區(qū) 分區(qū)P1的范圍是Sales_Cost小于1000的記錄(不含1000) 分區(qū)P2的范圍是Sales_Cost在1000到2000的記錄(不含2000) 分區(qū)P3的范圍是Sales_Cost在2000到3000的記錄(不含3000) 分區(qū)P4存放剩余的記錄散列分區(qū) 允許用戶對不具有邏輯范圍的數(shù)據(jù)進行分區(qū) 通過在分區(qū)鍵上執(zhí)行HASH函數(shù)決定存儲的分區(qū),用戶無法決定記錄存放在哪一分區(qū) 將數(shù)據(jù)平均地分布到不同的分區(qū)(大量數(shù)據(jù)時才能體現(xiàn)) 語法: PARTITIONBYHASH(column_name) PARTITIONSnumber_of_partitions; 或 PARTITIONBYHASH(column_name) ( PARTITIONpart1[TABLESPACEtbs1], PARTITIONpart2[TABLESPACEtbs2], ... PARTITIONpartN[TABLESPACEtbsN] ); 第一種:只指定要散列的字段和分區(qū)的數(shù)目,系統(tǒng)自動通過HASH函數(shù)維護所有分區(qū),分區(qū)名字由系統(tǒng)指定。 第二種:由用戶指定每個安區(qū)的名字。 示例:CREATETABLEEmployee(Employee_IDvarchar2(5),Employee_Namevarchar2(20),Departmentvarchar2(10))PARTITIONBYHASH(Department)(PartitionD1,PartitionD2,PartitionD3); 解釋: Department:分區(qū)依據(jù)的字段 分區(qū)的名字由用戶指定:D1,D2,D3列表分區(qū) 允許用戶將不相關(guān)的數(shù)據(jù)組織在一起,如:城市。 語法: PARTITIONBYLIST(column_name) ( PARTITIONpart1VALUES(values_list1), PARTITIONpart2VALUES(values_list2), ... PARTITIONpartNVALUES(DEFAULT) ); column_name:分區(qū)依據(jù)的列 values_list1:指定分區(qū)存放的值列表。 注:分區(qū)后,不允許修改column_name字段的值 示例:CREATETABLEEmployee(Emp_IDnumber(4),Emp_Namevarchar2(14),Emp_Addressvarchar2(15))PARTITIONBYLIST(Emp_Address)(Partitionnorthvalues('北京'),Partitionwestvalues('上海'),Partitionsouthvalues('廣州','深圳'),PARTITIONotherVALUES(DEFAULT)); 解釋: 根據(jù)地址分區(qū),北京存放north區(qū),上海存放west區(qū),廣州和深圳存放south區(qū),其余的存放other區(qū)。復合分區(qū) 范圍分區(qū)與散列分區(qū)或列表分區(qū)的組合 語法: PARTITIONBYRANGE(column_name1) SUBPARTITIONBYHASH(column_name2) SUBPARTITIONSnumber_of_partitions ( PARTITIONpart1VALUELESSTHAN(range1), PARTITIONpart2VALUELESSTHAN(range2), ... PARTITIONpartNVALUELESSTHAN(MAXVALUE) ); 將一個分區(qū)中數(shù)據(jù)再次分區(qū),即分區(qū)的嵌套。 首先按PARTITION指定的方式分區(qū),再為每個分區(qū)按照SUBPARTITION指定的方式劃分子分區(qū)。 注:分區(qū)過多不利維護 示例:CREATETABLESALES(PRODUCT_IDVARCHAR2(5),SALES_DATEDATENOTNULL,SALES_COSTNUMBER(10))PARTITIONBYRANGE(SALES_DATE)SUBPARTITIONBYHASH(PRODUCT_ID)SUBPARTITIONS5(PARTITIONS1VALUESLESSTHAN(TO_DATE(‘01/4月/2001','DD/MON/YYYY')),PARTITIONS2VALUESLESSTHAN(TO_DATE(‘01/7月/2001','DD/MON/YYYY')),PARTITIONS3VALUESLESSTHAN(TO_DATE(‘01/9月/2001','DD/MON/YYYY')),PARTITIONS4VALUESLESSTHAN(MAXVALUE));解釋:首先根據(jù)SALES_DATE字段范圍分區(qū),分4個區(qū)(S1,S2,S3,S4),再將每個分區(qū)根據(jù)PRODUCT_ID散列分區(qū),分5個分區(qū),共20個分區(qū)表分區(qū)內(nèi)數(shù)據(jù)的操作 在已分區(qū)的表中插入數(shù)據(jù)與操作普通表完全相同,Oracle會自動將數(shù)據(jù)保存到對應(yīng)的分區(qū) 如:SQL>INSERTINTOSALESVALUES(‘P002’,’10-5月-2001',2508); 查詢、修改和刪除分區(qū)表時可以顯式指定要操作的分區(qū) 如: 查詢指定分區(qū)的數(shù)據(jù):SQL>SELECT*FROMSALES3PARTITION(P3); 刪除指定分區(qū)的數(shù)據(jù):SQL>DELETEFROMSALES3PARTITION(P2);
并發(fā)與鎖事務(wù)概念:從業(yè)務(wù)角度來看,有多個操作同生共死的工作單元,要么同時成功,要么同時失敗。事務(wù)ACID:原子性:事務(wù)的操作不可分割,要么同時成功,要么同時失敗。一致性:數(shù)據(jù)正確性。隔離性:多事務(wù)之間的交叉,當前的事務(wù)與其他未完成的事務(wù)是隔離的。持久性:事務(wù)完成后,必須保證數(shù)據(jù)持久化到數(shù)據(jù)庫中。事務(wù)隔離性級別:Readuncommitted(臟讀):讀未提交的數(shù)據(jù)(Oracle中沒有該級別)。Readcommitted:讀提交后的數(shù)據(jù),不會出現(xiàn)臟讀,會不可重復讀(Oracle默認級別)。Readrepeatable:可重復讀,不會發(fā)生不可重復的問題(Oracle中沒有該級別)。Serializable:序列化,事務(wù)排隊一個個執(zhí)行,相當會不會并發(fā)。Oracle中有兩種事務(wù)提交:隱式事務(wù)(DDL語句自動提交)和顯示事務(wù)(DML語句,需要commit才會提交)。鎖一般數(shù)據(jù)庫都有并發(fā)機制,不過帶來的問題就是數(shù)據(jù)訪問的沖突。為了解決這個問題,大多數(shù)數(shù)據(jù)庫用的方法就是數(shù)據(jù)的鎖定。鎖:數(shù)據(jù)庫用來控制共享資源并發(fā)訪問的機制,用于保護正在被修改的數(shù)據(jù)。 關(guān)鍵字:共享資源,并發(fā)訪問,數(shù)據(jù)可能被修改。并發(fā)與共享的區(qū)別:并發(fā)指同時訪問,而共享不一定同時訪問。使用鎖的優(yōu)點: 一致性:一次只允許一個用戶修改數(shù)據(jù)完整性:為所有用戶提供正確的數(shù)據(jù)。如果一個用戶進行了修改并保存,所做的修改將反映給所有用戶并行性:-允許多個用戶訪問同一數(shù)據(jù)加鎖和釋放鎖的時機:(見下圖) 加鎖時機: 悲觀鎖:一旦使用數(shù)據(jù)(事務(wù)開始)時就加鎖,提交或回滾后才釋放。 樂觀鎖:事務(wù)提交前不加鎖,當事務(wù)提交(修改數(shù)據(jù)庫)時加鎖,提交后立即釋放。 注:悲觀鎖是針對并發(fā)的可能性比較大時,樂觀鎖可能造成事務(wù)提交失敗,所以在并發(fā)可能性較低時使用,通常使用版號進行控制。 釋放鎖的時機: 事務(wù)提交,回滾,連接超時,故障(使用SMON,PMON釋放)。鎖的類型(級別):數(shù)據(jù)庫級鎖,表空間級鎖,表級鎖,行級鎖。 Oracle默認悲觀行級鎖注:加鎖一般不影響查詢。行級鎖:對正在被修改的行進行鎖定。其他用戶可以訪問除被鎖定的行以外的行,使用行級鎖的性能損失較少。行級鎖是級別最低的鎖,是Oracle默認的鎖,執(zhí)行insert,update,delete,select...forupdate語句時自動加鎖。加悲觀行級鎖 select…forupdate子句允許用戶一次鎖定多條記錄進行操作(更新),如果select語句中沒有where子名,將鎖定整張表,這里鎖自動升級為表級鎖。 自動加鎖后,需要使用commit或rollback釋放鎖。例子:oracle自動加的行級鎖 打開2個PL/SQL模擬2個用戶在上一個事務(wù)中,事務(wù)沒有結(jié)束,此行一直被鎖定.等待上一個事務(wù)結(jié)束在上一個事務(wù)中,事務(wù)沒有結(jié)束,此行一直被鎖定.等待上一個事務(wù)結(jié)束結(jié)束事務(wù):回滾事務(wù),釋放鎖,下面操作就可以執(zhí)行了回滾事務(wù),釋放鎖,下面操作就可以執(zhí)行了例子:手動讓oracle應(yīng)用行級鎖(SELECT…FORUPDATE語句允許用戶一次鎖定多條記錄進行更新)。手動加鎖||查詢就鎖定標示這些數(shù)據(jù)可能要做更改操作。手動加鎖||查詢就鎖定標示這些數(shù)據(jù)可能要做更改操作。提交事務(wù):回滾事務(wù),釋放鎖,下面操作就可以執(zhí)行了?;貪L事務(wù),釋放鎖,下面操作就可以執(zhí)行了。表級鎖:語法: locktabletable_nameinmode_typemode;表級鎖的類型有: 共享,排他,共享排他,行共享,行排他共享鎖(SHARE)鎖定表,僅允許其他用戶查詢表中的行禁止其他用戶插入、更新和刪除行多個用戶可以同時在同一個表上應(yīng)用此鎖排他(EXCLUSIVE):限制最強的表鎖,僅允許其他用戶查詢該表的行。禁止修改和鎖定表行共享(ROWSHARE):禁止排他鎖定表行排他(ROWEXCLUSIVE):禁止使用排他鎖和共享鎖共享行排他(SHAREROWEXCLUSIVE):比共享鎖更多的限制,禁止使用共享鎖及更高的鎖例子:共享鎖:(鎖表,其他用戶無法增刪改,可鎖N個)。第一個用戶開啟了共享鎖,其他用戶無法修改數(shù)據(jù)只能查看只有當?shù)谝粋€用戶結(jié)束了事務(wù)才能操作第一個用戶開啟了共享鎖,其他用戶無法修改數(shù)據(jù)只能查看只有當?shù)谝粋€用戶結(jié)束了事務(wù)才能操作例子:排他鎖[僅僅允許加鎖,不允許DML操作,直到解鎖]不能加鎖[排他,最高級別]不能執(zhí)行更改例子:死鎖:交叉加鎖(導致
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年吉林省白山長白縣聯(lián)考初三年級英語試題周測三含答案
- 江西婺源茶業(yè)職業(yè)學院《幼兒園綜合活動設(shè)計與指導》2023-2024學年第二學期期末試卷
- 2025年湖南長沙市雅禮洋湖實驗中學普通高中初三下學期學業(yè)質(zhì)量監(jiān)測(期末)化學試題含解析
- 擊劍基礎(chǔ)知識
- 幼兒園教案:用電安全
- 國家職業(yè)保育員培訓
- 我的心愿習作課件
- 2025《地籍調(diào)查》不動產(chǎn)登記代理人考前沖刺必會300題-含詳解
- DB-T29-324-2025 天津市軌道交通綜合控制中心系統(tǒng)建設(shè)與接口技術(shù)標準
- 兒童安全乘車知識
- 《微型消防站建設(shè)標準》
- 中國少年先鋒隊入隊申請書 帶拼音
- 環(huán)氧粉末涂料爆炸危險性評估
- 拉斐爾課件完整版
- 機加工日語詞匯
- 化療藥物灌注
- 集群企業(yè)住所托管服務(wù)協(xié)議書
- GB/Z 28828-2012信息安全技術(shù)公共及商用服務(wù)信息系統(tǒng)個人信息保護指南
- 中小企業(yè)智能制造數(shù)字轉(zhuǎn)型
- GB/T 23149-2008洗衣機牽引器技術(shù)要求
- GB/T 12729.1-2008香辛料和調(diào)味品名稱
評論
0/150
提交評論