版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三單元
Oracle與SQL語(yǔ)言宋佳興計(jì)算機(jī)系網(wǎng)絡(luò)所jxsong@主要內(nèi)容Oracle系統(tǒng)簡(jiǎn)介Oracle系統(tǒng)結(jié)構(gòu)Oracle系統(tǒng)安裝SQL語(yǔ)言概述SQL語(yǔ)言詳解Page2SQL語(yǔ)言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢(xún)單表查詢(xún)連接查詢(xún)嵌套查詢(xún)集合查詢(xún)SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page3SQL數(shù)據(jù)定義如要對(duì)數(shù)據(jù)進(jìn)行查詢(xún)、添加、修改等各項(xiàng)操作,則應(yīng)先運(yùn)用SQL數(shù)據(jù)定義語(yǔ)言定義基本表、索引和視圖。SQL數(shù)據(jù)定義用到的命令主要有三個(gè):CREATE(創(chuàng)建)、DROP(刪除)、ALTER(修改),索引依賴(lài)于基本表,視圖也產(chǎn)生于基本表,因此SQL通常不提供修改索引和視圖的操作,用戶(hù)如果想修改這兩個(gè)部分,只能先刪再建。而對(duì)于存放數(shù)據(jù)對(duì)象的整個(gè)數(shù)據(jù)庫(kù)創(chuàng)建來(lái)說(shuō),使用SQL語(yǔ)句比使用某一數(shù)據(jù)庫(kù)系統(tǒng)的管理器要復(fù)雜,因而一般情況下都使用管理器進(jìn)行創(chuàng)建。有的數(shù)據(jù)庫(kù)系統(tǒng)在安裝時(shí)已經(jīng)創(chuàng)建了一個(gè)缺省的數(shù)據(jù)庫(kù),只需對(duì)其參數(shù)進(jìn)行適當(dāng)調(diào)整即可。Page4SQL數(shù)據(jù)定義Oracle常用數(shù)據(jù)類(lèi)型(詳細(xì)數(shù)據(jù)類(lèi)型見(jiàn)參考資料)Page5類(lèi)型含義CHAR(length)存儲(chǔ)固定長(zhǎng)度的字符串。參數(shù)length指定了長(zhǎng)度,如果存儲(chǔ)的字符串長(zhǎng)度小于length,用空格填充。默認(rèn)長(zhǎng)度是1,最長(zhǎng)不超過(guò)2000字節(jié)。VARCHAR2(length)存儲(chǔ)可變長(zhǎng)度的字符串。length指定了該字符串的最大長(zhǎng)度。默認(rèn)長(zhǎng)度是1,最長(zhǎng)不超過(guò)4000字節(jié)。NUMBER(p,s)既可以存儲(chǔ)浮點(diǎn)數(shù),也可以存儲(chǔ)整數(shù),p表示數(shù)字的最大位數(shù)(如果是小數(shù)包括整數(shù)部分和小數(shù)部分和小數(shù)點(diǎn),p默認(rèn)是38位),s是指小數(shù)位數(shù)。DATE存儲(chǔ)日期和時(shí)間,存儲(chǔ)紀(jì)元、4位年、月、日、時(shí)、分、秒,存儲(chǔ)時(shí)間從公元前4712年1月1日到公元后4712年12月31日。TIMESTAMP不但存儲(chǔ)日期的年月日,時(shí)分秒,以及秒后6位,同時(shí)包含時(shí)區(qū)。CLOB存儲(chǔ)大的文本,比如存儲(chǔ)非結(jié)構(gòu)化的XML文檔等。最大4GBBLOB存儲(chǔ)二進(jìn)制對(duì)象,如圖形、視頻、聲音等。最大4GBSQL數(shù)據(jù)定義(基本表)創(chuàng)建基本表(CreateTable)CREATETABLE<表名>(<列名><數(shù)據(jù)類(lèi)型>[<列級(jí)完整性約束條件>][,<列名><數(shù)據(jù)類(lèi)型>[<列級(jí)完整性約束條件>]]…[,<表級(jí)完整性約束條件>]);<表名>:所要定義的基本表的名字<列名>:組成該表的各個(gè)屬性(列)<列級(jí)完整性約束條件>:涉及相應(yīng)屬性列的完整性約束條件<表級(jí)完整性約束條件>:涉及一個(gè)或多個(gè)屬性列的完整性約束條件Page6SQL數(shù)據(jù)定義(基本表)創(chuàng)建基本表(CreateTable)列級(jí)完整性約束NULL|NOTNULL:允許取空值|不允許取空值。DEFAULT<值>:指定默認(rèn)值。UNIQUE:唯一性約束,取值不能重復(fù)PRIMARYKEY:聲明為主鍵FOREIGNKEY:參照完整性的外鍵約束。CHECK子句:實(shí)現(xiàn)用戶(hù)定義完整性約束。表級(jí)完整性約束UNIQUE:唯一性約束,取值不能重復(fù)PRIMARYKEY:聲明為主鍵。FOREIGNKEY:參照完整性的外鍵約束。CHECK子句:實(shí)現(xiàn)用戶(hù)定義完整性約束。Page7SQL數(shù)據(jù)定義(基本表)建立學(xué)生成績(jī)管理數(shù)據(jù)庫(kù)ScoreDB中的4張表CREATETABLECourse(--定義課程表CoursecourseNochar(3)NOTNULL,--課程號(hào)
courseNamevarchar2(30)NOTNULL,--課程名
creditHournumber(1)default0NOTNULL,--學(xué)分
courseHournumber(3)default0NOTNULL,--課時(shí)數(shù)
priorCoursechar(3)NULL,--先修課程
CONSTRAINTCoursePKPRIMARYKEY(courseNo),CONSTRAINTCourseFKFOREIGNKEY(priorCourse)REFERENCESCourse(courseNo));Page8SQL數(shù)據(jù)定義(基本表)建立學(xué)生成績(jī)管理數(shù)據(jù)庫(kù)ScoreDB中的4張表CREATETABLEClass(--定義班級(jí)表ClassclassNochar(6)
NOTNULL,
--班級(jí)號(hào)
classNamevarchar2(30)
NOTNULL,
--班級(jí)名
institutevarchar2(30)
NOTNULL,
--所屬學(xué)院
gradenumber(4)default0
NOTNULL,--年級(jí)
classNumnumber(3)
NULL,
--班級(jí)人數(shù)
CONSTRAINTClassPKPRIMARYKEY(classNo));Page9SQL數(shù)據(jù)定義(基本表)建立學(xué)生成績(jī)管理數(shù)據(jù)庫(kù)ScoreDB中的4張表CREATETABLEStudent(--定義學(xué)生表Student
studentNochar(7)
NOTNULL,--學(xué)號(hào)
studentNamevarchar2(20)
NOTNULL,--姓名
sexchar(2)
NULL,--性別
birthdaydateNULL,--出生日期
nativevarchar2(20)
NULL,--籍貫
nationvarchar2(30)default'漢族'NULL,
--民族
classNochar(6)
NULL,--所屬班級(jí)
CONSTRAINTStudentPKPRIMARYKEY(studentNo),
CONSTRAINTStudentFKFOREIGNKEY(classNo)REFERENCESClass(classNo));Page10SQL數(shù)據(jù)定義(基本表)建立學(xué)生成績(jī)管理數(shù)據(jù)庫(kù)ScoreDB中的4張表CREATETABLEScore(--定義成績(jī)表ScorestudentNochar(7)
NOTNULL,--學(xué)號(hào)
courseNochar(3)
NOTNULL,--課程號(hào)
scorenumber(5,1)default0
NOTNULL,--成績(jī)
CONSTRAINTScoreCKCHECK(scoreBETWEEN0.0AND100.0),
/*主碼由兩個(gè)屬性構(gòu)成,必須作為表級(jí)完整性約束進(jìn)行定義*/CONSTRAINTScorePKPRIMARYKEY(studentNo,courseNo),
/*表級(jí)完整性約束條件,studentNo是外碼,被參照表是Student*/CONSTRAINTScoreFK1FOREIGNKEY(studentNo)REFERENCESstudent(studentNo),
/*表級(jí)完整性約束條件,courseNo是外碼,被參照表是Course*/CONSTRAINTScoreFK2FOREIGNKEY(courseNo)REFERENCEScourse(courseNo));Page11SQL數(shù)據(jù)定義(基本表)修改基本表(AlterTable)ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類(lèi)型>[完整性約束]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類(lèi)型>];<表名>:要修改的基本表ADD子句:增加新列和新的完整性約束條件DROP子句:刪除指定的完整性約束條件MODIFY子句:用于修改列名和數(shù)據(jù)類(lèi)型Page12SQL數(shù)據(jù)定義(基本表)修改基本表(AlterTable)建立一個(gè)測(cè)試用的臨時(shí)表CREATETABLETempTable(xnochar(3)NOTNULL,xnamevarchar2(2)NOTNULL,CONSTRAINTTempPKPRIMARYKEY(xno));Page13SQL數(shù)據(jù)定義(基本表)修改基本表(AlterTable)【例】為T(mén)empTable表增加一列。ALTERTABLETempTableADDxsexnumber(1)default0;【例】為T(mén)empTable表的xname列修改數(shù)據(jù)類(lèi)型。ALTERTABLETempTableMODIFYxnamevarchar2(10);【例】為T(mén)empTable表的xname列增加唯一約束。ALTERTABLETempTableADDCONSTRAINTUniqueXnameUNIQUE(xname);Page14SQL數(shù)據(jù)定義(基本表)刪除基本表(DropTable)當(dāng)某個(gè)基本表不再需要時(shí),應(yīng)當(dāng)及時(shí)刪除,以節(jié)省空間和減少出錯(cuò)等問(wèn)題。DROPTABLE<表名>基表一旦刪除,表中的數(shù)據(jù)、該表上建立的索引都將自動(dòng)被刪除。另外,有的系統(tǒng)如Oracle,刪除基表后建立在該表上的視圖仍然保留在數(shù)據(jù)字典中,但用戶(hù)引用時(shí)就出錯(cuò),所以還需手動(dòng)刪除相應(yīng)所有視圖?!纠縿h除TempTable表DROPTABLETempTable;Page15SQL數(shù)據(jù)定義(索引)建立索引是加快查詢(xún)速度的有效手段建立索引是一個(gè)數(shù)據(jù)庫(kù)所必須的建立索引DBA或表的屬主(建表人)根據(jù)需要建立有些DBMS自動(dòng)建立以下屬性列上的索引PRIMARYKEYUNIQUE維護(hù)索引
DBMS自動(dòng)完成
使用索引
DBMS自動(dòng)選擇是否使用索引以及使用哪些索引Page16SQL數(shù)據(jù)定義(索引)創(chuàng)建索引(CreateIndex)CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]…);用<表名>指定要建索引的基本表名字索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔用<次序>指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASCUNIQUE表明要建立的索引是唯一索引CLUSTER表示要建立的索引是聚簇索引Page17SQL數(shù)據(jù)定義(索引)創(chuàng)建索引(CreateIndex)UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。CLUSTER表明要建立的索引是聚簇索引。所謂聚簇索引是指索引項(xiàng)的順序與表中記錄的物理順序一致的索引組織。用戶(hù)可以在最常查詢(xún)的字段上建立聚簇索引以提高查詢(xún)效率。顯然在一個(gè)基表上最多只能建立一個(gè)聚簇索引。建立后,更新索引字段數(shù)據(jù)時(shí),往往導(dǎo)致表中記錄的物理順序的變更,代價(jià)較大,因此對(duì)于經(jīng)常更新的不宜建立聚簇索引。Page18SQL數(shù)據(jù)定義(索引)創(chuàng)建索引(CreateIndex)【例】在班級(jí)表中按所屬學(xué)院建立一個(gè)非聚集索引InstituteIdx。CREATEINDEXInstituteIdxONClass(institute);【例】在學(xué)生表中,首先按班級(jí)編號(hào)的升序,然后按出生日期的降序建立一個(gè)非聚集索引ClassBirthIdx。CREATEINDEXClassBirthIdxONStudent(classNo,birthdayDESC);Page19SQL數(shù)據(jù)定義(索引)刪除索引(DropIndex)可刪除那些不經(jīng)常使用的索引刪除索引操作的語(yǔ)法為:DROPINDEX<索引名>
【例】刪除InstituteIdx索引。DROPINDEXInstituteIdx;Page20SQL數(shù)據(jù)定義(視圖)創(chuàng)建視圖(CreateView)刪除視圖(DropView)
創(chuàng)建視圖需要用到SQL數(shù)據(jù)查詢(xún),本部分內(nèi)容放到SQL數(shù)據(jù)查詢(xún)之后在詳細(xì)介紹。Page21SQL語(yǔ)言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢(xún)單表查詢(xún)連接查詢(xún)嵌套查詢(xún)集合查詢(xún)SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page22SQL數(shù)據(jù)查詢(xún)SQL數(shù)據(jù)查詢(xún)(Select)SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]];Page23SQL數(shù)據(jù)查詢(xún)SQL數(shù)據(jù)查詢(xún)(Select)SELECT子句:指定要顯示的屬性列FROM子句:指定查詢(xún)對(duì)象(基本表、視圖或查詢(xún)表)WHERE子句:指定查詢(xún)條件GROUPBY子句:對(duì)查詢(xún)結(jié)果按指定列的值分組,屬性列值相等的元組為一個(gè)組。通常會(huì)在每組中使用集函數(shù)HAVING短語(yǔ):篩選出只有滿(mǎn)足指定條件的組ORDERBY子句:對(duì)查詢(xún)結(jié)果表按指定列值的升序或降序排序Page24SQL數(shù)據(jù)查詢(xún)單表查詢(xún)只涉及一個(gè)基本表或者視圖的查詢(xún)連接查詢(xún)涉及兩個(gè)或者兩個(gè)以上基本表或者視圖的查詢(xún)嵌套查詢(xún)將一個(gè)子查詢(xún)嵌套在另一個(gè)查詢(xún)WHERE子句或HAVING短語(yǔ)條件中的一種查詢(xún)集合查詢(xún)對(duì)多個(gè)查詢(xún)的結(jié)果進(jìn)行集合操作Page25SQL數(shù)據(jù)查詢(xún)(實(shí)例ScoreDB)Page26SQL數(shù)據(jù)查詢(xún)(實(shí)例ScoreDB)Page27SQL數(shù)據(jù)查詢(xún)(實(shí)例ScoreDB)Page28SQL數(shù)據(jù)查詢(xún)(實(shí)例ScoreDB)Page29SQL語(yǔ)言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢(xún)單表查詢(xún)連接查詢(xún)嵌套查詢(xún)集合查詢(xún)SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page30SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))SELECT子句可以實(shí)現(xiàn)關(guān)系代數(shù)中的投影運(yùn)算查詢(xún)指定列選取表中的指定列,通過(guò)SELECT確定要查詢(xún)的屬性【例】查詢(xún)所有班級(jí)的班級(jí)編號(hào)、班級(jí)名稱(chēng)和所屬學(xué)院SELECTclassNo,className,instituteFROMClass;Page31SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))消除重復(fù)元組需要消除重復(fù)元組,使用DISTINCT關(guān)鍵字【例】查詢(xún)所有學(xué)院的名稱(chēng)SELECTinstituteFROMClass;【例】查詢(xún)所有學(xué)院的名稱(chēng)并消除重復(fù)元組SELECTDISTINCTinstituteFROMClass;Page32SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))查詢(xún)所有列可使用兩種方法:將所有的列在SELECT子句中列出(可以改變列的顯示順序);使用*號(hào),*表示所有屬性,按照表定義時(shí)的順序顯示所有屬性?!纠坎樵?xún)所有班級(jí)的全部信息SELECTclassNo,className,classNum,grade,instituteFROMClass;【例】查詢(xún)所有班級(jí)的全部信息SELECT*
FROMClass;Page33SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))給屬性列取別名可為屬性列取一個(gè)便于理解的列名,如用中文來(lái)顯示列名,為屬性列取別名特別適合經(jīng)過(guò)計(jì)算的列?!纠坎樵?xún)所有班級(jí)的所屬學(xué)院、班級(jí)編號(hào)和班級(jí)名稱(chēng),要求用中文顯示列名SELECTinstitute所屬學(xué)院,classNo班級(jí)編號(hào),className班級(jí)名稱(chēng)FROMClass;【例】該查詢(xún)可使用AS關(guān)鍵字取別名SELECTinstituteAS所屬學(xué)院,
classNoAS班級(jí)編號(hào),
classNameAS班級(jí)名稱(chēng)FROMClass;Page34SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))查詢(xún)經(jīng)過(guò)計(jì)算的列可使用屬性、常數(shù)、函數(shù)和表達(dá)式【例】查詢(xún)每個(gè)班級(jí)編號(hào)、班級(jí)名稱(chēng)以及該班級(jí)現(xiàn)在為幾年級(jí),并將班級(jí)編號(hào)中大寫(xiě)字母改為小寫(xiě)字母輸出SELECTlower(classNo)lowerclassNo,className,To_number(To_char(Sysdate,'YYYY'))-gradeclassgradeFROMClass;Oracle內(nèi)置函數(shù)Sysdate返回系統(tǒng)當(dāng)前時(shí)間函數(shù)lower()將大寫(xiě)字母改為小寫(xiě)字母函數(shù)To_char()將日期轉(zhuǎn)換為指定格式的字符串函數(shù)To_number()將字符串轉(zhuǎn)化為數(shù)值Page35SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))WHERE子句可以實(shí)現(xiàn)關(guān)系代數(shù)中的選擇運(yùn)算WHERE常用的查詢(xún)條件有:比較運(yùn)算:>、>=、<、<=、=、<>(或!=)范圍查詢(xún):BETWEEN...AND集合查詢(xún):IN空值查詢(xún):ISnull字符匹配查詢(xún):LIKE邏輯查詢(xún):AND、OR、NOTPage36SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))比較運(yùn)算使用比較運(yùn)算符>、>=、<、<=、=、<>(或!=)
【例】查詢(xún)2007級(jí)的班級(jí)編號(hào)、班級(jí)名稱(chēng)和所屬學(xué)院。SELECTclassNo,className,instituteFROMClassWHEREgrade=2007;【例】在學(xué)生Student表中查詢(xún)年齡大于或等于22歲的同學(xué)學(xué)號(hào)、姓名和出生日期。SELECTstudentNo,studentName,birthdayFROMStudentWHEREmonths_between(sysdate,birthday)/12>=22;Page37SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))范圍查詢(xún)BETWEEN...AND用于查詢(xún)屬性值在某一個(gè)范圍內(nèi)的元組NOT
BETWEEN...AND用于查詢(xún)屬性值不在某一個(gè)范圍內(nèi)的元組BETWEEN后是屬性的下限值,AND后是屬性的上限值【例】在選課Score表中查詢(xún)成績(jī)?cè)?0~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)SELECTstudentNo,courseNo,scoreFROMScoreWHEREscoreBETWEEN80AND90;Page38SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))范圍查詢(xún)BETWEEN...AND用于查詢(xún)屬性值在某一個(gè)范圍內(nèi)的元組NOT
BETWEEN...AND用于查詢(xún)屬性值不在某一個(gè)范圍內(nèi)的元組BETWEEN后是屬性的下限值,AND后是屬性的上限值【例】在選課Score表中查詢(xún)成績(jī)不在80~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscoreNOTBETWEEN80AND90;Page39SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))集合查詢(xún)IN用于查詢(xún)屬性值在某個(gè)集合內(nèi)的元組NOTIN用于查詢(xún)屬性值不在某個(gè)集合內(nèi)的元組
IN后面是集合,可以是具體的集合,也可以是查詢(xún)出來(lái)的元組集合?!纠吭谶x課Score表中查詢(xún)選修了“001”、“005”或“003”課程的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)。SELECTstudentNo,courseNo,scoreFROMScoreWHEREcourseNoIN('001','005','003');Page40SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))集合查詢(xún)IN用于查詢(xún)屬性值在某個(gè)集合內(nèi)的元組NOTIN用于查詢(xún)屬性值不在某個(gè)集合內(nèi)的元組
IN后面是集合,可以是具體的集合,也可以是查詢(xún)出來(lái)的元組集合?!纠吭趯W(xué)生Student表中查詢(xún)籍貫不是“南昌”或“上海”的同學(xué)姓名、籍貫和所屬班級(jí)編號(hào)。SELECTstudentName,native,classNoFROMStudentWHEREnativeNOTIN('南昌','上海');Page41SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))空值查詢(xún)空值表示未知或不確定的值,空值表示為NULLISNULL用于查詢(xún)屬性值為空值,IS不能用“=”替代ISNOTNULL用于查詢(xún)屬性值不為空值【例】在課程表中查詢(xún)先修課程為空值的課程信息。SELECT*FROMCourseWHEREpriorCourseISNULL;【例】在課程表中查詢(xún)有先修課程的課程信息。SELECT*FROMCourseWHEREpriorCourseISNOTNULL;Page42SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))字符匹配查詢(xún)LIKE用于字符匹配查詢(xún),語(yǔ)法格式為:[NOT]LIKE<匹配字符串>[ESCAPE<換碼字符>]查詢(xún)的含義是:如果LIKE前沒(méi)有NOT,則查詢(xún)指定的屬性列值與<匹配字符串>相匹配的元組;如果LIKE前有NOT,則查詢(xún)指定的屬性列值不與<匹配字符串>相匹配的元組。<匹配字符串>可以是一個(gè)具體的字符串,也可以包括通配符,符號(hào)%表示任意長(zhǎng)度的字符串,符號(hào)_(下劃線(xiàn))表示任意一個(gè)字符。Page43SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))字符匹配查詢(xún)LIKE用于字符匹配查詢(xún),語(yǔ)法格式為:[NOT]LIKE<匹配字符串>[ESCAPE<換碼字符>]字符匹配例子ab%,表示所有以ab開(kāi)頭的任意長(zhǎng)度的字符串;zhang%ab,表示以zhang開(kāi)頭,以ab結(jié)束,中間可以是任意個(gè)字符的字符串。ab_,表示所有以ab開(kāi)頭的3個(gè)字符的字符串,其中第3個(gè)字符為任意字符;a__b表示所有以a開(kāi)頭,以b結(jié)束的4個(gè)字符的字符串,且第2、3個(gè)字符為任意字符。Page44SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))字符匹配查詢(xún)【例】在班級(jí)Class表中查詢(xún)班級(jí)名稱(chēng)中含有會(huì)計(jì)的班級(jí)信息。SELECT*FROMClassWHEREclassNameLIKE'%會(huì)計(jì)%';【例】在學(xué)生Student表中查詢(xún)所有姓王且全名為3個(gè)漢字的同學(xué)學(xué)號(hào)和姓名。SELECTstudentNo,studentNameFROMStudentWHEREstudentNameLIKE'王__';【例】在學(xué)生Student表中查詢(xún)名字中不含有“?!钡耐瑢W(xué)學(xué)號(hào)和姓名。SELECTstudentNo,studentNameFROMStudentWHEREstudentNameNOTLIKE'%福%';Page45SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))字符匹配查詢(xún)【例】在學(xué)生Student表中查詢(xún)蒙古族的同學(xué)學(xué)號(hào)和姓名SELECTstudentNo,studentNameFROMStudentWHEREnationLIKE'蒙古族';注意:如果匹配字符串中不含有%和_,則LIKE與比較運(yùn)算符“=”的查詢(xún)結(jié)果一樣,該查詢(xún)等價(jià)于下面查詢(xún):SELECTstudentNo,studentNameFROMStudentWHEREnation='蒙古族';Page46SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))字符匹配查詢(xún)?nèi)绻樵?xún)字串中本身要包含%和_,必須使用“ESCAPE<換碼字符>”短語(yǔ),對(duì)通配符進(jìn)行轉(zhuǎn)義處理?!纠吭诎嗉?jí)Class表中查詢(xún)班級(jí)名稱(chēng)中含有“08_”符號(hào)的班級(jí)名稱(chēng)SELECTclassNameFROMClassWHEREclassNameLIKE'%08\_%'ESCAPE'\';“ESCAPE‘\’”表示\為換碼字符,緊跟在\符號(hào)后的_不是通配符,而是普通的用戶(hù)要查詢(xún)的符號(hào),如果將#字符作為換碼字符,則該查詢(xún)可改寫(xiě)為:SELECTclassNameFROMClassWHEREclassNameLIKE'%08#_%'ESCAPE'#';Page47SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))邏輯查詢(xún)SQL提供AND、OR和NOT邏輯運(yùn)算符分別實(shí)現(xiàn)邏輯與、邏輯或和邏輯非運(yùn)算【例】在選課Score表中查詢(xún)選修了“001”、“005”或“003”課程的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)SELECTstudentNo,courseNo,scoreFROMScoreWHEREcourseNo='001'ORcourseNo='005'ORcourseNo='003';也可采用集合運(yùn)算IN實(shí)現(xiàn),本例中采用邏輯“或”運(yùn)算Page48SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))邏輯查詢(xún)【例】在Student表中查詢(xún)1991年出生且籍貫為“漢族”的同學(xué)學(xué)號(hào)、姓名、出生日期。SELECTstudentNo,studentName,birthdayFROMStudentWHERETo_char(birthday,'YYYY')='1991'ANDnation='漢族';【例】在Student表中查詢(xún)籍貫不是“南昌”或“上?!钡耐瑢W(xué)姓名、籍貫和所屬班級(jí)編號(hào)。SELECTstudentName,native,classNoFROMStudentWHEREnative!='南昌'ANDnative!='上海';Page49SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))邏輯查詢(xún)【例】在選課Score表中查詢(xún)成績(jī)?cè)?0~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore>=80ANDscore<=90;【例】在選課Score表中查詢(xún)成績(jī)不在80~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore<80OR
score>90;Page50SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))排序運(yùn)算使用ORDERBY子句實(shí)現(xiàn)排序運(yùn)算,其語(yǔ)法為:ORDERBY<表達(dá)式1>[ASC|DESC]
[,<表達(dá)式2>[ASC|DESC],...]基本說(shuō)明:<表達(dá)式1>,<表達(dá)式2>,...可以是屬性、函數(shù)或表達(dá)式缺省按升序(ASC)排序,按降序排序,必須指明DESC選項(xiàng)運(yùn)算含義:在查詢(xún)結(jié)果中首先按<表達(dá)式1>的值進(jìn)行排序在<表達(dá)式1>值相等的情況下再按<表達(dá)式2>值排序依此類(lèi)推Page51SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))排序運(yùn)算【例】在學(xué)生Student表中查詢(xún)籍貫不是“南昌”或“上?!钡耐瑢W(xué)姓名、籍貫和所屬班級(jí)編號(hào),并按籍貫的降序排序輸出。SELECTstudentName,native,classNoFROMStudentWHEREnative!='南昌'ANDnative!='上海'ORDERBYnativeDESC;【例】在學(xué)生Student表中查詢(xún)“女”學(xué)生的學(xué)號(hào)、姓名、所屬班級(jí)編號(hào)和出生日期,并按班級(jí)編號(hào)的升序、出生日期的月份降序排序輸出。SELECTstudentNo,studentName,classNo,birthdayFROMStudentWHEREsex='女'ORDERBYclassNo,to_char(birthday,'MM')DESC;Page52SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))查詢(xún)表FROM子句后面可以是基本表、視圖,還可以是查詢(xún)表【例】查詢(xún)1991年出生的“女”同學(xué)基本信息??梢韵葘W(xué)生表中的女生記錄查詢(xún)出來(lái),然后再對(duì)查詢(xún)表進(jìn)行選擇、投影操作。SELECTstudentNo,studentName,birthdayFROM(SELECT*FROMStudentWHEREsex='女')aWHERETo_char(birthday,'YYYY')='1991';在FROM子句后是一個(gè)子查詢(xún),表示對(duì)子查詢(xún)的查詢(xún)結(jié)果(查詢(xún)表)進(jìn)行查詢(xún),必須為查詢(xún)表取一個(gè)名稱(chēng)(稱(chēng)為元組變量),如取名為aPage53SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))聚合查詢(xún)SQL查詢(xún)提供了豐富的數(shù)據(jù)分類(lèi)、統(tǒng)計(jì)功能統(tǒng)計(jì)功能通過(guò)聚合函數(shù)來(lái)實(shí)現(xiàn)分類(lèi)功能通過(guò)分組子句來(lái)實(shí)現(xiàn)統(tǒng)計(jì)和分組結(jié)合在一起實(shí)現(xiàn)豐富的查詢(xún)功能Page54SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))聚合函數(shù)SQL提供的聚合函數(shù)包括:count([DISTINCT|ALL]{*|<列名>}):統(tǒng)計(jì)關(guān)系的元組個(gè)數(shù)或一列中值的個(gè)數(shù);sum([DISTINCT|ALL]<列名>):統(tǒng)計(jì)一列中值的總和;avg([DISTINCT|ALL]<列名>):統(tǒng)計(jì)一列中值的平均值;max([DISTINCT|ALL]<列名>):統(tǒng)計(jì)一列中值的最大值;min([DISTINCT|ALL]<列名>):統(tǒng)計(jì)一列中值的最小值。指定DISTINCT謂詞,表示在計(jì)算時(shí)首先消除<列名>取重復(fù)值的元組,然后再進(jìn)行統(tǒng)計(jì)指定ALL謂詞或沒(méi)有DISTINCT謂詞,表示不消除<列名>取重復(fù)值的元組Page55SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))聚合函數(shù)【例】查詢(xún)學(xué)生總?cè)藬?shù)。SELECTcount(*)學(xué)生人數(shù)FROMStudent;【例】查詢(xún)所有選課學(xué)生的人數(shù)。SELECTcount(studentNo)
學(xué)生人數(shù)FROMScore;查詢(xún)結(jié)果是40,由于一個(gè)學(xué)生可以選修多門(mén)課程,學(xué)號(hào)存在重復(fù),為消除重復(fù)的元組,使用DISTINCT短語(yǔ),將查詢(xún)修改為:SELECTcount(DISTINCTstudentNo)學(xué)生人數(shù)FROMScore;查詢(xún)結(jié)果為10Page56SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))聚合函數(shù)【例】查詢(xún)學(xué)號(hào)為“0800005”同學(xué)所選修課程成績(jī)的最高分SELECTmax(score)最高分FROMScoreWHEREstudentNo=
'0800005';【例】查詢(xún)學(xué)號(hào)為“0800005”同學(xué)所選修課程成績(jī)的平均分SELECTavg(score)平均分FROMScoreWHEREstudentNo='0800005';在聚合函數(shù)遇到空值時(shí),除count(*)外所有的函數(shù)皆跳過(guò)空值,只處理非空值。Page57SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))分組運(yùn)算在SQL查詢(xún)中,往往需要對(duì)數(shù)據(jù)進(jìn)行分組運(yùn)算,分組運(yùn)算的目的是為了細(xì)化聚合函數(shù)的作用對(duì)象。如不對(duì)查詢(xún)結(jié)果分組,則聚合函數(shù)作用于整個(gè)查詢(xún)結(jié)果。如對(duì)查詢(xún)結(jié)果進(jìn)行分組,則聚合函數(shù)分別作用于每個(gè)組,查詢(xún)結(jié)果按組聚合輸出。SQL通過(guò)GROUPBY和HAVING子句實(shí)現(xiàn)分組運(yùn)算GROUPBY:對(duì)查詢(xún)結(jié)果按某一列或某幾列進(jìn)行分組,值相等的分為一組;HAVING:對(duì)分組的結(jié)果進(jìn)行選擇,僅輸出滿(mǎn)足條件的組。該子句必須與GROUPBY子句配合使用。Page58SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))分組運(yùn)算【例】查詢(xún)每個(gè)同學(xué)選課門(mén)數(shù)、平均分和最高分。SELECTstudentNo,
count(*)門(mén)數(shù),
avg(score)平均分,max(score)最高分FROMScoreGROUPBYstudentNo;結(jié)果按學(xué)號(hào)StudentNo分組,將具有相同StudentNo值的元組作為一組,然后對(duì)每組進(jìn)行相應(yīng)的計(jì)數(shù)、求平均值和求最大值Page59SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))分組運(yùn)算【例】查詢(xún)平均分在80分以上的每個(gè)同學(xué)的選課門(mén)數(shù)、平均分和最高分。SELECTStudentNo,count(*)門(mén)數(shù),avg(score)平均分,
max(score)最高分FROMScoreGROUPBYStudentNoHAVINGavg(score)>=80;按學(xué)號(hào)StudentNo分組,將具有相同StudentNo值的元組作為一組,然后對(duì)每組進(jìn)行相應(yīng)的計(jì)數(shù)、求平均值和求最大值,并判斷平均值是否大于等于80,如果是則輸出該組,否則丟棄該組,不作為輸出結(jié)果Page60SQL數(shù)據(jù)查詢(xún)(單表查詢(xún))分組運(yùn)算【例】查詢(xún)成績(jī)表Score中成績(jī)最高分的學(xué)生的學(xué)號(hào)、課程號(hào)和相應(yīng)成績(jī)SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore=(SELECTmax(score)FROMScore);聚合函數(shù)可直接用在HAVING子句中,也可用于子查詢(xún)中,但在WHERE子句中不可以直接使用聚合函數(shù)。如下語(yǔ)句是不正確的:SELECT*FROMScoreWHEREscore=max(score)Page61SQL語(yǔ)言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢(xún)單表查詢(xún)連接查詢(xún)嵌套查詢(xún)集合查詢(xún)SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page62SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)?cè)赪HERE子句中加入連接多個(gè)表的連接條件語(yǔ)句格式如下:WHERE[<表1>.]<列名1><比較運(yùn)算符>[<表2>.]<列名2>[<邏輯運(yùn)算符>
[<表3>.]<列名3><比較運(yùn)算符>[<表4>.]<列名4>...]比較運(yùn)算符包括:>、>=、<、<=、=、<>(或!=)當(dāng)比較運(yùn)算符為=時(shí),表示等值連接,其他運(yùn)算為非等值連接WHERE子句的連接謂詞中的屬性稱(chēng)為連接屬性,連接屬性之間必須具有可比性Page63SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(等值連接)【例】查找會(huì)計(jì)學(xué)院全體同學(xué)的學(xué)號(hào)、姓名、籍貫、班級(jí)編號(hào)和所在班級(jí)名稱(chēng)。SELECTstudentNo,studentName,native,Student.classNo,classNameFROMStudent,ClassWHEREStudent.classNo=Class.classNoANDinstitute='會(huì)計(jì)學(xué)院';在連接操作中,如果涉及到多個(gè)表的相同屬性名,必須在相同的屬性名前加上表名加以區(qū)分Page64SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(等值連接)可為參與連接的表取別名(稱(chēng)為元組變量),在相同的屬性名前加上表的別名。將Student表取別名為a,Class表取別名為b,班級(jí)編號(hào)分別用a.classNo和b.classNo表示。上例可以改寫(xiě)為:SELECTstudentNo,studentName,native,b.classNo,classNameFROMStudenta,ClassbWHEREa.classNo=b.classNoANDinstitute='會(huì)計(jì)學(xué)院';對(duì)于不同屬性名,可以不在屬性名前加上表名或別名。Page65SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(等值連接)【例】查找選修了課程名稱(chēng)為“計(jì)算機(jī)原理”的同學(xué)學(xué)號(hào)、姓名。查詢(xún)語(yǔ)句為:SELECTa.studentNo,studentNameFROMStudenta,Courseb,ScorecWHEREb.courseNo=c.courseNo
AND
c.studentNo=a.studentNoAND
b.courseName='計(jì)算機(jī)原理';本例使用了元組變量,其連接條件為:b.courseNo=c.courseNoANDc.studentNo=a.studentNoPage66SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(等值連接)【例】查找同時(shí)選修了編號(hào)為“001”和“002”課程的同學(xué)學(xué)號(hào)、姓名、課程號(hào)和相應(yīng)成績(jī),并按學(xué)號(hào)排序。SELECTa.studentNo,studentName,
b.courseNo,b.score,c.courseNo,c.scoreFROMStudenta,Scoreb,(SELECT*FROMScoreWHEREcourseNo='002')cWHEREb.courseNo='001'AND
a.studentNo=b.studentNoAND
a.studentNo=c.studentNoORDERBYa.studentNo;Page67SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(等值連接)【例】查找同時(shí)選修了編號(hào)為“001”和“002”課程的同學(xué)學(xué)號(hào)、姓名、課程號(hào)和相應(yīng)成績(jī),并按學(xué)號(hào)排序。該查詢(xún)也可以表示為:SELECTa.studentNo,studentName,
b.courseNo,b.score,c.courseNo,c.scoreFROMStudenta,(SELECT*FROMScoreWHEREcourseNo='001')b,(SELECT*FROMScoreWHEREcourseNo='002')cWHEREa.studentNo=b.studentNoAND
a.studentNo=c.studentNoORDERBYa.studentNo;Page68SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(等值連接)【例】查找同時(shí)選修了編號(hào)為“001”和“002”課程的同學(xué)學(xué)號(hào)、姓名、課程號(hào)和相應(yīng)成績(jī),并按學(xué)號(hào)排序。該查詢(xún)還可以表示為:SELECTa.studentNo,studentName,
b.courseNo,b.score,c.courseNo,c.scoreFROMStudenta,Scoreb,ScorecWHEREa.studentNo=b.studentNoAND
a.studentNo=c.studentNoAND
b.courseNo='001'AND
c.courseNo='002'ORDERBYa.studentNo;Page69SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(自然連接)SQL不直接支持自然連接,完成自然連接的方法是在等值連接的基礎(chǔ)上消除重復(fù)列。【例】實(shí)現(xiàn)成績(jī)表Score和課程表Course的自然連接。SELECTstudentNo,a.courseNo,score,courseName,creditHour,courseHour,priorCourseFROMScorea,CoursebWHEREa.courseNo=b.courseNo;本例課程編號(hào)在兩個(gè)關(guān)系中同時(shí)出現(xiàn),但在SELECT子句中僅需出現(xiàn)1次,因此使用a.courseNo,也可以使用b.courseNo。其他列名是唯一的,不需要加上元組變量Page70SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(自表連接)若某個(gè)表與自己進(jìn)行連接,稱(chēng)為自表連接?!纠吭趯W(xué)生表Student中查找與“李宏冰”同學(xué)在同一個(gè)班的同學(xué)姓名、班級(jí)編號(hào)和出生日期。SELECTa.studentName,
a.classNo,
a.birthdayFROMStudenta,StudentbWHEREb.studentName='李宏冰'AND
a.classNo=b.classNo;Page71SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(外連接)在一般的連接中,只有滿(mǎn)足連接條件的元組才被檢索出來(lái),對(duì)于沒(méi)有滿(mǎn)足連接條件的元組是不作為結(jié)果被檢索出來(lái)的?!纠坎樵?xún)每個(gè)班級(jí)的班級(jí)名稱(chēng)、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱(chēng)排序輸出。SELECTclassName,institute,studentNo,studentNameFROMClassa,StudentbWHEREa.classNo=b.classNoORDERBYclassName;Page72SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(外連接)從查詢(xún)結(jié)果中可以看出:班級(jí)表中的“注冊(cè)會(huì)計(jì)08_01班”、“注冊(cè)會(huì)計(jì)08_03班”以及“金融管理07_01班”3個(gè)班沒(méi)有出現(xiàn)在查詢(xún)結(jié)果中,原因是這3個(gè)班沒(méi)有學(xué)生。在實(shí)際應(yīng)用中,往往需要將不滿(mǎn)足連接條件的元組也檢索出來(lái),只是在相應(yīng)的位置用空值替代,這種查詢(xún)稱(chēng)為外連接查詢(xún)。外連接分為左外連接、右外連接和全外連接。在FROM子句中,寫(xiě)在左邊的表稱(chēng)為左關(guān)系,寫(xiě)在右邊的表稱(chēng)為右關(guān)系。Page73SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(外連接)左外連接連接結(jié)果中包含左關(guān)系中的所有元組,對(duì)于左關(guān)系中沒(méi)有連接上的元組,其右關(guān)系中的相應(yīng)屬性用空值替代。【例】使用左外連接查詢(xún)每個(gè)班級(jí)的班級(jí)名稱(chēng)、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱(chēng)排序輸出。SELECTclassName,institute,studentNo,studentNameFROMClassaLEFTOUTERJOINStudentbONa.classNo=b.classNoORDERBYclassName;Page74SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(外連接)右外連接連接結(jié)果中包含右關(guān)系中的所有元組,對(duì)于右關(guān)系中沒(méi)有連接上的元組,其左關(guān)系中的相應(yīng)屬性用空值替代?!纠渴褂糜彝膺B接查詢(xún)每個(gè)班級(jí)的班級(jí)名稱(chēng)、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱(chēng)排序輸出。SELECTclassName,institute,studentNo,studentNameFROMStudentaRIGHTOUTERJOINClassbONa.classNo=b.classNoORDERBYclassName;Page75SQL數(shù)據(jù)查詢(xún)(連接查詢(xún))連接查詢(xún)(外連接)全外連接連接結(jié)果中包含左、右關(guān)系中的所有元組對(duì)左關(guān)系中沒(méi)有連接上的元組,其右關(guān)系中的相應(yīng)屬性用空值替代對(duì)右關(guān)系中沒(méi)有連接上的元組,其左關(guān)系中的相應(yīng)屬性用空值替代【例】使用全外連接查詢(xún)每個(gè)班級(jí)的班級(jí)名稱(chēng)、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱(chēng)排序輸出。SELECTclassName,institute,studentNo,studentNameFROMClassaFULLOUTERJOINStudentbONa.classNo=b.classNoORDERBYclassName;Page76SQL語(yǔ)言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢(xún)單表查詢(xún)連接查詢(xún)嵌套查詢(xún)集合查詢(xún)SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page77SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))在SQL語(yǔ)言中,可以用多個(gè)簡(jiǎn)單查詢(xún)構(gòu)成復(fù)雜的查詢(xún),從而增強(qiáng)SQL的查詢(xún)能力。一個(gè)SELECT-FROM-WHERE查詢(xún)語(yǔ)句稱(chēng)為一個(gè)查詢(xún)塊,將一個(gè)查詢(xún)塊嵌入到另一個(gè)查詢(xún)塊的WHERE子句或HAVING子句中,稱(chēng)為嵌套查詢(xún)。在一個(gè)嵌套語(yǔ)句中,上層的查詢(xún)塊稱(chēng)為外層查詢(xún)或父查詢(xún),下層的查詢(xún)塊稱(chēng)為內(nèi)層查詢(xún)或子查詢(xún)。SQL語(yǔ)言允許多層嵌套查詢(xún),但在子查詢(xún)中,不允許使用ORDERBY子句,該子句僅用于最后的輸出結(jié)果排序。Page78SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用IN/NOTIN)子查詢(xún)中使用最多的是謂詞IN和NOTIN,含義為當(dāng)查詢(xún)的指定屬性值包含(或不包含)在子查詢(xún)結(jié)果屬性值表中時(shí)條件為真?!纠坎樵?xún)選修過(guò)課程的學(xué)生姓名。本例查詢(xún)的含義是:在學(xué)生表Student中,將學(xué)號(hào)出現(xiàn)在成績(jī)表Score中(表明該學(xué)生選修過(guò)課程)的學(xué)生姓名查詢(xún)出來(lái)。SELECTstudentNameFROMStudentWHEREStudent.studentNo
IN
(SELECTScore.studentNoFROMScore);Page79SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用IN/NOTIN)【例】查詢(xún)沒(méi)有選修過(guò)任何課程的學(xué)生學(xué)號(hào)和姓名。本例查詢(xún)的含義是:在學(xué)生表Student中,將學(xué)號(hào)沒(méi)有出現(xiàn)在成績(jī)表Score中的學(xué)生學(xué)號(hào)和姓名查詢(xún)出來(lái)。SELECTstudentNo,
studentNameFROMStudentWHEREStudent.studentNo
NOTIN
(SELECTScore.studentNo
FROMScore);Page80SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用IN/NOTIN)【例】查找選修過(guò)課程名中包含“系統(tǒng)”的課程的同學(xué)學(xué)號(hào)、姓名和班級(jí)編號(hào)。SELECTstudentNo,studentName,classNoFROMStudentWHEREstudentNo
IN(SELECTstudentNoFROMScoreWHEREcourseNo
IN
(SELECTcourseNoFROMCourseWHEREcourseNameLIKE'%系統(tǒng)%'));WHERE子句中的IN可以實(shí)現(xiàn)多重嵌套,本例是一個(gè)三重嵌套的例子。Page81SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用IN/NOTIN)【例】查找選修過(guò)課程名中包含“系統(tǒng)”的課程的同學(xué)學(xué)號(hào)、姓名和班級(jí)編號(hào)。SELECTstudentNo,studentName,classNoFROMStudentWHEREstudentNo
IN
(SELECTDISTINCTstudentNo
FROMScorea,CoursebWHEREa.courseNo=b.courseNoANDb.courseNameLIKE'%系統(tǒng)%');本例是上例的另外一種實(shí)現(xiàn)方法,沒(méi)有使用多重嵌套Page82SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用IN/NOTIN)【例】查找同時(shí)選修過(guò)“計(jì)算機(jī)原理”和“高等數(shù)學(xué)”兩門(mén)課程的同學(xué)學(xué)號(hào)、姓名以及該同學(xué)所選修的所有課程的課程名和相應(yīng)成績(jī),按學(xué)號(hào)(升序)、成績(jī)(降序)排序輸出。SELECTa.studentNo,studentName,courseName,scoreFROMStudenta,Courseb,ScorecWHEREa.studentNo=c.studentNoANDb.courseNo=c.courseNoANDa.studentNo
IN(SELECTDISTINCTstudentNoFROMScorex,CourseyWHEREx.courseNo=y.courseNoANDcourseName='計(jì)算機(jī)原理')ANDa.studentNo
IN
(SELECTDISTINCTstudentNoFROMScorex,CourseyWHEREx.courseNo=y.courseNoANDcourseName='高等數(shù)學(xué)')ORDERBYa.studentNo,scoreDESC;Page83SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用IN/NOTIN)【例】查找同時(shí)選修過(guò)“計(jì)算機(jī)原理”和“高等數(shù)學(xué)”兩門(mén)課程的同學(xué)學(xué)號(hào)、姓名以及該同學(xué)所選修的這兩門(mén)課程的課程名和相應(yīng)成績(jī),按學(xué)號(hào)(升序)、成績(jī)(降序)排序輸出。SELECTa.studentNo,studentName,courseName,scoreFROMStudenta,Courseb,ScorecWHEREa.studentNo=c.studentNoANDb.courseNo=c.courseNoANDa.studentNo
IN(SELECTDISTINCTstudentNoFROMScorex,CourseyWHEREx.courseNo=y.courseNoANDcourseName='計(jì)算機(jī)原理')ANDa.studentNo
IN
(SELECTDISTINCTstudentNoFROMScorex,CourseyWHEREx.courseNo=y.courseNoANDcourseName='高等數(shù)學(xué)')
AND(courseName='高等數(shù)學(xué)'ORcourseName='計(jì)算機(jī)原理')ORDERBYa.studentNo,scoreDESC;Page84SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用ANY(或SOME)和ALL)ANY的含義指當(dāng)所指定運(yùn)算符對(duì)于子查詢(xún)返回的結(jié)果集合中的任何一個(gè)值為真時(shí),父查詢(xún)WHERE子句的值為真。SOME與ANY是同義詞,早期用ANY,現(xiàn)在多用SOME。ALL的含義指當(dāng)子查詢(xún)返回0行,或所指定比較運(yùn)算符對(duì)于子查詢(xún)返回的所有結(jié)果均為真時(shí),父查詢(xún)WHERE子句的值為真。ANY/SOME和ALL謂詞與集函數(shù)及IN謂詞的等價(jià)轉(zhuǎn)換關(guān)系Page85=<>或!=<<=>>=ANY/SOMEIN--<MAX<=MAX>MIN>=MINALL--NOTIN<MIN<=MIN>MAX>=MAXSQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用ANY(或SOME)和ALL)【例】查詢(xún)所選修課程成績(jī)大于所有課程編號(hào)“002”號(hào)課程成績(jī)的同學(xué)學(xué)號(hào)及相應(yīng)課程的課程號(hào)和成績(jī)。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore>ALL(SELECTscoreFROMScoreWHEREcourseNo='002');Page86SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用ANY(或SOME)和ALL)【例】查詢(xún)年齡小于“計(jì)算機(jī)科學(xué)與技術(shù)07_01班”某個(gè)同學(xué)年齡的所有同學(xué)的學(xué)號(hào)、姓名和生日。SELECTstudentNo,studentName,birthdayFROMStudentWHEREsysdate-birthday<ANY
(SELECTsysdate-birthdayFROMStudenta,ClassbWHEREa.classNo=b.classNoAND
b.className='計(jì)算機(jī)科學(xué)與技術(shù)07_01班'
);Page87SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用EXISTS/NOTEXISTS)謂詞EXISTS/NOTEXISTS用于測(cè)試表中記錄數(shù)據(jù)的存在性,而不管數(shù)據(jù)值是什么。EXISTS指當(dāng)子查詢(xún)至少返回一個(gè)值時(shí)就取“真”,不論該值是什么(甚至可以是空值NULL);NOTEXISTS指子查詢(xún)返回的是一個(gè)無(wú)行無(wú)列的空表時(shí)就取“真”。Page88SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用EXISTS/NOTEXISTS)【例】查詢(xún)選修了“計(jì)算機(jī)原理”課程的同學(xué)姓名、所在班級(jí)編號(hào)。該查詢(xún)可直接通過(guò)連接運(yùn)算實(shí)現(xiàn),也可以通過(guò)IN子查詢(xún)來(lái)實(shí)現(xiàn)。還可以通過(guò)EXISTS實(shí)現(xiàn):SELECTstudentName,classNoFROMStudentxWHEREEXISTS
(SELECT*FROMScorea,CoursebWHEREa.courseNo=b.courseNoAND
a.studentNo=x.studentNoANDb.courseName='計(jì)算機(jī)原理');Page89SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用EXISTS/NOTEXISTS)【例】查詢(xún)沒(méi)有選修過(guò)任何課程的學(xué)生的學(xué)號(hào)和姓名。實(shí)際上也就是要查詢(xún)出在成績(jī)表中沒(méi)有記錄的學(xué)生的學(xué)號(hào)和姓名。SELECTstudentNo,studentNameFROMStudentxWHERENOTEXISTS
(SELECT*FROMScoreyWHEREy.studentNo=x.studentNo);Page90SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用EXISTS/NOTEXISTS)【例】查詢(xún)已選修課程的學(xué)生中沒(méi)有不及格課程的學(xué)生的學(xué)號(hào)和姓名。SELECTDISTINCTx.studentNo,x.studentNameFROMStudentx,scoreyWHEREx.studentNo=y.studentNoAND
NOTEXISTS(SELECT*FROMScorezWHEREz.studentNo=y.studentNoAND
z.score<60);Page91SQL數(shù)據(jù)查詢(xún)(嵌套查詢(xún))嵌套查詢(xún)(使用EXISTS/NOTEXISTS)【例】查詢(xún)已選修課程的學(xué)生中沒(méi)有不及格課程的學(xué)生的學(xué)號(hào)和姓名。(使用NOTIN改寫(xiě)上例)SELECTDISTINCTx.studentNo,x.studentNameFROMStudentx,scoreyWHEREx.studentNo=y.studentNoAND
y.studentNo
NOTIN
(SELECTz.studentNoFROMScorezWHEREz.studentNo=y.studentNoAND
z.score<60);Page92SQL語(yǔ)言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢(xún)單表查詢(xún)連接查詢(xún)嵌套查詢(xún)集合查詢(xún)SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page93SQL數(shù)據(jù)查詢(xún)(集合查詢(xún))SQL支持集合運(yùn)算SELECT語(yǔ)句查詢(xún)的結(jié)果是集合Oracle的集合運(yùn)算并:UNION(去掉重復(fù)記錄)并:UNIONALL(不去掉重復(fù)記錄)交:INTERSECT差:MINUS集合運(yùn)算的要求參與運(yùn)算的查詢(xún)結(jié)果的列數(shù)一樣對(duì)應(yīng)列的數(shù)據(jù)類(lèi)型必須一致Page94SQL數(shù)據(jù)查詢(xún)(集合查詢(xún))集合運(yùn)算【例】查詢(xún)“信息管理學(xué)院”1990年出生同學(xué)的學(xué)號(hào)、出生日期、班級(jí)名稱(chēng)和所屬學(xué)院以及“會(huì)計(jì)學(xué)院”1991年出生同學(xué)的學(xué)號(hào)、出生日期、班級(jí)名稱(chēng)和所屬學(xué)院。SELECTstudentNo,birthday,className,instituteFROMStudenta,ClassbWHEREa.classNo=b.classNoANDTo_char(birthday,'YYYY')='1990'ANDinstitute='信息管理學(xué)院'UNIONSELECTstudentNo,birthday,className,instituteFROMStudenta,ClassbWHEREa.classNo=b.cla
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 房產(chǎn)分割協(xié)議書(shū)的范本參考
- 建設(shè)工程質(zhì)量保證金監(jiān)管協(xié)議書(shū)模板
- 居民電力委托轉(zhuǎn)供協(xié)議書(shū)
- 二手房買(mǎi)賣(mài)合同樣本參考
- 上海市餐飲業(yè)勞動(dòng)合同范本
- 2024版裝修工程施工合同范本
- 斷橋鋁型材購(gòu)銷(xiāo)合同范本
- 鄉(xiāng)村土地使用權(quán)出租排水合同
- 幼兒園xx至xx學(xué)年度收費(fèi)標(biāo)準(zhǔn)表
- 學(xué)生傳染病病愈返校復(fù)課醫(yī)學(xué)證明查驗(yàn)制度
- 新聞稿件編輯出錯(cuò)檢討書(shū)范文
- 2023-2024學(xué)年山東省濟(jì)南市歷城區(qū)九年級(jí)(上)期中英語(yǔ)試卷
- 2024年全國(guó)注冊(cè)消防工程師之消防技術(shù)綜合能力考試歷年考試題(詳細(xì)參考解析)
- 垂直綠化養(yǎng)護(hù)要點(diǎn)及病蟲(chóng)害防治
- IWAY6.0實(shí)施計(jì)劃完整
- 《慈母情深》教學(xué)設(shè)計(jì)與指導(dǎo)課件(第二課時(shí))
- 火災(zāi)和地震的應(yīng)急處置
- 法律顧問(wèn)服務(wù)投標(biāo)方案(完整技術(shù)標(biāo))
- 人教版八年級(jí)上冊(cè)數(shù)學(xué)期中考試壓軸題專(zhuān)練
- 高等職業(yè)院校有關(guān)說(shuō)課的解析-王津 陜西工業(yè)職業(yè)技術(shù)學(xué)院(2021)講解
- 中國(guó)環(huán)衛(wèi)機(jī)械行業(yè)市場(chǎng)發(fā)展態(tài)勢(shì)及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
評(píng)論
0/150
提交評(píng)論