




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三單元
Oracle與SQL語言宋佳興計(jì)算機(jī)系網(wǎng)絡(luò)所jxsong@主要內(nèi)容Oracle系統(tǒng)簡介Oracle系統(tǒng)結(jié)構(gòu)Oracle系統(tǒng)安裝SQL語言概述SQL語言詳解Page2SQL語言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢單表查詢連接查詢嵌套查詢集合查詢SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page3SQL數(shù)據(jù)定義如要對(duì)數(shù)據(jù)進(jìn)行查詢、添加、修改等各項(xiàng)操作,則應(yīng)先運(yùn)用SQL數(shù)據(jù)定義語言定義基本表、索引和視圖。SQL數(shù)據(jù)定義用到的命令主要有三個(gè):CREATE(創(chuàng)建)、DROP(刪除)、ALTER(修改),索引依賴于基本表,視圖也產(chǎn)生于基本表,因此SQL通常不提供修改索引和視圖的操作,用戶如果想修改這兩個(gè)部分,只能先刪再建。而對(duì)于存放數(shù)據(jù)對(duì)象的整個(gè)數(shù)據(jù)庫創(chuàng)建來說,使用SQL語句比使用某一數(shù)據(jù)庫系統(tǒng)的管理器要復(fù)雜,因而一般情況下都使用管理器進(jìn)行創(chuàng)建。有的數(shù)據(jù)庫系統(tǒng)在安裝時(shí)已經(jīng)創(chuàng)建了一個(gè)缺省的數(shù)據(jù)庫,只需對(duì)其參數(shù)進(jìn)行適當(dāng)調(diào)整即可。Page4SQL數(shù)據(jù)定義Oracle常用數(shù)據(jù)類型(詳細(xì)數(shù)據(jù)類型見參考資料)Page5類型含義CHAR(length)存儲(chǔ)固定長度的字符串。參數(shù)length指定了長度,如果存儲(chǔ)的字符串長度小于length,用空格填充。默認(rèn)長度是1,最長不超過2000字節(jié)。VARCHAR2(length)存儲(chǔ)可變長度的字符串。length指定了該字符串的最大長度。默認(rèn)長度是1,最長不超過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ù)類型>[<列級(jí)完整性約束條件>][,<列名><數(shù)據(jù)類型>[<列級(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)用戶定義完整性約束。表級(jí)完整性約束UNIQUE:唯一性約束,取值不能重復(fù)PRIMARYKEY:聲明為主鍵。FOREIGNKEY:參照完整性的外鍵約束。CHECK子句:實(shí)現(xiàn)用戶定義完整性約束。Page7SQL數(shù)據(jù)定義(基本表)建立學(xué)生成績管理數(shù)據(jù)庫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é)生成績管理數(shù)據(jù)庫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é)生成績管理數(shù)據(jù)庫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é)生成績管理數(shù)據(jù)庫ScoreDB中的4張表CREATETABLEScore(--定義成績表ScorestudentNochar(7)
NOTNULL,--學(xué)號(hào)
courseNochar(3)
NOTNULL,--課程號(hào)
scorenumber(5,1)default0
NOTNULL,--成績
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ù)類型>[完整性約束]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類型>];<表名>:要修改的基本表ADD子句:增加新列和新的完整性約束條件DROP子句:刪除指定的完整性約束條件MODIFY子句:用于修改列名和數(shù)據(jù)類型Page12SQL數(shù)據(jù)定義(基本表)修改基本表(AlterTable)建立一個(gè)測試用的臨時(shí)表CREATETABLETempTable(xnochar(3)NOTNULL,xnamevarchar2(2)NOTNULL,CONSTRAINTTempPKPRIMARYKEY(xno));Page13SQL數(shù)據(jù)定義(基本表)修改基本表(AlterTable)【例】為TempTable表增加一列。ALTERTABLETempTableADDxsexnumber(1)default0;【例】為TempTable表的xname列修改數(shù)據(jù)類型。ALTERTABLETempTableMODIFYxnamevarchar2(10);【例】為TempTable表的xname列增加唯一約束。ALTERTABLETempTableADDCONSTRAINTUniqueXnameUNIQUE(xname);Page14SQL數(shù)據(jù)定義(基本表)刪除基本表(DropTable)當(dāng)某個(gè)基本表不再需要時(shí),應(yīng)當(dāng)及時(shí)刪除,以節(jié)省空間和減少出錯(cuò)等問題。DROPTABLE<表名>基表一旦刪除,表中的數(shù)據(jù)、該表上建立的索引都將自動(dòng)被刪除。另外,有的系統(tǒng)如Oracle,刪除基表后建立在該表上的視圖仍然保留在數(shù)據(jù)字典中,但用戶引用時(shí)就出錯(cuò),所以還需手動(dòng)刪除相應(yīng)所有視圖。【例】刪除TempTable表DROPTABLETempTable;Page15SQL數(shù)據(jù)定義(索引)建立索引是加快查詢速度的有效手段建立索引是一個(gè)數(shù)據(jù)庫所必須的建立索引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)的順序與表中記錄的物理順序一致的索引組織。用戶可以在最常查詢的字段上建立聚簇索引以提高查詢效率。顯然在一個(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)常使用的索引刪除索引操作的語法為:DROPINDEX<索引名>
【例】刪除InstituteIdx索引。DROPINDEXInstituteIdx;Page20SQL數(shù)據(jù)定義(視圖)創(chuàng)建視圖(CreateView)刪除視圖(DropView)
創(chuàng)建視圖需要用到SQL數(shù)據(jù)查詢,本部分內(nèi)容放到SQL數(shù)據(jù)查詢之后在詳細(xì)介紹。Page21SQL語言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢單表查詢連接查詢嵌套查詢集合查詢SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page22SQL數(shù)據(jù)查詢SQL數(shù)據(jù)查詢(Select)SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]];Page23SQL數(shù)據(jù)查詢SQL數(shù)據(jù)查詢(Select)SELECT子句:指定要顯示的屬性列FROM子句:指定查詢對(duì)象(基本表、視圖或查詢表)WHERE子句:指定查詢條件GROUPBY子句:對(duì)查詢結(jié)果按指定列的值分組,屬性列值相等的元組為一個(gè)組。通常會(huì)在每組中使用集函數(shù)HAVING短語:篩選出只有滿足指定條件的組ORDERBY子句:對(duì)查詢結(jié)果表按指定列值的升序或降序排序Page24SQL數(shù)據(jù)查詢單表查詢只涉及一個(gè)基本表或者視圖的查詢連接查詢涉及兩個(gè)或者兩個(gè)以上基本表或者視圖的查詢嵌套查詢將一個(gè)子查詢嵌套在另一個(gè)查詢WHERE子句或HAVING短語條件中的一種查詢集合查詢對(duì)多個(gè)查詢的結(jié)果進(jìn)行集合操作Page25SQL數(shù)據(jù)查詢(實(shí)例ScoreDB)Page26SQL數(shù)據(jù)查詢(實(shí)例ScoreDB)Page27SQL數(shù)據(jù)查詢(實(shí)例ScoreDB)Page28SQL數(shù)據(jù)查詢(實(shí)例ScoreDB)Page29SQL語言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢單表查詢連接查詢嵌套查詢集合查詢SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page30SQL數(shù)據(jù)查詢(單表查詢)SELECT子句可以實(shí)現(xiàn)關(guān)系代數(shù)中的投影運(yùn)算查詢指定列選取表中的指定列,通過SELECT確定要查詢的屬性【例】查詢所有班級(jí)的班級(jí)編號(hào)、班級(jí)名稱和所屬學(xué)院SELECTclassNo,className,instituteFROMClass;Page31SQL數(shù)據(jù)查詢(單表查詢)消除重復(fù)元組需要消除重復(fù)元組,使用DISTINCT關(guān)鍵字【例】查詢所有學(xué)院的名稱SELECTinstituteFROMClass;【例】查詢所有學(xué)院的名稱并消除重復(fù)元組SELECTDISTINCTinstituteFROMClass;Page32SQL數(shù)據(jù)查詢(單表查詢)查詢所有列可使用兩種方法:將所有的列在SELECT子句中列出(可以改變列的顯示順序);使用*號(hào),*表示所有屬性,按照表定義時(shí)的順序顯示所有屬性。【例】查詢所有班級(jí)的全部信息SELECTclassNo,className,classNum,grade,instituteFROMClass;【例】查詢所有班級(jí)的全部信息SELECT*
FROMClass;Page33SQL數(shù)據(jù)查詢(單表查詢)給屬性列取別名可為屬性列取一個(gè)便于理解的列名,如用中文來顯示列名,為屬性列取別名特別適合經(jīng)過計(jì)算的列?!纠坎樵兯邪嗉?jí)的所屬學(xué)院、班級(jí)編號(hào)和班級(jí)名稱,要求用中文顯示列名SELECTinstitute所屬學(xué)院,classNo班級(jí)編號(hào),className班級(jí)名稱FROMClass;【例】該查詢可使用AS關(guān)鍵字取別名SELECTinstituteAS所屬學(xué)院,
classNoAS班級(jí)編號(hào),
classNameAS班級(jí)名稱FROMClass;Page34SQL數(shù)據(jù)查詢(單表查詢)查詢經(jīng)過計(jì)算的列可使用屬性、常數(shù)、函數(shù)和表達(dá)式【例】查詢每個(gè)班級(jí)編號(hào)、班級(jí)名稱以及該班級(jí)現(xiàn)在為幾年級(jí),并將班級(jí)編號(hào)中大寫字母改為小寫字母輸出SELECTlower(classNo)lowerclassNo,className,To_number(To_char(Sysdate,'YYYY'))-gradeclassgradeFROMClass;Oracle內(nèi)置函數(shù)Sysdate返回系統(tǒng)當(dāng)前時(shí)間函數(shù)lower()將大寫字母改為小寫字母函數(shù)To_char()將日期轉(zhuǎn)換為指定格式的字符串函數(shù)To_number()將字符串轉(zhuǎn)化為數(shù)值Page35SQL數(shù)據(jù)查詢(單表查詢)WHERE子句可以實(shí)現(xiàn)關(guān)系代數(shù)中的選擇運(yùn)算WHERE常用的查詢條件有:比較運(yùn)算:>、>=、<、<=、=、<>(或!=)范圍查詢:BETWEEN...AND集合查詢:IN空值查詢:ISnull字符匹配查詢:LIKE邏輯查詢:AND、OR、NOTPage36SQL數(shù)據(jù)查詢(單表查詢)比較運(yùn)算使用比較運(yùn)算符>、>=、<、<=、=、<>(或!=)
【例】查詢2007級(jí)的班級(jí)編號(hào)、班級(jí)名稱和所屬學(xué)院。SELECTclassNo,className,instituteFROMClassWHEREgrade=2007;【例】在學(xué)生Student表中查詢年齡大于或等于22歲的同學(xué)學(xué)號(hào)、姓名和出生日期。SELECTstudentNo,studentName,birthdayFROMStudentWHEREmonths_between(sysdate,birthday)/12>=22;Page37SQL數(shù)據(jù)查詢(單表查詢)范圍查詢BETWEEN...AND用于查詢屬性值在某一個(gè)范圍內(nèi)的元組NOT
BETWEEN...AND用于查詢屬性值不在某一個(gè)范圍內(nèi)的元組BETWEEN后是屬性的下限值,AND后是屬性的上限值【例】在選課Score表中查詢成績在80~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績SELECTstudentNo,courseNo,scoreFROMScoreWHEREscoreBETWEEN80AND90;Page38SQL數(shù)據(jù)查詢(單表查詢)范圍查詢BETWEEN...AND用于查詢屬性值在某一個(gè)范圍內(nèi)的元組NOT
BETWEEN...AND用于查詢屬性值不在某一個(gè)范圍內(nèi)的元組BETWEEN后是屬性的下限值,AND后是屬性的上限值【例】在選課Score表中查詢成績不在80~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscoreNOTBETWEEN80AND90;Page39SQL數(shù)據(jù)查詢(單表查詢)集合查詢IN用于查詢屬性值在某個(gè)集合內(nèi)的元組NOTIN用于查詢屬性值不在某個(gè)集合內(nèi)的元組
IN后面是集合,可以是具體的集合,也可以是查詢出來的元組集合?!纠吭谶x課Score表中查詢選修了“001”、“005”或“003”課程的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績。SELECTstudentNo,courseNo,scoreFROMScoreWHEREcourseNoIN('001','005','003');Page40SQL數(shù)據(jù)查詢(單表查詢)集合查詢IN用于查詢屬性值在某個(gè)集合內(nèi)的元組NOTIN用于查詢屬性值不在某個(gè)集合內(nèi)的元組
IN后面是集合,可以是具體的集合,也可以是查詢出來的元組集合?!纠吭趯W(xué)生Student表中查詢籍貫不是“南昌”或“上?!钡耐瑢W(xué)姓名、籍貫和所屬班級(jí)編號(hào)。SELECTstudentName,native,classNoFROMStudentWHEREnativeNOTIN('南昌','上海');Page41SQL數(shù)據(jù)查詢(單表查詢)空值查詢空值表示未知或不確定的值,空值表示為NULLISNULL用于查詢屬性值為空值,IS不能用“=”替代ISNOTNULL用于查詢屬性值不為空值【例】在課程表中查詢先修課程為空值的課程信息。SELECT*FROMCourseWHEREpriorCourseISNULL;【例】在課程表中查詢有先修課程的課程信息。SELECT*FROMCourseWHEREpriorCourseISNOTNULL;Page42SQL數(shù)據(jù)查詢(單表查詢)字符匹配查詢LIKE用于字符匹配查詢,語法格式為:[NOT]LIKE<匹配字符串>[ESCAPE<換碼字符>]查詢的含義是:如果LIKE前沒有NOT,則查詢指定的屬性列值與<匹配字符串>相匹配的元組;如果LIKE前有NOT,則查詢指定的屬性列值不與<匹配字符串>相匹配的元組。<匹配字符串>可以是一個(gè)具體的字符串,也可以包括通配符,符號(hào)%表示任意長度的字符串,符號(hào)_(下劃線)表示任意一個(gè)字符。Page43SQL數(shù)據(jù)查詢(單表查詢)字符匹配查詢LIKE用于字符匹配查詢,語法格式為:[NOT]LIKE<匹配字符串>[ESCAPE<換碼字符>]字符匹配例子ab%,表示所有以ab開頭的任意長度的字符串;zhang%ab,表示以zhang開頭,以ab結(jié)束,中間可以是任意個(gè)字符的字符串。ab_,表示所有以ab開頭的3個(gè)字符的字符串,其中第3個(gè)字符為任意字符;a__b表示所有以a開頭,以b結(jié)束的4個(gè)字符的字符串,且第2、3個(gè)字符為任意字符。Page44SQL數(shù)據(jù)查詢(單表查詢)字符匹配查詢【例】在班級(jí)Class表中查詢班級(jí)名稱中含有會(huì)計(jì)的班級(jí)信息。SELECT*FROMClassWHEREclassNameLIKE'%會(huì)計(jì)%';【例】在學(xué)生Student表中查詢所有姓王且全名為3個(gè)漢字的同學(xué)學(xué)號(hào)和姓名。SELECTstudentNo,studentNameFROMStudentWHEREstudentNameLIKE'王__';【例】在學(xué)生Student表中查詢名字中不含有“福”的同學(xué)學(xué)號(hào)和姓名。SELECTstudentNo,studentNameFROMStudentWHEREstudentNameNOTLIKE'%福%';Page45SQL數(shù)據(jù)查詢(單表查詢)字符匹配查詢【例】在學(xué)生Student表中查詢蒙古族的同學(xué)學(xué)號(hào)和姓名SELECTstudentNo,studentNameFROMStudentWHEREnationLIKE'蒙古族';注意:如果匹配字符串中不含有%和_,則LIKE與比較運(yùn)算符“=”的查詢結(jié)果一樣,該查詢等價(jià)于下面查詢:SELECTstudentNo,studentNameFROMStudentWHEREnation='蒙古族';Page46SQL數(shù)據(jù)查詢(單表查詢)字符匹配查詢?nèi)绻樵冏执斜旧硪?和_,必須使用“ESCAPE<換碼字符>”短語,對(duì)通配符進(jìn)行轉(zhuǎn)義處理?!纠吭诎嗉?jí)Class表中查詢班級(jí)名稱中含有“08_”符號(hào)的班級(jí)名稱SELECTclassNameFROMClassWHEREclassNameLIKE'%08\_%'ESCAPE'\';“ESCAPE‘\’”表示\為換碼字符,緊跟在\符號(hào)后的_不是通配符,而是普通的用戶要查詢的符號(hào),如果將#字符作為換碼字符,則該查詢可改寫為:SELECTclassNameFROMClassWHEREclassNameLIKE'%08#_%'ESCAPE'#';Page47SQL數(shù)據(jù)查詢(單表查詢)邏輯查詢SQL提供AND、OR和NOT邏輯運(yùn)算符分別實(shí)現(xiàn)邏輯與、邏輯或和邏輯非運(yùn)算【例】在選課Score表中查詢選修了“001”、“005”或“003”課程的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績SELECTstudentNo,courseNo,scoreFROMScoreWHEREcourseNo='001'ORcourseNo='005'ORcourseNo='003';也可采用集合運(yùn)算IN實(shí)現(xiàn),本例中采用邏輯“或”運(yùn)算Page48SQL數(shù)據(jù)查詢(單表查詢)邏輯查詢【例】在Student表中查詢1991年出生且籍貫為“漢族”的同學(xué)學(xué)號(hào)、姓名、出生日期。SELECTstudentNo,studentName,birthdayFROMStudentWHERETo_char(birthday,'YYYY')='1991'ANDnation='漢族';【例】在Student表中查詢籍貫不是“南昌”或“上?!钡耐瑢W(xué)姓名、籍貫和所屬班級(jí)編號(hào)。SELECTstudentName,native,classNoFROMStudentWHEREnative!='南昌'ANDnative!='上海';Page49SQL數(shù)據(jù)查詢(單表查詢)邏輯查詢【例】在選課Score表中查詢成績在80~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore>=80ANDscore<=90;【例】在選課Score表中查詢成績不在80~90分之間的同學(xué)學(xué)號(hào)、課程號(hào)和相應(yīng)成績。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore<80OR
score>90;Page50SQL數(shù)據(jù)查詢(單表查詢)排序運(yùn)算使用ORDERBY子句實(shí)現(xiàn)排序運(yùn)算,其語法為:ORDERBY<表達(dá)式1>[ASC|DESC]
[,<表達(dá)式2>[ASC|DESC],...]基本說明:<表達(dá)式1>,<表達(dá)式2>,...可以是屬性、函數(shù)或表達(dá)式缺省按升序(ASC)排序,按降序排序,必須指明DESC選項(xiàng)運(yùn)算含義:在查詢結(jié)果中首先按<表達(dá)式1>的值進(jìn)行排序在<表達(dá)式1>值相等的情況下再按<表達(dá)式2>值排序依此類推Page51SQL數(shù)據(jù)查詢(單表查詢)排序運(yùn)算【例】在學(xué)生Student表中查詢籍貫不是“南昌”或“上?!钡耐瑢W(xué)姓名、籍貫和所屬班級(jí)編號(hào),并按籍貫的降序排序輸出。SELECTstudentName,native,classNoFROMStudentWHEREnative!='南昌'ANDnative!='上海'ORDERBYnativeDESC;【例】在學(xué)生Student表中查詢“女”學(xué)生的學(xué)號(hào)、姓名、所屬班級(jí)編號(hào)和出生日期,并按班級(jí)編號(hào)的升序、出生日期的月份降序排序輸出。SELECTstudentNo,studentName,classNo,birthdayFROMStudentWHEREsex='女'ORDERBYclassNo,to_char(birthday,'MM')DESC;Page52SQL數(shù)據(jù)查詢(單表查詢)查詢表FROM子句后面可以是基本表、視圖,還可以是查詢表【例】查詢1991年出生的“女”同學(xué)基本信息。可以先將學(xué)生表中的女生記錄查詢出來,然后再對(duì)查詢表進(jìn)行選擇、投影操作。SELECTstudentNo,studentName,birthdayFROM(SELECT*FROMStudentWHEREsex='女')aWHERETo_char(birthday,'YYYY')='1991';在FROM子句后是一個(gè)子查詢,表示對(duì)子查詢的查詢結(jié)果(查詢表)進(jìn)行查詢,必須為查詢表取一個(gè)名稱(稱為元組變量),如取名為aPage53SQL數(shù)據(jù)查詢(單表查詢)聚合查詢SQL查詢提供了豐富的數(shù)據(jù)分類、統(tǒng)計(jì)功能統(tǒng)計(jì)功能通過聚合函數(shù)來實(shí)現(xiàn)分類功能通過分組子句來實(shí)現(xiàn)統(tǒng)計(jì)和分組結(jié)合在一起實(shí)現(xiàn)豐富的查詢功能Page54SQL數(shù)據(jù)查詢(單表查詢)聚合函數(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謂詞或沒有DISTINCT謂詞,表示不消除<列名>取重復(fù)值的元組Page55SQL數(shù)據(jù)查詢(單表查詢)聚合函數(shù)【例】查詢學(xué)生總?cè)藬?shù)。SELECTcount(*)學(xué)生人數(shù)FROMStudent;【例】查詢所有選課學(xué)生的人數(shù)。SELECTcount(studentNo)
學(xué)生人數(shù)FROMScore;查詢結(jié)果是40,由于一個(gè)學(xué)生可以選修多門課程,學(xué)號(hào)存在重復(fù),為消除重復(fù)的元組,使用DISTINCT短語,將查詢修改為:SELECTcount(DISTINCTstudentNo)學(xué)生人數(shù)FROMScore;查詢結(jié)果為10Page56SQL數(shù)據(jù)查詢(單表查詢)聚合函數(shù)【例】查詢學(xué)號(hào)為“0800005”同學(xué)所選修課程成績的最高分SELECTmax(score)最高分FROMScoreWHEREstudentNo=
'0800005';【例】查詢學(xué)號(hào)為“0800005”同學(xué)所選修課程成績的平均分SELECTavg(score)平均分FROMScoreWHEREstudentNo='0800005';在聚合函數(shù)遇到空值時(shí),除count(*)外所有的函數(shù)皆跳過空值,只處理非空值。Page57SQL數(shù)據(jù)查詢(單表查詢)分組運(yùn)算在SQL查詢中,往往需要對(duì)數(shù)據(jù)進(jìn)行分組運(yùn)算,分組運(yùn)算的目的是為了細(xì)化聚合函數(shù)的作用對(duì)象。如不對(duì)查詢結(jié)果分組,則聚合函數(shù)作用于整個(gè)查詢結(jié)果。如對(duì)查詢結(jié)果進(jìn)行分組,則聚合函數(shù)分別作用于每個(gè)組,查詢結(jié)果按組聚合輸出。SQL通過GROUPBY和HAVING子句實(shí)現(xiàn)分組運(yùn)算GROUPBY:對(duì)查詢結(jié)果按某一列或某幾列進(jìn)行分組,值相等的分為一組;HAVING:對(duì)分組的結(jié)果進(jìn)行選擇,僅輸出滿足條件的組。該子句必須與GROUPBY子句配合使用。Page58SQL數(shù)據(jù)查詢(單表查詢)分組運(yùn)算【例】查詢每個(gè)同學(xué)選課門數(shù)、平均分和最高分。SELECTstudentNo,
count(*)門數(shù),
avg(score)平均分,max(score)最高分FROMScoreGROUPBYstudentNo;結(jié)果按學(xué)號(hào)StudentNo分組,將具有相同StudentNo值的元組作為一組,然后對(duì)每組進(jìn)行相應(yīng)的計(jì)數(shù)、求平均值和求最大值Page59SQL數(shù)據(jù)查詢(單表查詢)分組運(yùn)算【例】查詢平均分在80分以上的每個(gè)同學(xué)的選課門數(shù)、平均分和最高分。SELECTStudentNo,count(*)門數(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ù)查詢(單表查詢)分組運(yùn)算【例】查詢成績表Score中成績最高分的學(xué)生的學(xué)號(hào)、課程號(hào)和相應(yīng)成績SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore=(SELECTmax(score)FROMScore);聚合函數(shù)可直接用在HAVING子句中,也可用于子查詢中,但在WHERE子句中不可以直接使用聚合函數(shù)。如下語句是不正確的:SELECT*FROMScoreWHEREscore=max(score)Page61SQL語言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢單表查詢連接查詢嵌套查詢集合查詢SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page62SQL數(shù)據(jù)查詢(連接查詢)連接查詢在WHERE子句中加入連接多個(gè)表的連接條件語句格式如下: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子句的連接謂詞中的屬性稱為連接屬性,連接屬性之間必須具有可比性Page63SQL數(shù)據(jù)查詢(連接查詢)連接查詢(等值連接)【例】查找會(huì)計(jì)學(xué)院全體同學(xué)的學(xué)號(hào)、姓名、籍貫、班級(jí)編號(hào)和所在班級(jí)名稱。SELECTstudentNo,studentName,native,Student.classNo,classNameFROMStudent,ClassWHEREStudent.classNo=Class.classNoANDinstitute='會(huì)計(jì)學(xué)院';在連接操作中,如果涉及到多個(gè)表的相同屬性名,必須在相同的屬性名前加上表名加以區(qū)分Page64SQL數(shù)據(jù)查詢(連接查詢)連接查詢(等值連接)可為參與連接的表取別名(稱為元組變量),在相同的屬性名前加上表的別名。將Student表取別名為a,Class表取別名為b,班級(jí)編號(hào)分別用a.classNo和b.classNo表示。上例可以改寫為:SELECTstudentNo,studentName,native,b.classNo,classNameFROMStudenta,ClassbWHEREa.classNo=b.classNoANDinstitute='會(huì)計(jì)學(xué)院';對(duì)于不同屬性名,可以不在屬性名前加上表名或別名。Page65SQL數(shù)據(jù)查詢(連接查詢)連接查詢(等值連接)【例】查找選修了課程名稱為“計(jì)算機(jī)原理”的同學(xué)學(xué)號(hào)、姓名。查詢語句為: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ù)查詢(連接查詢)連接查詢(等值連接)【例】查找同時(shí)選修了編號(hào)為“001”和“002”課程的同學(xué)學(xué)號(hào)、姓名、課程號(hào)和相應(yīng)成績,并按學(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ù)查詢(連接查詢)連接查詢(等值連接)【例】查找同時(shí)選修了編號(hào)為“001”和“002”課程的同學(xué)學(xué)號(hào)、姓名、課程號(hào)和相應(yīng)成績,并按學(xué)號(hào)排序。該查詢也可以表示為: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ù)查詢(連接查詢)連接查詢(等值連接)【例】查找同時(shí)選修了編號(hào)為“001”和“002”課程的同學(xué)學(xué)號(hào)、姓名、課程號(hào)和相應(yīng)成績,并按學(xué)號(hào)排序。該查詢還可以表示為: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ù)查詢(連接查詢)連接查詢(自然連接)SQL不直接支持自然連接,完成自然連接的方法是在等值連接的基礎(chǔ)上消除重復(fù)列?!纠繉?shí)現(xiàn)成績表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ù)查詢(連接查詢)連接查詢(自表連接)若某個(gè)表與自己進(jìn)行連接,稱為自表連接?!纠吭趯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ù)查詢(連接查詢)連接查詢(外連接)在一般的連接中,只有滿足連接條件的元組才被檢索出來,對(duì)于沒有滿足連接條件的元組是不作為結(jié)果被檢索出來的?!纠坎樵兠總€(gè)班級(jí)的班級(jí)名稱、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱排序輸出。SELECTclassName,institute,studentNo,studentNameFROMClassa,StudentbWHEREa.classNo=b.classNoORDERBYclassName;Page72SQL數(shù)據(jù)查詢(連接查詢)連接查詢(外連接)從查詢結(jié)果中可以看出:班級(jí)表中的“注冊會(huì)計(jì)08_01班”、“注冊會(huì)計(jì)08_03班”以及“金融管理07_01班”3個(gè)班沒有出現(xiàn)在查詢結(jié)果中,原因是這3個(gè)班沒有學(xué)生。在實(shí)際應(yīng)用中,往往需要將不滿足連接條件的元組也檢索出來,只是在相應(yīng)的位置用空值替代,這種查詢稱為外連接查詢。外連接分為左外連接、右外連接和全外連接。在FROM子句中,寫在左邊的表稱為左關(guān)系,寫在右邊的表稱為右關(guān)系。Page73SQL數(shù)據(jù)查詢(連接查詢)連接查詢(外連接)左外連接連接結(jié)果中包含左關(guān)系中的所有元組,對(duì)于左關(guān)系中沒有連接上的元組,其右關(guān)系中的相應(yīng)屬性用空值替代?!纠渴褂米笸膺B接查詢每個(gè)班級(jí)的班級(jí)名稱、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱排序輸出。SELECTclassName,institute,studentNo,studentNameFROMClassaLEFTOUTERJOINStudentbONa.classNo=b.classNoORDERBYclassName;Page74SQL數(shù)據(jù)查詢(連接查詢)連接查詢(外連接)右外連接連接結(jié)果中包含右關(guān)系中的所有元組,對(duì)于右關(guān)系中沒有連接上的元組,其左關(guān)系中的相應(yīng)屬性用空值替代。【例】使用右外連接查詢每個(gè)班級(jí)的班級(jí)名稱、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱排序輸出。SELECTclassName,institute,studentNo,studentNameFROMStudentaRIGHTOUTERJOINClassbONa.classNo=b.classNoORDERBYclassName;Page75SQL數(shù)據(jù)查詢(連接查詢)連接查詢(外連接)全外連接連接結(jié)果中包含左、右關(guān)系中的所有元組對(duì)左關(guān)系中沒有連接上的元組,其右關(guān)系中的相應(yīng)屬性用空值替代對(duì)右關(guān)系中沒有連接上的元組,其左關(guān)系中的相應(yīng)屬性用空值替代【例】使用全外連接查詢每個(gè)班級(jí)的班級(jí)名稱、所屬學(xué)院、學(xué)生學(xué)號(hào)、學(xué)生姓名,按班級(jí)名稱排序輸出。SELECTclassName,institute,studentNo,studentNameFROMClassaFULLOUTERJOINStudentbONa.classNo=b.classNoORDERBYclassName;Page76SQL語言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢單表查詢連接查詢嵌套查詢集合查詢SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page77SQL數(shù)據(jù)查詢(嵌套查詢)在SQL語言中,可以用多個(gè)簡單查詢構(gòu)成復(fù)雜的查詢,從而增強(qiáng)SQL的查詢能力。一個(gè)SELECT-FROM-WHERE查詢語句稱為一個(gè)查詢塊,將一個(gè)查詢塊嵌入到另一個(gè)查詢塊的WHERE子句或HAVING子句中,稱為嵌套查詢。在一個(gè)嵌套語句中,上層的查詢塊稱為外層查詢或父查詢,下層的查詢塊稱為內(nèi)層查詢或子查詢。SQL語言允許多層嵌套查詢,但在子查詢中,不允許使用ORDERBY子句,該子句僅用于最后的輸出結(jié)果排序。Page78SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用IN/NOTIN)子查詢中使用最多的是謂詞IN和NOTIN,含義為當(dāng)查詢的指定屬性值包含(或不包含)在子查詢結(jié)果屬性值表中時(shí)條件為真。【例】查詢選修過課程的學(xué)生姓名。本例查詢的含義是:在學(xué)生表Student中,將學(xué)號(hào)出現(xiàn)在成績表Score中(表明該學(xué)生選修過課程)的學(xué)生姓名查詢出來。SELECTstudentNameFROMStudentWHEREStudent.studentNo
IN
(SELECTScore.studentNoFROMScore);Page79SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用IN/NOTIN)【例】查詢沒有選修過任何課程的學(xué)生學(xué)號(hào)和姓名。本例查詢的含義是:在學(xué)生表Student中,將學(xué)號(hào)沒有出現(xiàn)在成績表Score中的學(xué)生學(xué)號(hào)和姓名查詢出來。SELECTstudentNo,
studentNameFROMStudentWHEREStudent.studentNo
NOTIN
(SELECTScore.studentNo
FROMScore);Page80SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用IN/NOTIN)【例】查找選修過課程名中包含“系統(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ù)查詢(嵌套查詢)嵌套查詢(使用IN/NOTIN)【例】查找選修過課程名中包含“系統(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)方法,沒有使用多重嵌套Page82SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用IN/NOTIN)【例】查找同時(shí)選修過“計(jì)算機(jī)原理”和“高等數(shù)學(xué)”兩門課程的同學(xué)學(xué)號(hào)、姓名以及該同學(xué)所選修的所有課程的課程名和相應(yīng)成績,按學(xué)號(hào)(升序)、成績(降序)排序輸出。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ù)查詢(嵌套查詢)嵌套查詢(使用IN/NOTIN)【例】查找同時(shí)選修過“計(jì)算機(jī)原理”和“高等數(shù)學(xué)”兩門課程的同學(xué)學(xué)號(hào)、姓名以及該同學(xué)所選修的這兩門課程的課程名和相應(yīng)成績,按學(xué)號(hào)(升序)、成績(降序)排序輸出。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ù)查詢(嵌套查詢)嵌套查詢(使用ANY(或SOME)和ALL)ANY的含義指當(dāng)所指定運(yùn)算符對(duì)于子查詢返回的結(jié)果集合中的任何一個(gè)值為真時(shí),父查詢WHERE子句的值為真。SOME與ANY是同義詞,早期用ANY,現(xiàn)在多用SOME。ALL的含義指當(dāng)子查詢返回0行,或所指定比較運(yùn)算符對(duì)于子查詢返回的所有結(jié)果均為真時(shí),父查詢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ù)查詢(嵌套查詢)嵌套查詢(使用ANY(或SOME)和ALL)【例】查詢所選修課程成績大于所有課程編號(hào)“002”號(hào)課程成績的同學(xué)學(xué)號(hào)及相應(yīng)課程的課程號(hào)和成績。SELECTstudentNo,courseNo,scoreFROMScoreWHEREscore>ALL(SELECTscoreFROMScoreWHEREcourseNo='002');Page86SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用ANY(或SOME)和ALL)【例】查詢年齡小于“計(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ù)查詢(嵌套查詢)嵌套查詢(使用EXISTS/NOTEXISTS)謂詞EXISTS/NOTEXISTS用于測試表中記錄數(shù)據(jù)的存在性,而不管數(shù)據(jù)值是什么。EXISTS指當(dāng)子查詢至少返回一個(gè)值時(shí)就取“真”,不論該值是什么(甚至可以是空值NULL);NOTEXISTS指子查詢返回的是一個(gè)無行無列的空表時(shí)就取“真”。Page88SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用EXISTS/NOTEXISTS)【例】查詢選修了“計(jì)算機(jī)原理”課程的同學(xué)姓名、所在班級(jí)編號(hào)。該查詢可直接通過連接運(yùn)算實(shí)現(xiàn),也可以通過IN子查詢來實(shí)現(xiàn)。還可以通過EXISTS實(shí)現(xiàn):SELECTstudentName,classNoFROMStudentxWHEREEXISTS
(SELECT*FROMScorea,CoursebWHEREa.courseNo=b.courseNoAND
a.studentNo=x.studentNoANDb.courseName='計(jì)算機(jī)原理');Page89SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用EXISTS/NOTEXISTS)【例】查詢沒有選修過任何課程的學(xué)生的學(xué)號(hào)和姓名。實(shí)際上也就是要查詢出在成績表中沒有記錄的學(xué)生的學(xué)號(hào)和姓名。SELECTstudentNo,studentNameFROMStudentxWHERENOTEXISTS
(SELECT*FROMScoreyWHEREy.studentNo=x.studentNo);Page90SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用EXISTS/NOTEXISTS)【例】查詢已選修課程的學(xué)生中沒有不及格課程的學(xué)生的學(xué)號(hào)和姓名。SELECTDISTINCTx.studentNo,x.studentNameFROMStudentx,scoreyWHEREx.studentNo=y.studentNoAND
NOTEXISTS(SELECT*FROMScorezWHEREz.studentNo=y.studentNoAND
z.score<60);Page91SQL數(shù)據(jù)查詢(嵌套查詢)嵌套查詢(使用EXISTS/NOTEXISTS)【例】查詢已選修課程的學(xué)生中沒有不及格課程的學(xué)生的學(xué)號(hào)和姓名。(使用NOTIN改寫上例)SELECTDISTINCTx.studentNo,x.studentNameFROMStudentx,scoreyWHEREx.studentNo=y.studentNoAND
y.studentNo
NOTIN
(SELECTz.studentNoFROMScorezWHEREz.studentNo=y.studentNoAND
z.score<60);Page92SQL語言詳解SQL數(shù)據(jù)定義SQL數(shù)據(jù)查詢單表查詢連接查詢嵌套查詢集合查詢SQL數(shù)據(jù)更新SQL視圖操作SQL數(shù)據(jù)控制Page93SQL數(shù)據(jù)查詢(集合查詢)SQL支持集合運(yùn)算SELECT語句查詢的結(jié)果是集合Oracle的集合運(yùn)算并:UNION(去掉重復(fù)記錄)并:UNIONALL(不去掉重復(fù)記錄)交:INTERSECT差:MINUS集合運(yùn)算的要求參與運(yùn)算的查詢結(jié)果的列數(shù)一樣對(duì)應(yīng)列的數(shù)據(jù)類型必須一致Page94SQL數(shù)據(jù)查詢(集合查詢)集合運(yùn)算【例】查詢“信息管理學(xué)院”1990年出生同學(xué)的學(xué)號(hào)、出生日期、班級(jí)名稱和所屬學(xué)院以及“會(huì)計(jì)學(xué)院”1991年出生同學(xué)的學(xué)號(hào)、出生日期、班級(jí)名稱和所屬學(xué)院。SELECTstudentNo,birthday,className,instituteFROMStudenta,ClassbWHEREa.classNo=b.classNoANDTo_char(birthday,'YYYY')='1990'ANDinstitute='信息管理學(xué)院'UNIONSELECTstudentNo,birthday,className,instituteFROMStudenta,ClassbWHEREa.classNo=b.cla
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年黨政領(lǐng)導(dǎo)干部選拔任用工作條例知識(shí)競賽題庫及答案(50題)
- 2025圖書館圖書采購合同
- 2025年一建《機(jī)電工程管理與實(shí)務(wù)》案例分析題庫案例分析實(shí)戰(zhàn)解析試卷
- 病理生理學(xué)期末選擇題
- 病理生理題庫
- 2025簡化版房屋租賃合同協(xié)議書
- 2025信息技術(shù)咨詢服務(wù)合同
- 2025企業(yè)間短期借款合同
- 別墅保潔主管月總結(jié)
- 必修1-選修8單詞默寫(一)
- 配電間巡檢記錄表
- ISO 31000-2018 風(fēng)險(xiǎn)管理標(biāo)準(zhǔn)-中文版
- 雙人法成生命支持評(píng)分表
- DBJ61_T 179-2021 房屋建筑與市政基礎(chǔ)設(shè)施工程專業(yè)人員配備標(biāo)準(zhǔn)
- 畢業(yè)設(shè)計(jì)三交河煤礦2煤層開采初步設(shè)計(jì)
- 預(yù)應(yīng)力錨索施工全套表格模板
- 食品流通許可證食品經(jīng)營操作流程圖
- CA6132普通車床使用說明書
- 風(fēng)電場工作安全培訓(xùn)
- 壓縮機(jī)課程設(shè)計(jì)(共28頁)
- 四方公司機(jī)組扭振監(jiān)測、控制和保護(hù)新技術(shù)---1105 17
評(píng)論
0/150
提交評(píng)論