版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章OracleSQL4.1SQL概述一、SQL的發(fā)展1、發(fā)展歷程1970年E.F.Codd在《CommunicationoftheACM》發(fā)表:“ARelationalModelofDataforLargeSharedDataBanks”(大型共享數(shù)據(jù)庫(kù)的關(guān)系模型),首次提出了關(guān)系數(shù)據(jù)模型。1974年Boycee和Chamberlin提出了SEQUEL(StructuredEnglishQUEryLanguage),首次在IBM公司研制的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)SYSTEMR上實(shí)現(xiàn)。SQL一推出由于它簡(jiǎn)單易學(xué)、功能強(qiáng)大,深受用戶及數(shù)據(jù)庫(kù)廠商的歡迎,逐步被各數(shù)據(jù)庫(kù)廠商采用,并得到了計(jì)算機(jī)工業(yè)界的認(rèn)可。1979年Oracle公司首先提供了商業(yè)版的SQL,后來(lái)IBM也在自己的DB2中實(shí)現(xiàn)了SQL。1986年10月美國(guó)國(guó)家標(biāo)準(zhǔn)局ANSI(AmercianNationalStandardInstitute)把SQL作為關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言的美國(guó)標(biāo)準(zhǔn),同年公布了SQL(SQL-86)標(biāo)準(zhǔn)文本。1987年國(guó)際化標(biāo)準(zhǔn)組織ISO把SQL采納為國(guó)際標(biāo)準(zhǔn)。4.1SQL概述2、SQL標(biāo)準(zhǔn)標(biāo)準(zhǔn)隨著計(jì)算機(jī)技術(shù)的發(fā)展不斷發(fā)展、豐富,下表為SQL標(biāo)準(zhǔn)的發(fā)展過(guò)程。4.1SQL概述二、SQL功能1.數(shù)據(jù)定義功能
SQL的數(shù)據(jù)定義功能通過(guò)數(shù)據(jù)定義語(yǔ)言DDL(DataDefinitionLanguage)實(shí)現(xiàn),用來(lái)定義數(shù)據(jù)庫(kù)的對(duì)象,包括定義表、索引、視圖等。主要有CREATE、DROP和ALTER三個(gè)命令。2.?dāng)?shù)據(jù)操縱功能SQL的數(shù)據(jù)操縱功能通過(guò)數(shù)據(jù)操縱語(yǔ)言DML(DataManipulationLanguage)實(shí)現(xiàn),用來(lái)對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行查詢和更新操作。主要有查詢(SELECT),更新包括插入(INSERT)、修改(UPDATE)和刪除(DELETE)等命令。3.?dāng)?shù)據(jù)控制功能
SQL的數(shù)據(jù)控制功能通過(guò)數(shù)據(jù)查控制語(yǔ)言DCL(DataControlLanguage)實(shí)現(xiàn),用來(lái)實(shí)現(xiàn)相關(guān)數(shù)據(jù)的存取控制,以保證數(shù)據(jù)庫(kù)的安全性。它包括授權(quán)(GRANT)和回收權(quán)限(REVOKE)兩個(gè)命令。4.1SQL概述4.事務(wù)控制功能SQL的事務(wù)控制功能通過(guò)事務(wù)控制語(yǔ)言TCL(TransactionControlLanguage)實(shí)現(xiàn),用來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性和并發(fā)控制。它包括提交(COMMIT)和回滾(ROLLBACK)兩個(gè)命令。三、SQL特點(diǎn)1.綜合統(tǒng)一SQL是集DDL、DML、DCL、TCL于一體的語(yǔ)言,而且SQL風(fēng)格統(tǒng)一,能夠獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部工作,包括定義、刪除和修改關(guān)系模式,定義和刪除視圖,插入、修改和更新數(shù)據(jù),建立數(shù)據(jù)庫(kù),查詢數(shù)據(jù)和修改數(shù)據(jù)以及數(shù)據(jù)庫(kù)的安全控制等一系列操作,為開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)提供了良好的環(huán)境。。而非關(guān)系的語(yǔ)言風(fēng)格不統(tǒng)一。2.高度非過(guò)程化SQL是高度的非過(guò)程化的語(yǔ)言,用戶只需要提出“干什么”,而不需指出“怎么干”,用戶只需要將SQL語(yǔ)句提交給系統(tǒng),由系統(tǒng)自動(dòng)完成需求,SQL的執(zhí)行過(guò)程完全由系統(tǒng)自動(dòng)完成。4.1SQL概述
3.面向集合的操作方式SQL是面向集合操作方式,操作的對(duì)象和結(jié)果都是表中的記錄集合,而且更新操作的對(duì)象也可以是一個(gè)記錄集合。4.使用方式靈活SQL可以支持自含式、嵌入式兩種使用方式。自含式是指SQL能夠直接以聯(lián)機(jī)交互的方式使用;嵌入式是指SQL可以嵌入到高級(jí)程序設(shè)計(jì)語(yǔ)言中,比如C、C++、Java、VisualStudio等。這兩種使用方式語(yǔ)法結(jié)構(gòu)上基本是一致的,使得系統(tǒng)開(kāi)發(fā)更加靈活方便。5.語(yǔ)言簡(jiǎn)潔,易學(xué)易用SQL功能極強(qiáng),語(yǔ)言十分簡(jiǎn)潔,完成核心功能的需要11個(gè)動(dòng)詞,就能實(shí)現(xiàn)數(shù)據(jù)庫(kù)的大部分操作,如下表所示。4.1SQL概述四、
SQL的書寫規(guī)則1.命令動(dòng)詞的書寫Oracle中SQL命令動(dòng)詞是不區(qū)分大小寫的,可以使用大寫字母,也可以使用小寫字母,或者大小寫混用。SQL命令中引用的對(duì)象、字段名、函數(shù)等也不區(qū)分大小寫。2.命令結(jié)束符Oracle中SQL命令可以書寫在一行,也可以分多行書寫,不管哪一種書寫格式在OracleSQL*plus中SQL命令的結(jié)束符為分號(hào)。如果只是單行語(yǔ)句,在SQLDeveloper中就不需要語(yǔ)句結(jié)束符。如果有多行語(yǔ)句,每一行以回車終止,在最后一行用分號(hào)結(jié)束符。4.1SQL概述五、ORCL數(shù)據(jù)庫(kù)本章以O(shè)racleORCL數(shù)據(jù)庫(kù)為例來(lái)講解SQL的數(shù)據(jù)定義、數(shù)據(jù)操縱、數(shù)據(jù)查詢語(yǔ)句。OracleORCL數(shù)據(jù)庫(kù)SCOTT用戶有如下3張表,分別是:DEPT(DEPTNO,DNAME,LOC)EMP(EMPNO,ENAME,JOB,MGR,HIERDATE,SAL,COMM,DEPTNO)SALGRADE(GRADE,LOSAL,HISAL)其數(shù)據(jù)記錄如下三個(gè)表所示:4.1SQL概述4.2表的管理一、表的概念Oracle數(shù)據(jù)庫(kù)中的對(duì)象大約有40多種,常見(jiàn)的對(duì)象主要有五種:表(TABLE)、視圖(VIEW)、索引(INDEX)、序列(SEQUENCE)、同義詞(SYNONYM),其中表是數(shù)據(jù)庫(kù)中最基本和最重要的對(duì)象,是數(shù)據(jù)實(shí)際存放的地方,其它許多數(shù)據(jù)庫(kù)對(duì)象(索引、視圖等)都以表為基礎(chǔ)。對(duì)于關(guān)系數(shù)據(jù)庫(kù)中的表,其存儲(chǔ)數(shù)據(jù)的邏輯結(jié)構(gòu)是一張二維表,由行和列兩部分組成。表中的一行為一個(gè)元組也稱為記錄,描述一個(gè)實(shí)體,表中的一列為關(guān)系的屬性,也稱為字段。每一行的記錄順序按輸入的先后順序存放,字段的順序按照創(chuàng)建表時(shí)定義的先后順序存放。Oracle中表的概念和關(guān)系數(shù)據(jù)模型的對(duì)應(yīng)如下表所示:4.2表的管理二、Oracle數(shù)據(jù)類型Oracle數(shù)據(jù)類型主要有數(shù)值類型、字符類型、日期類型、LOB類型、二進(jìn)制類型和行類型等。1.?dāng)?shù)值類型NUMBER[(P,S)],用于存儲(chǔ)整數(shù)和實(shí)數(shù)。P是精度,表示數(shù)值的總位數(shù),最大38位,S是刻度范圍,可在-84...127間取值。例:NUMBER(5,2)可以用來(lái)存儲(chǔ)表示-999.99...999.99間的數(shù)值。P、S可以在定義時(shí)省略,例如:NUMBER(3)、NUMBER等。2.字符類型(1)CHAR[(n[BYTE|CHAR])],用于存儲(chǔ)定長(zhǎng)的字符串。例:CHAR(n)。n為字符串長(zhǎng)度,最大為2000字節(jié)。4.2表的管理(2)VARCHAR2[(n[BYTE|CHAR])],描述變長(zhǎng)字符串。例:VARCHAR2(n)。n為字符串長(zhǎng)度,最大為4000字節(jié)。當(dāng)字段中保存的字符串長(zhǎng)度小于n時(shí),按實(shí)際長(zhǎng)度分配空間。(3)LONG,用于存儲(chǔ)高達(dá)2GB的的可變字符串。(4)NCHAR、NVARCHAR2,國(guó)家字符集,用來(lái)存儲(chǔ)Unicode類型字符串。3.日期類型(1)DATE:用于存儲(chǔ)固定長(zhǎng)度的日期和時(shí)間數(shù)據(jù)。(2)TIMESTAMP[(n)]:允許存儲(chǔ)小數(shù)形式的秒值。(3)INTERVALYEAR(n)TOMONTH:存儲(chǔ)以年份和月份表示的時(shí)間段。例:INTERVAL‘2-5’YEARTOMONTH表示2年5個(gè)月。4.2表的管理(4)INTERVALDAY(m)TOSECOND(n):存儲(chǔ)以天數(shù)、小時(shí)數(shù)、分鐘數(shù)和秒數(shù)表示的時(shí)間段。例:INTERVAL‘210:30:20’DAYTOSECOND表示2天10小時(shí)30分20秒。4.LOB類型(1)CLOBCLOB的全稱為CharacterLargeObject,即字符大對(duì)象,可以存儲(chǔ)大量字符數(shù)據(jù),最大容量可以達(dá)到4GB,CLOB處理方式和普通的字符不同,需要特殊的處理方式。(2)NCLOBNCLOB是CLOB的擴(kuò)展,用來(lái)存儲(chǔ)可變長(zhǎng)度的Unicode字符數(shù)據(jù)。(3)BLOBBLOB是二進(jìn)制LOB,存儲(chǔ)較大的可變長(zhǎng)度的二進(jìn)制對(duì)象,如圖形、視頻剪輯和聲音文件。4.2表的管理(4)BFILEBFILE是文件性LOB,存儲(chǔ)指向二進(jìn)制格式文件的定位器。5.RAW和LONGRAW類型用來(lái)存儲(chǔ)二進(jìn)制數(shù)據(jù)。(1)RAW類似于CHAR,聲明方式RAW(L),L為長(zhǎng)度,以字節(jié)為單位,作為數(shù)據(jù)庫(kù)字段最大2000,作為變量最大32767字節(jié)。(2)LONGRAW類似于LONG,作為數(shù)據(jù)庫(kù)字段最大存儲(chǔ)2G字節(jié)的數(shù)據(jù),作為變量最大32760字節(jié)。4.2表的管理6.行類型(1)ROWIDROWID數(shù)據(jù)類型被稱為“偽列類型”,用于Oracle內(nèi)部保存表中每條記錄的物理地址。Oracle通過(guò)ROWID可最快地定位某行具體數(shù)據(jù)的位置。在使用ROWID字段時(shí)必須顯式指定名稱。(2)UROWID行標(biāo)識(shí)符,用于表示索引化表中行的邏輯地址。三、表的創(chuàng)建1.創(chuàng)建表的語(yǔ)法格式創(chuàng)建表的命令是CREATETABLE,只有具有CREATETABLE權(quán)限的用戶才能創(chuàng)建表,基本語(yǔ)法格式如下:4.2表的管理CREATETABLE[schema.]table_name(column_namedatatype[DEFAULTexpression][column_constraint],…n)[ASsubquery];各子句的含義如下:table_name:表的名稱。column_name:指定表的一個(gè)列的名字。Datatype:該列的數(shù)據(jù)類型。DEFAULTexpresssion:指定由expresssion表達(dá)式定義的默認(rèn)值。column_constraint:定義一個(gè)完整性約束作為列定義的一部分,格式如下:4.2表的管理CONSTRAINTconstraint_name[NOT]NULL[UNIQUE][PRIMARYKEY][REFERENCES[schema.]table_name(column_name)][CHECK(condition)],其中[NOT]NULL定義該列是否允許為空;UNIQUE定義字段的唯一性;PRIMARYKEY定義字段為主鍵;REFERENCES定義外鍵約束;CHECK(condition)定義該字段數(shù)據(jù)必須符合的條件。ASsubquery:表示將由子查詢返回的行插入到所創(chuàng)建的表中。4.2表的管理例:創(chuàng)建表DEPT2,該表包含字段DEPTNO、DNAME、LOC,具體命令如下:CREATETABLEDEPT2(DEPTNONUMBER(2),DNAMEVARCHAR2(14),LOCVARCHAR2(13));例:創(chuàng)建表DEPT3,該表包含字段DEPTNO、DNAME、LOC,指定LOC的默認(rèn)值為’北京’,具體命令如下:CREATETABLEDEPT2(DEPTNONUMBER(2),DNAMEVARCHAR2(14),LOCVARCHAR2(13)DEFAULT'北京');4.2表的管理2.通過(guò)子查詢創(chuàng)建表CREATETABLE表名(字段名...)ASSQL查詢語(yǔ)句;例:CREATETABLEDEPT_SUBASSELECT*
FROMDEPT
WHEREDEPTNO=30;四、表的操作1.查看表結(jié)構(gòu)其語(yǔ)法格式如下:DESC[RIBE]表名例:顯示DEPT_SUB表的結(jié)構(gòu):DESCDEPT_SUB;4.2表的管理2.表的重命名語(yǔ)法如下:RENAME舊表名TO新表名。例:RENAMEDEPT_SUBTODEPT_TAB;3.添加注釋(1)為表添加注釋語(yǔ)法如下:COMMENTONTABLE表名IS'...';該語(yǔ)法為表添加注釋字符串。如IS后的字符串為空,則清除表注釋。例:COMMENTONTABLEDEPT_TABIS‘部門表’;(2)為列添加注釋可以為字段添加注釋,語(yǔ)法如下:COMMENTONCOLUMN表名.字段名IS'...';該語(yǔ)法為字段添加注釋字符串。如IS后的字符串為空,則清除字段注釋。例:COMMENTONCOLUMNDEPT.DEPTNOIS‘部門編號(hào);’4.2表的管理二、修改表其語(yǔ)法格式如下:ALTERTABLE[schema.]tablename[ADD(columnnamedatatype[DEFAULTexpression][column_constraint],…n)][MODIFY(columnnamedatatype[DEFAULTexpression][column_constraint],…n)][DROP[COLUMN](columnname,……)]修改表結(jié)構(gòu)有以下要求:可以增加字段、修改字段的屬性和刪除字段,可進(jìn)行表參數(shù)的修改以及表的重命名和約束的添加、修改、刪除和禁用等。增加的新字段總是位于表的最后。4.2表的管理假如新字段定義了默認(rèn)值,則新字段的所有行自動(dòng)填充默認(rèn)值。對(duì)于有數(shù)據(jù)的表,新增加字段的值為NULL。所以有數(shù)據(jù)的表,新增加字段不能指定為NOTNULL約束條件1.增加新字段使用ALTERTABLE…ADD語(yǔ)句實(shí)現(xiàn)表中字段的添加。例:為DEPT表增加一字段MAIL(電子郵件)。ALTERTABLEDEPTADDMAILVARCHAR2(20);例:為DEPT表增加兩個(gè)字段PHONE(電話)、MPR(部門負(fù)責(zé)人)。ALTERTABLEDEPTADD(PHONEVARCHAR2(11),MPRVARCHAR2(20));4.2表的管理2.修改字段名使用ALTERTABLE…RENAMECOLUMN語(yǔ)句修改字段的名稱。例:把DEPT表中MAIL改為EMAIL。ALTERTABLEDEPTRENAMECOLUMNMAILTOEMAIL;3.修改字段使用ALTERTABLE…MODIFY語(yǔ)句實(shí)現(xiàn)表中字段的修改。例:把DEPT中PHONE的數(shù)據(jù)類型改為CHAR(11)。ALTERTABLEDEPTMODIFYPHONECHAR(11);4.2表的管理例:把DEPT表中EMAIL和MPR的長(zhǎng)度分別改為40和30。ALTERTABLEDEPTMODIFY(EMAILVARCHAR2(40),MPRVARCHAR(30));修改字段還有如下的要求:字段的寬度可以增加或減小,在表的字段沒(méi)有數(shù)據(jù)或數(shù)據(jù)為NULL時(shí)才能減小寬度。在表的字段沒(méi)有數(shù)據(jù)或數(shù)據(jù)為NULL時(shí)才能改變數(shù)據(jù)類型,CHAR和VARCHAR2之間可以隨意轉(zhuǎn)換。只有當(dāng)字段的值非空時(shí),才能增加約束條件NOTNULL。修改字段的默認(rèn)值,只影響以后插入的數(shù)據(jù)。4.2表的管理4.刪除字段使用ALTERTABLE…DROPCOLUMN語(yǔ)句直接刪除字段。例:刪除DEPT表中的MPR字段。ALTERTABLEDEPTDROPCOLUMNMPR;例:刪除DEPT表中的EMAIL和PHONE。ALTERTABLEDEPTDROPCOLUMN(EMAIL,PHONE);六、刪除表刪除表的語(yǔ)法如下:DROPTABLE表名[CASCADECONSTRAINTS];4.2表的管理例:刪除表DEPT_TAB。DROTTABLEDEPT_TAB;七、數(shù)據(jù)更新數(shù)據(jù)更新操作有三種,分別是:向表中添加添加數(shù)據(jù),修改表中的數(shù)據(jù)和刪除表中的數(shù)據(jù)。在Oracle中對(duì)應(yīng)的命令是:INERT、UPDATE、DELETE。1.插入數(shù)據(jù)INSERT語(yǔ)句用于向指定的表中添加數(shù)據(jù),通常有兩種形式,一種是插入一個(gè)記錄,另一種是插入子查詢的結(jié)果,語(yǔ)法格式如下。INSERTINTOtable_name[column_list]VALUES(values)。4.2表的管理INTO子句:指定要插入數(shù)據(jù)的表名及字段;字段的順序可與表定義中的順序不一致;沒(méi)有指定字段:表示要插入的是一條完整的元組,且字段屬性與表定義中的順序一致;指定部分字段:插入的元組在其余字段上取空值。VALUES子句:提供的值必須與INTO子句匹配包括值的個(gè)數(shù)和值的類型。(1)單行數(shù)據(jù)的插入例:向DEPT表插入全部字段的數(shù)據(jù):INERTINTODEPTVALUES(40,'開(kāi)發(fā)部','北京');例:向EMP表插入部分字段的數(shù)據(jù):INSERTINTOEMP(EMPNO,ENAME,JOB,HIREDATE)VALUES(2022,'馬明','CLERK','10-10月-22');Oracle在EMP新插入的記錄中,其他的字段上自動(dòng)地賦NULL。4.2表的管理(2)多行數(shù)據(jù)的插入語(yǔ)法格式如下:INSERTINTOtable_name[(column1[,column2,…])SubquerySubquery:表示從有一個(gè)子查詢來(lái)向表中插入數(shù)據(jù)。例:創(chuàng)建一個(gè)新表CLERK,將EMP表中職位為CLERK的員工復(fù)制到CLERK表中。首先,創(chuàng)建空表CLERK:CREATETABLECLERKASSELECTEMPNO,ENAME,SALFROMEMPWHERE1=0;然后向CLERK插入子查詢的結(jié)果:INSERTINTOCELRKSELECTEMPNO,ENAME,SALFROMEMPWHEREJOB='CLERK';4.2表的管理2.修改數(shù)據(jù)(1)修改數(shù)據(jù)的語(yǔ)句UPDATE的基本語(yǔ)法如下:UPDATEtable_nameSETcolumn_name=value[WHEREcondition];Table_name:要更新數(shù)據(jù)的表名稱。Column_name:要更新數(shù)據(jù)的表中的字段名。Value:表示將要更新字段的更改值。WHERE:指定哪些記錄需要更新值。若沒(méi)有此項(xiàng),則將更新所有記錄的指定字段的值。例:修改(編號(hào)為7369)的工資為3000。UPDATE EMPSETSAL=3000WHERE EMPNO=7369;4.2表的管理例:將(編號(hào)為7369的雇傭日期改成當(dāng)前系統(tǒng)日期,部門編號(hào)改為10。UPDATEEMPSET
HIREDATE=SYSDATE,DEPTNO=10WHEREEMPNO=7369;如果修改的值沒(méi)有賦值或定義,將把原來(lái)字段的內(nèi)容清為NULL。若修改值的長(zhǎng)度超過(guò)定義的長(zhǎng)度,則會(huì)出錯(cuò)。(2)帶有子查詢的修改格式其語(yǔ)法格式如下:UPDATEtablename1SET(column_name1,column_name2,…)=(SELECTcolumn_name1,column_name2,…FROMtablename2[WHEREcondition]);例:將CLERK表中編號(hào)為7369的記錄的雇員名字和工資修改成為EMP表編號(hào)為7788的雇員的名字和工資。UPDATECLERKSET(ENAME,SAL)=(SELECTENAME,SALFROMEMPWHEREEMPNO=7788)WHEREEMPNO=7369;4.2表的管理3.刪除數(shù)據(jù)(1)DELETE語(yǔ)句刪除數(shù)據(jù)的語(yǔ)句為DELETE,可以刪除表中的一條或多條記錄。其語(yǔ)法格式如下。DELETEFROMtable_nameWHEREcondition例:將編號(hào)為‘2022’的員工信息刪除DELETEFROMEMPWHEREEMPNO=2022;例:刪除CLERK表中的全部記錄DELETEFROMCLERK(2)TRUNCATE命令如果確實(shí)要?jiǎng)h除一個(gè)大表里的全部記錄,可以用TRUNCATE命令,其語(yǔ)法格式如下:TRUNCATETABLE表名;4.2表的管理例:TRUNCATETABLECLERK;此命令和不帶WHERE條件的DELETE語(yǔ)句功能類似,不同的是,DELETE命令進(jìn)行的刪除可以回滾,但此命令進(jìn)行的刪除不可回滾。八、序列1.序列的概念序列(SEQUENCE)是序列號(hào)生成器,可以為表中的行自動(dòng)生成序列號(hào),產(chǎn)生一組等間隔的數(shù)值(類型為數(shù)字)。其主要的用途是生成表的主鍵值,可以在插入語(yǔ)句中引用,也可以通過(guò)查詢檢查當(dāng)前值,或使序列增至下一個(gè)值。例如:1、2、3、4……;-3,-1、2、4……;10、20、30……,這些都是序列。4.2表的管理2.序列的的創(chuàng)建創(chuàng)建序列的命令是CREATESEQUENCE。序列的創(chuàng)建語(yǔ)法如下:CREATESEQUENCE序列名[INCREMENTBYn][STARTWITHn][{MAXVALUEn|NOMAXVALUE}][{MINVALUEn|NOMINVALUE}][{CYCLE|NOCYCLE}][{CACHEn|NOCACHE}];各子句含義如下:4.2表的管理INCREMENTBY用于定義序列的步長(zhǎng),如果省略,則默認(rèn)為1,如果出現(xiàn)負(fù)值,則代表序列的值是按照此步長(zhǎng)遞減的。STRATWITH定義序列的初始值(即產(chǎn)生的第一個(gè)值),默認(rèn)為1。MAXVALUE定義序列生成器能產(chǎn)生的最大值。選項(xiàng)NOMAXVALUE是默認(rèn)選項(xiàng),代表沒(méi)有最大值定義,這時(shí)對(duì)于遞增序列,系統(tǒng)能夠產(chǎn)生的最大值是10的27次方;對(duì)于遞減序列,最大值是-1。MINVALUE定義序列生成器能產(chǎn)生的最小值。選項(xiàng)NOMAXVALUE是默認(rèn)選項(xiàng),代表沒(méi)有最小值定義,這時(shí)對(duì)于遞減序列,系統(tǒng)能夠產(chǎn)生的最小值是-10的26次方;對(duì)于遞增序列,最小值是1。CYCLE和NOCYCLE表示當(dāng)序列生成器的值達(dá)到限制值后是否循環(huán)。CYCLE代表循環(huán),NOCYCLE代表不循環(huán)。如果循環(huán),則當(dāng)遞增序列達(dá)到最大值是時(shí),循環(huán)到最小值;對(duì)于遞減序列達(dá)到最小值時(shí),循環(huán)到最大值。如果不循環(huán),達(dá)到限制值后,繼續(xù)產(chǎn)生新值就會(huì)發(fā)生錯(cuò)誤。CACHE(緩沖)定義存放序列的內(nèi)存塊的大小,默認(rèn)為20.NOCACHE表示不對(duì)序列進(jìn)行內(nèi)存緩沖。對(duì)序列進(jìn)行內(nèi)存緩沖,可以改善序列的性能。4.2表的管理例:創(chuàng)建一個(gè)序列ids,。CREATESEQUENCEidsINCREMENTBY1STARTWITH10MAXVALUE1000NOCYCLENOCACHE;3.序列的引用使用CURRVAL和NEXTVAL來(lái)引用序列的值。調(diào)用NEXTVAL將生成序列中的下一個(gè)序列號(hào),調(diào)用時(shí)要指出序列名,調(diào)用方式:序列名.NEXTVALCURRVAL用于產(chǎn)生序列的當(dāng)前值,無(wú)論調(diào)用多少次都不會(huì)產(chǎn)生序列的下一個(gè)值。如果序列還沒(méi)有通過(guò)調(diào)用NEXTVAL產(chǎn)生過(guò)序列的下一個(gè)值,先引用CURRVAL沒(méi)有意義。調(diào)用方式:序列名.CURRVAL4.2表的管理例:序列ids的引用:SELECTids.NEXTVALFROMDUAL;產(chǎn)生序列的下一個(gè)值:SELECTids.NEXTVALFROMDUAL;產(chǎn)生序列的當(dāng)前值:SELECTids.CURRVALFROMDUAL;4.序列的應(yīng)用序列的用途主要是生成表的主鍵值。例:使用序列自動(dòng)產(chǎn)生ST表的學(xué)號(hào):創(chuàng)建一個(gè)表ST(SNO,SNAME,SAGE,SSEX)4.2表的管理CREATETABLEST(SNOCHAR(12),SNAMECHAR(8),SAGENUMBER(2,0),SSEXCHAR(2));創(chuàng)建一個(gè)序列SN:CREATESEQUENCESNINCREMENTBY1STARTWITH1MAXVALUE1000NOCYCLENOCACHE;4.2表的管理使用序列自動(dòng)產(chǎn)生學(xué)號(hào):INSERTINTOSTVALUES(‘2022090601’||TO_CHAR(SN.NEXTVAL,’fm00’),’張明’,21,’男’);INSERTINTOSTVALUES(‘2022090601’||to_char(SN.NEXTVAL,’fm00’),’李小萌’,20,’女’);其中函數(shù)TO_CHAR將序列數(shù)字轉(zhuǎn)換為字符。格式字符串“fm00”表示轉(zhuǎn)換為2位的字符串,空位用0填充。fm表示去掉轉(zhuǎn)換結(jié)果的空格查看序列是否起作用,學(xué)號(hào)是否自動(dòng)生成:SELECT*FROMST;可以看到學(xué)號(hào)自動(dòng)從01,02依次生成。4.2表的管理注意,當(dāng)我們使用序列作為插入數(shù)據(jù)時(shí),如果使用了“延遲段”技術(shù),則跳過(guò)序列的第一個(gè)值。Oracle從11.2.0.1版本開(kāi)始,提供了一個(gè)“延遲段創(chuàng)建”特性:即當(dāng)我們創(chuàng)建了新的表(table)和序列(sequence),在插入(insert)語(yǔ)句時(shí),序列會(huì)跳過(guò)第一個(gè)值(1)。所以結(jié)果是插入的序列值從2(序列的第二個(gè)值)開(kāi)始,而不是1開(kāi)始。解決的方法是:把數(shù)據(jù)庫(kù)的“延遲段創(chuàng)建”特性改為FALSE(需要有相應(yīng)的權(quán)限),SQL語(yǔ)句如下:
ALTERSYSTEMSETdeferred_segment_creation=FALSE;在創(chuàng)建表時(shí)讓SEGMENT立即執(zhí)行,SQL語(yǔ)句如下:CREATETABLEtbl_test(test_idNUMBERPRIMARYKEY,test_nameVARCHAR2(20))SEGMENTCREATIONIMMEDIATE;4.2表的管理5.序列的查看查看用戶擁有的序列可以查看DBA_SEQUENCES,查看當(dāng)前用戶的序列可以查看USER_SEQUENCES。(1)查看當(dāng)前用戶的所有序列SELECTSEQUENCE_OWNER,SEQUENCE_NAMEFROMDBA_SEQUENCESWHERESEQUENCE_OWNER='用戶名';(2)查看當(dāng)前用戶所有的序列SELECT*FROMUSER_SEQUENCES;6.序列的刪除刪除序列使用DROPSEQUENCEsequence_name;例:刪除序列ids:DROPSEQUENCE;4.3數(shù)據(jù)查詢數(shù)據(jù)查詢是從數(shù)據(jù)庫(kù)中檢索出符合條件的數(shù)據(jù)記錄,是數(shù)據(jù)庫(kù)應(yīng)用中最常用的操作,是數(shù)據(jù)庫(kù)的核心操作。其一般格式為:SELECT[ALL|DISTINCT]select_listFROM[schema.]table_name|[schema.]view_name[,[schema.]table_name|[schema.]view_name]……[WHEREsearch_condition][GROUPBYgroup_by_expression[HAVINGsearch_condition]][ORDERBYorder_expression[ASC|DESC]]各子句含義如下:ALL|DISTINCT:ALL表示篩選出表中滿足條件的所有記錄,一般情況下可省略;DISTINCT表示從查詢結(jié)果集中去掉重復(fù)的行。4.3數(shù)據(jù)查詢select_list:指定查詢的字段,如果要查詢的所有字段可以使用星號(hào)(*)代替。[schema.]table_name:指定要查詢的數(shù)據(jù)源的表名稱和它的方案名,如果表是當(dāng)前數(shù)據(jù)庫(kù)連接用戶方案下的表,則方案名可以省略。[schema.]view_name:指定查詢的數(shù)據(jù)源的視圖名稱和它的方案名,方案名也可以省略。一、單表查詢單表查詢是指僅僅涉及一個(gè)表的查詢,是從一個(gè)表選出某些行列值,或從一個(gè)表中得到一些特定的數(shù)據(jù)。1.選擇表中的若干字段選擇表中全部的字段或部分字段也就是關(guān)系的投影運(yùn)算。(1)選擇指定的字段當(dāng)用戶只關(guān)心表中一部分字段的時(shí)候,這時(shí)可以在SELECT后select_list中指定要查詢的字段。4.3數(shù)據(jù)查詢例:查詢所有雇員的雇員編號(hào)與雇員姓名。SELECTEMPNO,ENAMEFROMEMP;例:查詢每個(gè)雇員的雇員姓名、雇員編號(hào)與雇員職務(wù)。SELECTENAME,EMPNO,JOBFROMEMP;(2)選擇所有字段SELECT子句中可以把所有字段名列出,或使用星號(hào)(*)顯示表中所有的字段例:查詢emp表中的所有字段。SELECT*FROMEMP;或SELECTEMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNOFROMEMP;4.3數(shù)據(jù)查詢(3)使用計(jì)算字段SELECT后除了可以使用目標(biāo)字段之外,還可以使用算術(shù)表達(dá)式進(jìn)行計(jì)算、常量和函數(shù),可以使用算術(shù)運(yùn)算符和字符串運(yùn)算符(||)進(jìn)行計(jì)算,算術(shù)運(yùn)算符包括加(+)、減(-)、乘(*)、除(/)和取模(%)運(yùn)算。函數(shù)包括普通函數(shù)和集函數(shù)。例:查詢每個(gè)雇員的編號(hào)、雇員姓名和雇傭年限。SELECTEMPNO,ENAME,2023-TO_CHAR(HIREDATE,'YYYY’)FROMEMP;例:查詢每個(gè)雇員的編號(hào)、雇員姓名和雇傭年限。SELECTEMPNO,ENAME,'雇傭年限是'2023-TO_CHAR(HIREDATE,'YYYY’),'年'FROMEMP;(4)使用字段別名用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的字段標(biāo)題,用戶可以根據(jù)要求在SELECT語(yǔ)句中改變字段標(biāo)題,語(yǔ)法格式如下:SELECTcolumn_name1[AS]alias,column_name2[AS]alias,········FROM[schema.]table_name|[schema.]view_name其中,column_name是要查詢的字段名;AS是為字段起別名的關(guān)鍵字,可以用空格替代;alias是為字段起的別名。例:查詢每個(gè)雇員的編號(hào)、雇員姓名和雇傭年限。SELECTEMPNO雇員編號(hào),ENAME雇員姓名,2023-TO_CHAR(HIREDATE,'YYYY’)雇傭年限FROMEMP;4.3數(shù)據(jù)查詢(5)字符連接運(yùn)算在Oracle中對(duì)字符串進(jìn)行連接運(yùn)算使用“||”,方法是在查詢中使用連接運(yùn)算。通過(guò)連接運(yùn)算可以將兩個(gè)字符串連接在一起。例:查詢每個(gè)雇員的編號(hào)、雇員姓名和雇傭年份。SELECTEMPNO雇員編號(hào),ENAME雇員姓名,TO_CHAR(HIREDATE,’YYYY’)||‘年’雇傭年份
FROMEMP;2.DISTINCT關(guān)鍵字使用DISTINCT關(guān)鍵字可以從結(jié)果集中消除重復(fù)的行例:查詢所有雇員的職務(wù),要求取消重復(fù)的行。SELECTDISTINCTJOBFROMEMP;3.選擇表中的行從表中篩選出滿足指定條件的行,可以在SELECT語(yǔ)句中使用WHERE子句。字符串和日期必須用單引號(hào)括起來(lái)。字符串?dāng)?shù)據(jù)區(qū)分大小寫。日期數(shù)據(jù)的格式是敏感的,默認(rèn)的日期格式是DD-MON月-YY。(1)比較運(yùn)算符WHERE子句允許使用的運(yùn)算符包括以下幾種:=(等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、<>或!=(不等于)、!>(不大于)、!<(不小于)。例:查詢部門20的雇員編號(hào)與雇員姓名。SELECTEMPNO,ENAMEFROMEMPWHEREDEPTNO=20;4.3數(shù)據(jù)查詢例:查詢工資大于3000的雇員。SELECT*FROMEMPWHERESAL>3000;(2)BETWEENAND根據(jù)一個(gè)屬性值范圍的查詢可以用BETWEENAND謂詞例:查詢工資在3000-5000的雇員,包含3000和5000兩個(gè)邊界值。SELECT*FROMEMPWHERESALBETWEEN3000AND5000;例:查詢工資不在3000-5000這個(gè)范圍的雇員。SELECT*FROMEMPWHERESALNOTBETWEEN3000AND5000;(3)使用查詢列表如果要查詢的字段的取值范圍不是一個(gè)連續(xù)的區(qū)間,而是一些離散的值,使用關(guān)鍵字IN進(jìn)行查詢4.3數(shù)據(jù)查詢例:雇員職務(wù)分別為CLERK、ANALYST、MANAGER的雇員信息。SELECT*FROMEMPWHEREJOBIN('CLERK','ANALYST','MANAGER');例:雇員職務(wù)不是CLERK、ANALYST、MANAGER的雇員信息。SELECT*FROMEMPWHEREJOBNOTIN('CLERK','ANALYST','MANAGER');(4)字符串模式匹配其語(yǔ)句法為:[NOT]LIKE'string'[ESCAPE'<換碼字符>']其中string是匹配字符串,匹配字符串可以是一個(gè)完整的字符串,也可以使用%和_兩種匹配符。%代表字符串中包含零個(gè)或多個(gè)任意字符,例如:a%b表示以a開(kāi)頭,以b結(jié)尾的任意長(zhǎng)度的字符串,如adb,affgjb,ab等都滿足該匹配串;_代表字符串中包含一個(gè)任意字符,例如:a_b表示以a開(kāi)頭,以b結(jié)尾的長(zhǎng)度為3的任意字符串,如ahb,atb等都滿足該匹配串。NOT關(guān)鍵字是對(duì)LIKE運(yùn)算符的否定,表示可以查詢那些不匹配的記錄。4.3數(shù)據(jù)查詢①匹配固定值如果匹配串中無(wú)通配符時(shí)LIKE和”=“等價(jià)。例:查詢雇員職務(wù)為‘CLERK’的雇員信息。SELECT*FROMEMPWHEREJOBLIKE'CLERK';等價(jià)于SELECT*FROMEMPWHEREJOB='CLERK';②含有通配符的匹配串如果匹配串中含有通配符時(shí)LIKE和”=“不等價(jià)。例:查詢姓名以M開(kāi)頭的雇員信息。SELECT*FROMEMPWHEREENAMELIKE'M%';例:查詢姓名不以M開(kāi)頭的雇員信息。4.3數(shù)據(jù)查詢SELECT*FROMEMPWHEREENAMENOTLIKE'M%';例:查詢姓名的倒數(shù)第二個(gè)字母是E的雇員信息。SELECT*FROMEMPWHEREENAMELIKE'%E_';③ESCAPE短語(yǔ)用戶要查詢的字符串本身就含有%或_時(shí),就需要使用ESCAPE'<換碼字符>'短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義,就是將通配符轉(zhuǎn)義為普通字符。查詢DEPT表中部門名為SALES_A的部門信息。首先,執(zhí)行:INSERTINTODEPTVALUES(60,'SALES_A','濟(jì)南');INSERTINTODEPTVALUES(70,'SALESCA','青島');無(wú)ESCAPE短語(yǔ),執(zhí)行查詢:SELECT*FROMDEPTWHEREDNAMELIKE'SALES_A';4.3數(shù)據(jù)查詢指定ESCAPE短語(yǔ),執(zhí)行查詢:SELECT*FROMDEPTWHEREDNAMELIKE'SALES\_A'ESCAPE'\';(5)空值的判定空值是不知道或無(wú)意義的值,該運(yùn)算就是:IS[NOT]NULL例:查詢沒(méi)有津貼的雇員信息。SELECT*FROMEMPWHERECOMMISNULL;例:查詢所有有津貼的雇員信息。SELECT*FROMEMPWHERECOMMISNOTNULL;(6)多重條件多重條件可以使用AND和OR進(jìn)行連接多個(gè)條件。AND的優(yōu)先級(jí)高于OR,可以使用圓括號(hào)改變優(yōu)先級(jí)。4.3數(shù)據(jù)查詢例:查詢工資在3000-5000的雇員,包含3000和5000兩個(gè)邊界值。SELECT*FROMEMPWHERESAL>=3000ANDSAL<=5000;等價(jià)于:SELECT*FROMEMPWHERESALBETWEEN3000AND5000;例:查詢雇員職務(wù)分別為CLERK、ANALYST、MANAGER的雇員信息。SELECT*FROMEMPWHEREJOB='CLERK'ORJOB='ANALYST'ORJOB='MANAGER';4.排序如果要把查詢結(jié)果排序顯示,可以使用短語(yǔ)ORDERBY,表示對(duì)查詢結(jié)果按照一個(gè)字段或多個(gè)字段的升序(ASC)或降序(DESC)顯示。如果不指明排序順序,默認(rèn)的排序順序?yàn)樯颉H绻敌?,必須指定DESC關(guān)鍵字。4.3數(shù)據(jù)查詢(1)按單字段排序例:查詢所有的雇員信息,按工資降序排序顯示。SELECT*FROMEMPORDERBYSALDESC;(2)按多字段排序排序是可以按多字段進(jìn)行排序,先按第一個(gè)字段,然后按第二個(gè)字段、第三個(gè)字段.....。例:查詢所有的雇員信息,先按部門編號(hào)升序排序,再按雇員編號(hào)的降序排序。SELECT*FROMEMPORDERBYDEPTNO,EMPNODESC;(3)按字段別名排序例:查詢每個(gè)雇員的編號(hào)、雇員姓名和雇傭年限,按雇傭年限降序排序顯示。SELECTEMPNO雇員編號(hào),ENAME雇員姓名,2023-TO_CHAR(HIREDATE,‘YYYY’)雇傭年限
FROMEMPORDERBY雇傭年限D(zhuǎn)ESC:4.3數(shù)據(jù)查詢(4)按字段編號(hào)排序排序時(shí)可以按照SELECT后的字段列表編號(hào)排序,字段列表編號(hào)從左到右依次編號(hào)1、2、3…。例:查詢每個(gè)雇員的編號(hào)、雇員姓名和雇傭年限,按雇傭年限降序排序顯示。SELECTEMPNO雇員編號(hào),ENAME雇員姓名,2023-TO_CHAR(HIREDATE,'YYYY’)雇傭年限FROMEMPORDERBY3DESC:5.集函數(shù)Oracle中提供了一些統(tǒng)計(jì)計(jì)算的集函數(shù),可以對(duì)表中的數(shù)據(jù)進(jìn)行分類、統(tǒng)計(jì)、匯總等操作,常用的集函數(shù)如下表所示。4.3數(shù)據(jù)查詢例:查詢所有雇員的平均工資。SELECTAVG(SAL)FROMEMP;例:查詢10號(hào)部門雇員的最高工資。SELECTMAX(SAL)FROMEMPWHEREDEPTNO=10;例:求所有雇員的人數(shù)。SELECTCOUNT(*)FROMEMP;6.分組GROUPBY子句。該子句的功能是根據(jù)指定的一個(gè)字段或多個(gè)字段值分組,值相等的為一組,有幾個(gè)不同的值就有幾個(gè)不同的分組。如果分組中的字段是多個(gè),那么先按照第一個(gè)字段值分組,也就是將第一個(gè)分組字段值相同的行為一組,然后在每個(gè)組內(nèi)再按照第二個(gè)字段值進(jìn)行分組,也就是說(shuō)最終是基于這些列的唯一組合進(jìn)行分組的,最后在分好的組中進(jìn)行匯總。4.3數(shù)據(jù)查詢使用GROUPBY子句時(shí),需要注意以下幾個(gè)原則:使用GROUPBY子句時(shí),將分組字段值相同的行做為一組,而且每組只產(chǎn)生一個(gè)匯總結(jié)果,每個(gè)組織返回一行,不返回詳細(xì)信息。在SELECT子句的后面,只能有兩種類型的表達(dá)式,一種是出現(xiàn)在GROUPBY子句后面的字段名或者是它的非集函數(shù)表達(dá)式,另一種是其他非分組字段的集函數(shù)表達(dá)式。如果在該查詢語(yǔ)句中使用了WHERE子句,那么先在表中查詢滿足WHERE條件的記錄,再將這些記錄按照GROUPBY子句分組,也就是說(shuō)WHERE子句先生效。GROUPBY子句后面可以出現(xiàn)多個(gè)分組字段名,它們用逗號(hào)隔開(kāi)。例:查詢每個(gè)部門的部門編號(hào)和平均工資。SELECTDEPTNO,AVG(SAL)FROMEMPGROUPBYDEPTNO;4.3數(shù)據(jù)查詢例:查詢各個(gè)部門中的部門編號(hào)及各種職務(wù)的雇員人數(shù),查詢結(jié)果按部門編號(hào)升序排序。SELECTDEPTNO,JOB,COUNT(*)AS人數(shù)FROMEMPGROUPBYDEPTNO,JOBORDERBYDEPTNO;7.HAVING子句如果對(duì)分組查詢的結(jié)果進(jìn)行篩選,要使用HAVING子句。例:查詢平均工資大于3000的部門編號(hào)和平均工資。SELECTDEPTNO,AVG(SAL)FROMEMPGROUPBYDEPTNOHAVINGAVG(SAL)>3000;例:查詢1982年后參加工作的、雇員人數(shù)超過(guò)了2人的部門編號(hào)和人數(shù)。4.3數(shù)據(jù)查詢SELECTDEPTNO,COUNT(*)AS人數(shù)FROMEMPWHEREHIREDATE>='1-1月-1982'GROUPBYDEPTNOHAVINGCOUNT(*)>=2;8.SQL函數(shù)單行函數(shù):?jiǎn)涡泻瘮?shù)返回表中查詢的每一行的值。常用的單行函數(shù)包括字符函數(shù),數(shù)值函數(shù),日期函數(shù),轉(zhuǎn)換函數(shù)等。(1)DUAL表DUAL是Oracle中的一個(gè)實(shí)際存在的表,任何用戶均可讀取,常用在沒(méi)有目標(biāo)表的SELECT語(yǔ)句塊中。Oracle中的DUAL表是一個(gè)單行單列的表,是Oracle與數(shù)據(jù)字典一起自動(dòng)創(chuàng)建的一個(gè)表。這個(gè)表只有1列:DUMMY,數(shù)據(jù)類型為VARCHAR2(1),只有一個(gè)數(shù)據(jù)'X'。Oracle有內(nèi)部邏輯保證DUAL表中永遠(yuǎn)只有一條數(shù)據(jù)。例:查詢當(dāng)前的系統(tǒng)日期。SELECTSYSDATEFROMDUAL;4.3數(shù)據(jù)查詢(2)數(shù)值函數(shù)數(shù)值函數(shù)對(duì)數(shù)值數(shù)據(jù)進(jìn)行計(jì)算,常用的數(shù)值函數(shù)如表所示:4.3數(shù)據(jù)查詢(3)日期函數(shù)Oracle數(shù)據(jù)庫(kù)中的日期默認(rèn)格式為DD-MON-YY,可通過(guò)參數(shù)NLS_DATE_FORMAT設(shè)置當(dāng)前會(huì)話的日期格式,可以設(shè)置通過(guò)參數(shù)NLS_DATE_LANGUAGE設(shè)置當(dāng)前日期的字符集。例如:設(shè)置日期格式為YYYY-MM-DDALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';例如:設(shè)置當(dāng)前日期為中文字符集。ALTERSESSIONSETNLS_DATE_LANGUAGE='Simplifiedchinese';常用的日期函數(shù)如表所示:4.3數(shù)據(jù)查詢常用的日期轉(zhuǎn)換格式字符,如表所示:4.3數(shù)據(jù)查詢(4)字符函數(shù)字符函數(shù)接受字符輸入,用于對(duì)字符串進(jìn)行處理,并返回字符或數(shù)值。主要的字符函數(shù)如表所示:4.3數(shù)據(jù)查詢(5)轉(zhuǎn)換函數(shù)①自動(dòng)類型轉(zhuǎn)換字符串到數(shù)值,數(shù)值到字符串,字符串到日期,日期到字符串,可以實(shí)現(xiàn)自動(dòng)轉(zhuǎn)換。例:SELECT'33'+15FROMDUAL;
結(jié)果為:48例:SELECT'33'||15FROMDUAL;
結(jié)果為:3315例:SELECT*FROMEMPWHEREHIREDATE>='1-1月-1982';
例:INSERTINTOEMP(EMPNO,ENAME,HIREDATE)VALUES(2023,'黃大鵬','1-1月-2023');4.3數(shù)據(jù)查詢②轉(zhuǎn)換函數(shù)常用的轉(zhuǎn)換函數(shù)如表4-12所示,常用的數(shù)值轉(zhuǎn)換符如表4-13所示。4.3數(shù)據(jù)查詢(6)空值函數(shù)常用的空值函數(shù)如表4-14所示4.3數(shù)據(jù)查詢(7)其他函數(shù)Oracle還有一些函數(shù),如DECODE,這些函數(shù)也很有用,如表4-15所示。二、連接查詢從兩個(gè)或多個(gè)表中獲取數(shù)據(jù),這種查詢稱為連接查詢。1.交叉連接查詢交叉連接是不帶連接條件的連接,是兩個(gè)表所有的連接可能,也就是兩個(gè)表的笛卡爾積的結(jié)果。交叉連接的連接謂詞為CROSSJOIN。4.3數(shù)據(jù)查詢例:SELECT*FROMEMPCROSSJOINDEPT;
或:SELECT*FROMEMP,DEPT;2.內(nèi)連接只連接兩表中字段值滿足連接條件的記錄,只有滿足連接條件的數(shù)據(jù)才會(huì)出現(xiàn)在結(jié)果集中。(1)相等內(nèi)連接使用等號(hào)(=)指定連接條件的連接查詢,相等內(nèi)連接的連接短語(yǔ)為[INNER]JOIN。例:查詢所有雇員的姓名、所在的部門的編號(hào)和名稱。SELECTENAME,EMP.DEPTNO,DNAMEFROMEMPINNERJOINDEPTONEMP.DEPTNO=DEPT.DEPTNO;或:SELECTENAME,EMP.DEPTNO,DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNO;4.3數(shù)據(jù)查詢例:查詢工資大于4000的雇員姓名、所在的部門的編號(hào)和名稱。SELECTENAME,EMP.DEPTNO,DNAMEFROMEMPINNERJOINDEPTONEMP.DEPTNO=DEPT.DEPTNOANDSAL>4000;或:SELECTENAME,EMP.DEPTNO,DNAMEFROMEMPINNERJOINDEPTONEMP.DEPTNO=DEPT.DEPTNOWHERESAL>4000;或:SELECTENAME,EMP.DEPTNO,DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNOANDSAL>4000;(2)非等內(nèi)連接非等內(nèi)連接是在連接條件中使用除“=”運(yùn)算符以外的其它運(yùn)算符。4.3數(shù)據(jù)查詢例:查詢雇員姓名,工資和所屬工資等級(jí)。SELECTENAME,SAL,GRADEFROMEMPINNERJOINSALGRADEONSALBETWEENLOSALANDHISAL;(3)自然連接自然連接是使用等號(hào)(=)指定連接條件的連接查詢,連接時(shí)兩表必須有同名字段,且查詢結(jié)果會(huì)自動(dòng)去掉重復(fù)的字段。連接條件是兩表同名字段的(=)比較,且是隱含的。連接字段引用時(shí)不能加表名,自然連接的連接短語(yǔ)為NATURALJOIN,其一般語(yǔ)法格式如下:SELECTselectlistFROMtable_name1NATURALJOINtable_name24.3數(shù)據(jù)查詢例:查詢工資大于4000的雇員姓名、所在的部門的編號(hào)和名稱。SELECTENAME,DEPTNO,DNAMEFROMEMPNATURALJOINDEPTWHERESAL>4000;DEPTNO字段前不能指定表名。當(dāng)兩個(gè)表有一個(gè)或多個(gè)字段同名時(shí)可以用USING指定需要連接的字段。例:查詢工資大于4000的雇員姓名、所在的部門的編號(hào)和名稱。SELECTENAME,DEPTNO,DNAMEFROMEMPJOINDEPTUSING(DEPTNO)WHERESAL>4000;指定USING(DEPTNO)時(shí),可省略NATURAL。(4)自連接一個(gè)表與其自己進(jìn)行連接,稱為表的自連接。4.3數(shù)據(jù)查詢例:查詢所有雇員編號(hào)、雇員姓名和雇員的經(jīng)理姓名。SELECTA.EMPNO,A.ENAME,B.ENAMEFROMEMPAJOINEMPBONA.MGR=B.EMPNO;3.外連接普通連接操作只輸出滿足連接條件的記錄,把普通連接中舍棄的不滿足連接條件的記錄一并輸出,而在其他字段上填空值(NULL),這就是外連接,外連接的連接短語(yǔ)為OUTERJOIN或(+)。(1)左外連接左外連接是把左表中舍棄的記錄也一并輸出,在其他字段填空值(NULL),左外連接的連接短語(yǔ)為L(zhǎng)EFT[OUTER]JOIN或(+)。例:查詢雇員的姓名、工資和所在的部門名稱及沒(méi)有屬于任何部門的雇員。首先執(zhí)行:INSERTINTOEMP(EMPNO,ENAME,JOB,DEPTNO)VALUES(7345,'李萍',3500,NULL);4.3數(shù)據(jù)查詢?nèi)缓髨?zhí)行:SELECTENAME,SAL,DNAMEFROMEMPLEFTJOINDEPTONEMP.DEPTNO=DEPT.DEPTNO;或SELECTENAME,SAL,DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO=DEPT.DEPTNO(+);(2)右外連接右外連接是把左表中舍棄的記錄也一并輸出,在其他字段填空值(NULL),右外連接的連接短語(yǔ)為RIGHT[OUTER]JOIN或(+)。例:查詢雇員的姓名、工資和所在的部門名稱及沒(méi)有任何雇員的部門。SELECTENAME,SAL,DNAMEFROMEMPRIGHTJOINDEPTONEMP.DEPTNO=DEPT.DEPTNO;或SELECTENAME,SAL,DNAMEFROMEMP,DEPTWHEREEMP.DEPTNO(+)=DEPT.DEPTNO;4.3數(shù)據(jù)查詢(3)完全外連接完全外連接是連接時(shí)把左表和右表中舍棄的記錄也一并輸出,完全外連接的連接短語(yǔ)為FULL[OUTER]JOIN。例:查詢雇員的姓名、工資和所在的部門名稱、沒(méi)有屬于任何部門的雇員及沒(méi)有任何雇員的部門。SELECTENAME,SAL,DNAMEFROMEMPFULLJOINDEPTONEMP.DEPTNO=DEPT.DEPTNO;三、子查詢我們把SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊,如果將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢。4.3數(shù)據(jù)查詢子查詢的一般形式為。SELECTselectlist1FROMtable_name1WHEREexproperator
(SELECTselectlist2FROMtable_name2);1.單行子查詢子查詢結(jié)果返回的是一行的子查詢稱為單行子查詢,可以返回單行單字段,也可以返回單行多字段。如果子查詢返回多字段,則對(duì)應(yīng)的比較條件中也應(yīng)該出現(xiàn)多字段。(1)單行單字段例:查詢與SCOTT在同一個(gè)部門的雇員姓名。SELECTENAMEFROMEMPWHEREDEPTNOIN(SELECTDEPTNOFROMEMPWHEREENAME='SCOTT');4.3數(shù)據(jù)查詢或:SELECTENAMEFROMEMPWHEREDEPTNO=(SELECTDEPTNOFROMEMPWHEREENAME='SCOTT');(2)單行多字段例:查詢與SCOTT在同一個(gè)部門且職務(wù)相同的雇員姓名。SELECTENAMEFROMEMPWHERE(DEPTNO,JOB)IN(SELECTDEPTNO,JOBFROMEMPWHEREENAME='SCOTT');4.3數(shù)據(jù)查詢或:SELECTENAMEFROMEMPWHERE(DEPTNO,JOB)=(SELECTDEPTNO,JOBFROMEMPWHEREENAME='SCOTT');2.多行子查詢子查詢返回多行的查詢稱為多行子查詢。多行子查詢可以返回多行單字段,也可以返回多行多字段,如果子查詢返回多字段,則對(duì)應(yīng)的比較條件中也應(yīng)該出現(xiàn)多字段。多行子查詢可以使用IN、ANY、ALL、EXISTS等謂詞。4.3數(shù)據(jù)查詢(1)IN謂詞IN是用來(lái)檢測(cè)和集合列表里某個(gè)值相同的運(yùn)算。例:查詢工資大于2000雇員的雇員經(jīng)理。SELECTMGRFROMEMPWHEREEMPNOIN(SELECTEMPNOFROMEMPWHERESAL>2000);例:查詢與工資大于1500雇員的雇員職務(wù)、部門相同的雇員姓名。SELECTENAMEFROMEMPWHERE(DEPTNO,JOB)IN(SELECTDEPTNO,JOBFROMEMPWHERESAL>1500)
4.3數(shù)據(jù)查詢(2)ANY、ALL謂詞ANY表示任意一個(gè)值,ALL表示所有值。ALL和ALL必須和比較運(yùn)算符(=,<,>,>=,<=,!=)配合使用。例:查詢比30部門某個(gè)雇員工資高的雇員雇員編號(hào)、雇員姓名和雇員工資。SELECTEMPNO,ENAME,SALFROMEMPWHERESAL>ANY(SELECTSAL
FROMEMP
WHEREDEPTNO=30);例:查詢比30部門所有雇員工資高的雇員雇員編號(hào)、雇員姓名和雇員工資。SELECTEMPNO,ENAME,SALFROMEMPWHERESAL>ALL(SELECTSAL
FROMEMP
WHEREDEPTNO=30);4.3數(shù)據(jù)查詢(3)EXISTS謂詞EXISTS謂詞稱為存在謂詞,用來(lái)檢測(cè)子查詢結(jié)果是否存在某些行,如果子查詢非空(至少有一行),則該謂詞返回邏輯真,否則返回邏輯假。例:查詢?cè)凇甋ALES’部門工作的雇員姓名SELECTEMPNO,ENAMEFROMEMPWHEREEXISTS(SELECT*FROMDEPTWHEREEMP.DEPTNO=DEPT.DEPTNOANDDNAME='SALES');3.替代表達(dá)式的子查詢?nèi)绻硬樵兂霈F(xiàn)在SELECT后的字段列表中稱為替代表達(dá)式的子查詢。4.3數(shù)據(jù)查詢例:查詢?cè)诓块T30工作的雇員編號(hào)、雇員姓名部門30的平均工資。SELECTEMPNO,ENAME,(SELECTAVG(SAL)FROMEMPWHEREDEPTNO=30)部門30的平均工資FROMEMPWHEREDEPTNO=30;4.在FROM子句中使用子查詢?cè)贔ROM子句中也可以使用子查詢,如果子查詢出現(xiàn)在FROM子句中,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年福建省郵政儲(chǔ)匯業(yè)務(wù)員技能鑒定備考試題庫(kù)(含答案)
- 第21課 冷戰(zhàn)后的世界格局(分層作業(yè))(原卷版)
- 2025年中國(guó)炮紙市場(chǎng)全景評(píng)估及投資規(guī)劃建議報(bào)告
- (二模)2025年新疆普通高考適應(yīng)性檢測(cè)分學(xué)科第二次模擬考試 政治試卷(含答案詳解)
- 2024年度四川省公共營(yíng)養(yǎng)師之三級(jí)營(yíng)養(yǎng)師通關(guān)試題庫(kù)(有答案)
- 2024年度四川省公共營(yíng)養(yǎng)師之二級(jí)營(yíng)養(yǎng)師模擬題庫(kù)及答案下載
- 2025年化纖滌綸絲項(xiàng)目可行性研究報(bào)告
- 2024-2030年中國(guó)登山杖行業(yè)市場(chǎng)發(fā)展監(jiān)測(cè)及投資方向研究報(bào)告
- 中國(guó)酪蛋白磷酸鐵肽項(xiàng)目投資可行性研究報(bào)告
- 2025年公路工程建設(shè)單位工作總結(jié)報(bào)告
- 危險(xiǎn)化學(xué)品無(wú)倉(cāng)儲(chǔ)經(jīng)營(yíng)單位生產(chǎn)安全事故應(yīng)急救援預(yù)案(新導(dǎo)則版)
- MOOC 企業(yè)內(nèi)部控制-山西省財(cái)政稅務(wù)??茖W(xué)校 中國(guó)大學(xué)慕課答案
- 質(zhì)量管理體系知識(shí)培訓(xùn)課件
- 人機(jī)交互技術(shù)智慧樹(shù)知到期末考試答案2024年
- GB/T 144-2024原木檢驗(yàn)
- YS-T 650-2020 醫(yī)用氣體和真空用無(wú)縫銅管
- 心靈養(yǎng)生的療愈之道
- 建筑設(shè)計(jì)公司的商業(yè)計(jì)劃書
- 建筑景觀設(shè)計(jì)勞務(wù)合同
- 人教版四年級(jí)數(shù)學(xué)上冊(cè)寒假每日一練
- 主動(dòng)脈夾層介入手術(shù)的護(hù)理
評(píng)論
0/150
提交評(píng)論