第7章 高級(jí)查詢(xún)_第1頁(yè)
第7章 高級(jí)查詢(xún)_第2頁(yè)
第7章 高級(jí)查詢(xún)_第3頁(yè)
第7章 高級(jí)查詢(xún)_第4頁(yè)
第7章 高級(jí)查詢(xún)_第5頁(yè)
已閱讀5頁(yè),還剩126頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)踐技術(shù)

(SQLServer2008)何玉潔第7章高級(jí)查詢(xún)7.1CASE函數(shù)7.2子查詢(xún)7.3查詢(xún)結(jié)果的并、交、差運(yùn)算7.4其他一些查詢(xún)功能2/1317.1CASE函數(shù)是一種多分支函數(shù),可以根據(jù)條件列表的值返回多個(gè)可能結(jié)果中的一個(gè)。可用在任何允許使用表達(dá)式的地方。不是一個(gè)完整的T-SQL語(yǔ)句,不能單獨(dú)執(zhí)行。3/1311.簡(jiǎn)單CASE函數(shù)CASEinput_expressionWHENwhen_expressionTHENresult_expression[...n][ELSEelse_result_expression]4/131執(zhí)行過(guò)程計(jì)算input_expression,然后按從上到下的書(shū)寫(xiě)順序?qū)γ總€(gè)WHEN子句的input_expression=when_expression進(jìn)行計(jì)算。返回input_expression=when_expression的第一個(gè)計(jì)算結(jié)果為T(mén)RUE的result_expression。如果input_expression=when_expression的計(jì)算結(jié)果均不為

TRUE,則在指定了ELSE子句的情況下,則SQLServer返回else_result_expression;若沒(méi)有指定ELSE子句,則返回NULL。5/131示例例1查詢(xún)選了Java課程的學(xué)生的學(xué)號(hào)、姓名、所在系和成績(jī),并對(duì)所在系進(jìn)行如下處理:“計(jì)算機(jī)系”:顯示“CS”;“信息管理系”:顯示“IM”;“通信工程系”:顯示“COM”。SELECTs.Sno學(xué)號(hào),Sname姓名,

CASEDeptWHEN'計(jì)算機(jī)系'THEN'CS'WHEN'信息管理系'THEN'IM'WHEN'通信工程系'THEN'COM'ENDAS所在系,Grade成績(jī)

FROMStudentsjoinSCONs.Sno=SC.SnoJOINCoursecONc.Cno=SC.CnoWHERECname='JAVA'6/1312.搜索CASE函數(shù)CASEWHENBoolean_expressionTHENresult_expression[...n][ELSEelse_result_expression]END7/131執(zhí)行過(guò)程按從上到下的書(shū)寫(xiě)順序計(jì)算每個(gè)WHEN子句的Boolean_expression。返回第一個(gè)取值為T(mén)RUE的Boolean_expression所對(duì)應(yīng)的result_expression。如果Boolean_expression計(jì)算結(jié)果不為T(mén)RUE,則在指定ELSE子句的情況下返回else_result_expression;若沒(méi)有指定ELSE子句,則返回

NULL。8/131示例例1查詢(xún)可寫(xiě)為:

SELECTs.Sno學(xué)號(hào),Sname姓名,CASEWHENDept='計(jì)算機(jī)系'THEN'CS'WHENDept='信息管理系'THEN'IM'WHENDept='通信工程系'THEN'COM'ENDAS所在系,Grade成績(jī)FROMStudentsjoinSCONs.Sno=SC.SnoJOINCoursecONc.Cno=SC.CnoWHERECname='JAVA'9/1317.1.2CASE函數(shù)應(yīng)用示例例2.查詢(xún)“C001”課程的考試情況,列出學(xué)號(hào)和成績(jī),對(duì)成績(jī)進(jìn)行如下處理如果成績(jī)大于等于90,則在查詢(xún)結(jié)果中顯示“優(yōu)”;如果成績(jī)?cè)?0到89分之間,則在查詢(xún)結(jié)果中顯示“良”;如果成績(jī)?cè)?0到79分之間,則在查詢(xún)結(jié)果中顯示“中”;如果成績(jī)?cè)?0到69分之間,則在查詢(xún)結(jié)果中顯示“及格”;如果成績(jī)小于60分,則在查詢(xún)結(jié)果中顯示“不及格”。SELECTSno,CASEWHENGrade>=90THEN'優(yōu)'WHENGradebetween80and89THEN'良'WHENGradebetween70and79THEN'中'WHENGradebetween60and69THEN'及格'WHENGrade<60THEN'不及格'ENDAS成績(jī)FROMSCWHERECno='C001'10/131示例例3.統(tǒng)計(jì)每個(gè)學(xué)生的考試平均成績(jī),列出學(xué)號(hào)、考試平均成績(jī)和考試情況,其中考試情況的處理為:如果平均成績(jī)大于等于90,則考試情況為“好”;如果平均成績(jī)?cè)?0~89,則考試情況為“比較好”;如果平均成績(jī)?cè)?0~79,則考試情況為“一般”;如果平均成績(jī)?cè)?0~69,則考試情況為“不太好”;如果平均成績(jī)低于60,則考試情況為“比較差”。SELECTSno學(xué)號(hào),AVG(Grade)平均成績(jī),CASEWHENAVG(Grade)>=90THEN'好'WHENAVG(Grade)BETWEEN80AND89THEN'比較好'WHENAVG(Grade)BETWEEN70AND79THEN'一般'WHENAVG(Grade)BETWEEN60AND69THEN'不太好'WHENAVG(Grade)<60THEN'比較差'ENDAS考試情況FROMSCGROUPBYSno11/131示例例4.統(tǒng)計(jì)計(jì)算機(jī)系每個(gè)學(xué)生的選課門(mén)數(shù),包括沒(méi)有選課的學(xué)生。列出學(xué)號(hào)、選課門(mén)數(shù)和選課情況,其中對(duì)選課情況的處理為:如果選課門(mén)數(shù)超過(guò)4,則選課情況為“多”;如果選課門(mén)數(shù)在2~4,則選課情況為“一般”;如果選課門(mén)數(shù)少于2,則選課情況為“少”;如果學(xué)生沒(méi)有選課,則選課情況為“未選”。并將查詢(xún)結(jié)果按選課門(mén)數(shù)降序排序。SELECTS.Sno,COUNT(SC.Cno)選課門(mén)數(shù),CASEWHENCOUNT(SC.Cno)>4THEN'多'WHENCOUNT(SC.Cno)BETWEEN2AND4THEN'一般'WHENCOUNT(SC.Cno)BETWEEN1AND2THEN'少'WHENCOUNT(SC.Cno)=0THEN'未選'ENDAS選課情況FROMStudentSLEFTJOINSCONS.Sno=SC.Sno圖7-3例4的查詢(xún)結(jié)果WHEREDept='計(jì)算機(jī)系'

GROUPBYS.SnoORDERBYCOUNT(SC.Cno)DESC12/131示例例5.修改全體學(xué)生的JAVA考試成績(jī),修改規(guī)則如下:對(duì)通信工程系學(xué)生,成績(jī)加10分;對(duì)信息管理系學(xué)生,成績(jī)加5分;對(duì)其他系學(xué)生,成績(jī)不變。UPDATESCSETGrade=Grade+CASEDeptWHEN'通信工程系'THEN10WHEN'信息管理系'THEN5ELSE0ENDFROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHERECname='JAVA'13/1317.2子查詢(xún)7.2.1嵌套子查詢(xún)7.2.2相關(guān)子查詢(xún)7.2.3其他形式的子查詢(xún)14/1311.使用子查詢(xún)進(jìn)行基于集合的測(cè)試子查詢(xún)的結(jié)果往往是一個(gè)集合,IN就是在這個(gè)集合中進(jìn)行操作

SELECT<查詢(xún)列表>FROM……WHERE<列名>[NOT]IN(SELECT<列名>FROM……)注意:由子查詢(xún)返回的結(jié)果集中列的數(shù)據(jù)類(lèi)型以及語(yǔ)義必須與外層查詢(xún)中進(jìn)行比較的列的數(shù)據(jù)類(lèi)型及語(yǔ)義相同。15/131說(shuō)明FullSQL-92和SQL-99允許對(duì)由逗號(hào)分隔的表達(dá)式序列進(jìn)行針對(duì)子查詢(xún)成員的測(cè)試:WHERE(<列名1>[,…])IN(

SELECT<列名1>[,…]FROM…)但并不是所有的數(shù)據(jù)庫(kù)管理系統(tǒng)都支持這種形式的表達(dá)式,比如SQLServer就不支持,但ORACLE和DB2支持。16/131示例例1.查詢(xún)與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生。SELECTSno,Sname,DeptFROMStudentWHEREDeptIN(SELECTDeptFROMStudentWHERESname='劉晨')

ANDSname!='劉晨'①②17/131示例例61查詢(xún)考試成績(jī)大于90分的學(xué)生的學(xué)號(hào)和姓名。SELECTSno,SnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHEREGrade>90)SELECTSC.Sno,SnameFROMStudentJOINSCONStudent.Sno=SC.SnoWHEREGrade>90等價(jià)于18/131示例例3.查詢(xún)計(jì)算機(jī)系選了“C002”課程的學(xué)生,列出姓名和性別。

SELECTSname,SexFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECno='C002')ANDDept='計(jì)算機(jī)系'SELECTSname,SexFROMStudentSJOINSCONS.Sno=SC.SnoWHEREDept='計(jì)算機(jī)系'ANDCno='C002'等價(jià)于19/131示例例4.查詢(xún)選修了“Java”課程的學(xué)生的學(xué)號(hào)和姓名。SELECTSno,SnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECnoIN(SELECTCnoFROMCourseWHERECname=‘Java'))20/131示例例5.統(tǒng)計(jì)選了Java課程的這些學(xué)生的選課門(mén)數(shù)和平均成績(jī)。SELECTSno學(xué)號(hào),COUNT(*)選課門(mén)數(shù),AVG(Grade)平均成績(jī)FROMSCWHERESnoIN(SELECTSnoFROMSCJOINCourseCONC.Cno=SC.CnoWHERECname='Java')GROUPBYSno不能用連接形式實(shí)現(xiàn)21/131示例例6.查詢(xún)選了“JAVA”課程的學(xué)生學(xué)號(hào)、姓名和JAVA成績(jī)。SELECTStudent.Sno,Sname,GradeFROMStudentJOINSCONStudent.Sno=SC.SnoJOINCourseONCourse.Cno=SC.CnoWHERECname='Java'不能純用子查詢(xún)實(shí)現(xiàn)22/131示例例7.將計(jì)算機(jī)系全體學(xué)生的成績(jī)加5分。UPDATESCSETGrade=Grade+5WHERESnoIN(SELECTSnoFROMStudentWHEREDept='計(jì)算機(jī)系')23/131示例例8.刪除JAVA考試成績(jī)最低的學(xué)生的JAVA修課記錄。DELETEFROMSCWHERESnoIN--查詢(xún)JAVA成績(jī)最低學(xué)生(SELECTTOP1WITHTIESSnoFROMSCJOINCourseCONC.Cno=SC.CnoWHERECname='JAVA'ORDERBYGradeASC)ANDCnoIN(SELECTCnoFROMCourseWHERECname='JAVA')24/1312.使用比較測(cè)試的嵌套子查詢(xún)通過(guò)比較運(yùn)算符,將一個(gè)表達(dá)式的值與子查詢(xún)返回的值進(jìn)行比較。SELECT<查詢(xún)列表>FROM……WHERE<列名>比較運(yùn)算符(SELECT<列名>FROM……)要求子查詢(xún)語(yǔ)句必須是返回單值的查詢(xún)語(yǔ)句。25/131示例例9.查詢(xún)選了“C004”號(hào)課程且成績(jī)高于此課程的平均成績(jī)的學(xué)生的學(xué)號(hào)和成績(jī)。SELECTSno,GradeFROMSCWHERECno='C004'ANDGrade>(SELECTAVG(Grade)FROMSCWHERECno='C004')26/131示例例10.查詢(xún)第2學(xué)期開(kāi)設(shè)的學(xué)分最高的課程的課程名和學(xué)分。SELECTCname,CreditFROMCourseWHERESemester=2ANDCredit=(SELECTMAX(Credit)FROMCourseWHERESemester=2)27/131示例例11.查詢(xún)考試平均成績(jī)高于全體學(xué)生的總平均成績(jī)的學(xué)生的學(xué)號(hào)和平均成績(jī)。SELECTSno,AVG(Grade)平均成績(jī)FROMSCGROUPBYSnoHAVINGAVG(Grade)>(SELECTAVG(Grade)FROMSC)28/131示例例12.查詢(xún)沒(méi)選“C001”號(hào)課程的學(xué)生姓名和所在系。SELECTSname,DeptFROMStudentWHERESnoNOTIN(SELECTSnoFROMSCWHERECno='C001')注意:不能用連接查詢(xún)和在子查詢(xún)中否定的形式實(shí)現(xiàn)。29/131示例例13.查詢(xún)計(jì)算機(jī)系沒(méi)選JAVA課程的學(xué)生姓名和性別。SELECTSname,SexFROMStudentWHERESnoNOTIN(SELECTSnoFROMSCJOINCourseONSC.Cno=Course.CnoWHERECname='JAVA')ANDDept='計(jì)算機(jī)系'30/131示例例14.將學(xué)分最低的課程的學(xué)分加2分。UPDATECourseSETCredit=Credit+2WHERECredit=(SELECTMIN(Credit)FROMCourse)31/1313.使用SOME和ALL的嵌套子查詢(xún)當(dāng)子查詢(xún)返回單值時(shí),可以使用比較運(yùn)算符進(jìn)行比較,但當(dāng)返回多值時(shí),就需要通過(guò)SOME(或ANY。ANY是與SOME等效的ISO標(biāo)準(zhǔn),但現(xiàn)在一般都使用SOME,而不使用ANY。WHERE<列名>比較運(yùn)算符

[SOME|ALL](子查詢(xún))32/131ANY、SOME和ALL謂詞的語(yǔ)義表達(dá)方法含義>ANY(或>=ANY),>SOME(或>=SOME)大于(或等于)子查詢(xún)結(jié)果中的某個(gè)值>ALL或>=ALL大于(或等于)子查詢(xún)結(jié)果中的所有值<ANY(或<=ANY)<SOME(或<=SOME)小于(或等于)子查詢(xún)結(jié)果中的某個(gè)值<ALL(或<=ALL)小于(或等于)子查詢(xún)結(jié)果中的所有值=ANY,=SOME等于子查詢(xún)結(jié)果中的某個(gè)值=ALL等于子查詢(xún)結(jié)果中的所有值!=ANY(或<>ANY)!=SOME(或<>SOME)不等于子查詢(xún)結(jié)果中的某個(gè)值!=ALL(或<>ALL)不等于子查詢(xún)結(jié)果中的任何一個(gè)值33/131示例例15.查詢(xún)其他學(xué)期開(kāi)設(shè)的課程中比第1學(xué)期開(kāi)設(shè)課程的學(xué)分少的課程名、開(kāi)課學(xué)期和學(xué)分。SELECTCname,Semester,CreditFROMCourseWHERECredit<SOME(SELECTCreditFROMCourseWHERESemester=1)ANDSemester!=1等價(jià)于:SELECTCname,Semester,CreditFROMCourseWHERECredit<(SELECTMAX(Credit)FROMCourseWHERESemester=1)ANDSemester!=134/131示例例16.查詢(xún)至少有一次成績(jī)大于等于90的學(xué)生的姓名,所修的課程號(hào)和成績(jī)。SELECTSname,Cno,GradeFROMStudentSJOINSCONS.Sno=SC.SnoWHERES.Sno=SOME( SELECTSnoFROMSCWHEREGrade>=90)等價(jià)于:SELECTSname,Cno,GradeFROMStudentSJOINSCONS.Sno=SC.Sno WHERES.SnoIN( SELECTSnoFROMSCWHEREGrade>=90)35/131示例例17.查詢(xún)比第1學(xué)期開(kāi)設(shè)的所有課程的學(xué)分都小的其他學(xué)期開(kāi)設(shè)的課程名、開(kāi)課學(xué)期和學(xué)分。SELECTCname,Semester,CreditFROMCourseWHERECredit<ALL(SELECTCreditFROMCourseWHERESemester=1)ANDSemester!=1等價(jià)于SELECTCname,Semester,CreditFROMCourseWHERECredit<( SELECTMIN(Credit)FROMCourseWHERESemester=1)ANDSemester!=136/131等價(jià)運(yùn)算=SOME(子查詢(xún))IN(子查詢(xún))>=SOME(子查詢(xún))>=(SELECTMIN(列名)FROM…)<=SOME(子查詢(xún))<=(SELECTMAX(列名)FROM…)<=ALL(子查詢(xún))<=(SELECTMIN(列名)FROM…)<>ALL(子查詢(xún))NOTIN(子查詢(xún))>=ALL(子查詢(xún))>=(SELECTMAX(列名)FROM…)37/1317.2.2相關(guān)子查詢(xún)?cè)跅l件子句中的相關(guān)子查詢(xún)?cè)赟ELECT列表中的相關(guān)子查詢(xún)EXISTS形式的子查詢(xún)38/131基本概念相關(guān)子查詢(xún)與嵌套子查詢(xún)的不同之處在于信息傳遞是雙方向的。在相關(guān)子查詢(xún)中,內(nèi)層查詢(xún)利用外層查詢(xún)提供的信息執(zhí)行,然后將內(nèi)層查詢(xún)的結(jié)果返回給外層查詢(xún),外層查詢(xún)?cè)倮眠@個(gè)結(jié)果判斷當(dāng)前數(shù)據(jù)是否是滿(mǎn)足要求的數(shù)據(jù)。39/1311在條件子句中的相關(guān)子查詢(xún)相關(guān)子查詢(xún)也可以寫(xiě)在WHERE子句中,或者是HAVING子句中。它可以通過(guò)IN、比較運(yùn)算符和EXISTS關(guān)鍵詞與外層查詢(xún)關(guān)聯(lián)。40/131使用IN運(yùn)算符的相關(guān)子查詢(xún)例18.查詢(xún)每個(gè)學(xué)期學(xué)分最低的課程的課程名、開(kāi)課學(xué)期和學(xué)分。SELECTCname,Semester,CreditFROMCoursec1WHERECreditIN(

SELECTMIN(Credit)FROMCoursec2WHEREc1.Semester=c2.Semester)41/131示例例19.查詢(xún)每門(mén)課程考試成績(jī)最高的兩個(gè)學(xué)生的學(xué)號(hào)以及相應(yīng)的課程號(hào)和成績(jī)。不包括沒(méi)考試的課程。

SELECTSno,Cno,GradeFROMSCSC1WHERESnoIN(

SELECTTOP2WITHTIESSnoFROMSCSC2WHERESC1.Cno=SC2.CnoORDERBYGradedesc)ANDGradeISNOTNULLORDERBYCnoASC,GradeDESC42/131使用比較運(yùn)算符的相關(guān)子查詢(xún)例20.查詢(xún)每門(mén)課程中,考試成績(jī)低于該門(mén)課程的平均成績(jī)的學(xué)生的學(xué)號(hào)和成績(jī)。SELECTCno,Sno,GradeFROMSCSC1WHEREGrade<(

SELECTAVG(Grade)FROMSCSC2WHERESC1.Cno=SC2.Cno)43/131HAVING子句中的相關(guān)子查詢(xún)例21.查詢(xún)有最高學(xué)分超過(guò)本學(xué)期平均學(xué)分1.5倍的學(xué)期。SELECTSemesterFROMCoursec1GROUPBYSemesterHAVINGMAX(Credit)>=ALL(SELECT1.5*AVG(Credit)FROMCoursec2WHEREc1.Semester=c2.Semester)44/1312在SELECT列表中的相關(guān)子查詢(xún)子查詢(xún)也可以用在SELECT語(yǔ)句的查詢(xún)列表中。當(dāng)所要查詢(xún)的信息與查詢(xún)中的其他信息完全不同時(shí),經(jīng)常使用這種形式的子查詢(xún)。比如,需要一個(gè)字段的聚合結(jié)果,但又不希望這個(gè)結(jié)果影響其他的字段。45/131示例例22.查詢(xún)學(xué)生姓名、所在系和該學(xué)生選的課程門(mén)數(shù)。SELECTSname,Dept,(SELECTCOUNT(*)FROMSCWHERESno=Student.Sno)ASCountCnoFROMStudent46/131示例例23.查詢(xún)課程名、開(kāi)課學(xué)期及選該門(mén)課的學(xué)生人數(shù)、平均成績(jī)。不包括沒(méi)人選的課程。SELECTCnameAS課程名,emesterAS開(kāi)課學(xué)期,(SELECTCOUNT(*)FROMSCWHERECno=Course.Cno)AS選課人數(shù),

(SELECTAVG(Grade)FROMSCWHERECno=Course.Cno)AS平均成績(jī)FROMCourseWHERECnoIN(SELECTCnoFROMSC)47/1313.EXISTS形式的子查詢(xún)EXISTS代表存在量詞?。WHERE[NOT]EXISTS(子查詢(xún))不返回查詢(xún)的數(shù)據(jù),只產(chǎn)生邏輯真值和假值。EXISTS:當(dāng)子查詢(xún)中有滿(mǎn)足條件的數(shù)據(jù)時(shí),返回真值,否則返回假值。NOTEXISTS:當(dāng)子查詢(xún)中有滿(mǎn)足條件的數(shù)據(jù)時(shí),返回假值;否則返回真值。48/131例24.查詢(xún)選了“C002”課程的學(xué)生姓名。SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno='C002')49/131注意帶EXISTS謂詞的查詢(xún)是先外后內(nèi),即先執(zhí)行外層查詢(xún),再執(zhí)行內(nèi)層查詢(xún)。外層查詢(xún)的值決定內(nèi)層查詢(xún)的結(jié)果;內(nèi)層查詢(xún)的執(zhí)行次數(shù)由外層查詢(xún)的結(jié)果決定。由于EXISTS的子查詢(xún)只返回真、假值,因此在子查詢(xún)中指定列名沒(méi)有意義,通常都用“*”50/131例24執(zhí)行順序①無(wú)條件執(zhí)行外層查詢(xún)語(yǔ)句,在外層查詢(xún)的結(jié)果集中取第一行結(jié)果,得到Sno的一個(gè)當(dāng)前值。②將外層的Sno值作為已知值執(zhí)行內(nèi)層查詢(xún),如果在內(nèi)層查詢(xún)中有滿(mǎn)足WHERE條件的記錄,則EXISTS返回True,如果沒(méi)有,則返回False,表示在外層查詢(xún)結(jié)果集中的當(dāng)前行數(shù)據(jù)不是滿(mǎn)足要求的結(jié)果。③順序處理外層Student表的第2、3、…行數(shù)據(jù),直到處理完所有行。51/131示例例25.查詢(xún)選了JAVA課程的學(xué)生姓名和所在系。SELECTSname,DeptFROMStudentWHEREEXISTS(SELECT*FROMSCWHEREEXISTS(SELECT*FROMCourseWHERECno=SC.CnoANDCname='JAVA')ANDSno=Student.Sno)52/131示例例26.查詢(xún)沒(méi)有選修“C001”課程的學(xué)生姓名和所在系。SELECTSname,DeptFROMStudentWHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno='C001')53/131示例例27.查詢(xún)計(jì)算機(jī)系沒(méi)選JAVA的學(xué)生姓名和性別。SELECTSname,SexFROMStudentWHEREDept=‘計(jì)算機(jī)系’

ANDNOTEXISTS(

SELECT*FROMSCJOINCourseCONC.Cno=SC.CnoWHERESno=Student.SnoANDCname='JAVA')54/131示例例28.查詢(xún)至少選了全部課程的學(xué)生的學(xué)號(hào)、姓名和所在系。該查詢(xún)的關(guān)系代數(shù)表達(dá)式為:

∏Sno,Sname,Sdept((Student)∞(∏SNO,CNO(SC)÷∏cno(ourse)))SQL語(yǔ)言中沒(méi)有提供除運(yùn)算,而且,除運(yùn)算也不能用如<ALL、<=ALL、=ALL等量化的謂詞形式構(gòu)造。55分析首先從這樣的問(wèn)題開(kāi)始:如何證明或反駁所有的課程都被某個(gè)范圍變量s所指定的行上的特定學(xué)生s.sno選了?顯然,可以通過(guò)找出反例來(lái)反駁,即有一門(mén)課程是s.sno沒(méi)有選的,如果把該課程命名為o,則可以將反例表示成SQL搜索條件:Cond1:notexists(select*fromscxwhereo=oandx.sno=s.sno)不存在該學(xué)生沒(méi)選的課程56分析(續(xù))現(xiàn)在證明所有課程都被s.sno所代表的學(xué)生選了需要構(gòu)造保證剛才所舉的那種反例不存在的條件。也就是要確保沒(méi)有課程o能使Cond1為真。該條件也可以被表示成搜索條件:Cond2:notexists(select*fromcoursecwherenotexists(select*fromscxwherex.o=oandx.sno=s.sno))不存在這樣一個(gè)課程o,它沒(méi)有被s.sno選57最終語(yǔ)句最后,檢索滿(mǎn)足Cond2條件的sno:

Selects.snofromstudentsswhereCond2完整的語(yǔ)句:SELECTs.Sno,Sname,SdeptFROMStudentsWHERENOTEXISTS(SELECT*FROMCoursecWHERENOTEXISTS(SELECT*FROMSCx WHEREx.Cno=c.Cnoandx.Sno=s.Sno))58總結(jié)如果查詢(xún)要求檢索的對(duì)象集合是必須符合某個(gè)帶有“所有”這類(lèi)關(guān)鍵詞的條件,可按如下步驟執(zhí)行:(1)為要檢索的對(duì)象命名并用文字表述要檢索的候選對(duì)象的一個(gè)反例。在反例中,在前面提到的“所有”對(duì)象中至少有一個(gè)對(duì)象不符合規(guī)定的條件。(2)建立SELECT語(yǔ)句的搜索條件以表達(dá)步驟1所創(chuàng)建的反例。(3)建立包含步驟2所創(chuàng)建的語(yǔ)句的搜索條件,說(shuō)明不存在上面定義的那種反例。(4)用步驟3的搜索條件來(lái)建立最終的SELECT語(yǔ)句59示例例29.查詢(xún)至少選了“0811102”學(xué)生所選的全部課程的學(xué)生的學(xué)號(hào)和所選的課程號(hào)(1)構(gòu)造反例:有一個(gè)“0811102”學(xué)生選的課程是?.sno沒(méi)有選的。

我們把該學(xué)生命名為?.sno(這里的“?”表示表并不固定是Student表還是SC表,以保持范圍變量的靈活性)。60示例(續(xù))(2)將步驟1構(gòu)造的反例表達(dá)為搜索條件Cond1:s.sno='0811102'andnotexists(select*fromscxwhereo=oandx.sno=?.sno)61示例(續(xù))(3)建立表示這類(lèi)反例不存在的搜索條件:Cond2:notexists(Select*fromscxwheres.sno='0811102'andnotexists(select*fromscywhereo=oandy.sno=?.sno)62示例(續(xù))(4)建立完整的SELECT語(yǔ)句SELECTSno,CnoFROMSCs1WHERENOTEXISTS(SELECT*FROMSCxWHERESno='0811102'andNOTEXISTS(select*fromSCywherey.Cno=x.Cnoandy.Sno=s1.Sno))andSno!='0811102'去掉0811102本人637.2.3其他形式的子查詢(xún)1.替代表達(dá)式的子查詢(xún)2.派生表64/1311.替代表達(dá)式的子查詢(xún)指在SELECT的選擇列表中,嵌入一個(gè)只返回一個(gè)標(biāo)量值的SELECT語(yǔ)句,這個(gè)查詢(xún)語(yǔ)句通常都是一個(gè)聚合函數(shù)。例30.查詢(xún)選了C001課程的學(xué)生學(xué)號(hào)、考試成績(jī)以及該門(mén)課程的平均成績(jī)。SELECTSno,Grade,(SELECTAVG(Grade)FROMSCWHERECno='C001')ASAvgGradeFROMSCWHERECno='C001'65/131示例例31.查詢(xún)選了C001課程的學(xué)生學(xué)號(hào)、考試成績(jī)、該門(mén)課程的平均成績(jī)以及每個(gè)學(xué)生與平均成績(jī)的差。SELECTSno,Grade,(SELECTAVG(Grade)FROMSCWHERECno='C001')ASAvgGrade,

Grade-(SELECTAVG(Grade)

FROMSCWHERECno='C001')ASAvgGradeDiffFROMSC66/1312.派生表有時(shí)也稱(chēng)為內(nèi)聯(lián)視圖,是將子查詢(xún)做為一個(gè)表來(lái)處理,這個(gè)由子查詢(xún)產(chǎn)生的新表就稱(chēng)之為“派生表”,這很類(lèi)似于臨時(shí)表。可以在查詢(xún)語(yǔ)句中用派生表來(lái)建立與其它表的連接關(guān)系,在生成派生表后,在查詢(xún)語(yǔ)句中對(duì)派生表的操作與普通表一樣。67/131示例例32.查詢(xún)至少選了C001和C002兩門(mén)課程的學(xué)生學(xué)號(hào)。SELECTT1.SnoFROM(SELECT*FROMSCWHERECno='C001')AST1JOIN(SELECT*FROMSCWHERECno='c002')AST2ONT1.Sno=T2.Sno68/131示例例33.查詢(xún)至少選了C001和C002兩門(mén)課程的學(xué)生的姓名、所在系、所選的課程號(hào)和課程名。SELECTSname,Dept,C.Cno,CnameFROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHERES.SnoIN(SELECTT1.SnoFROM(SELECT*FROMSCWHERECno='C001')AST1JOIN(SELECT*FROMSCWHERECno='c002')T2ONT1.Sno=T2.Sno)69/1317.3查詢(xún)結(jié)果的并、交、差運(yùn)算SELECT語(yǔ)句的查詢(xún)結(jié)果是元組的集合,所以多個(gè)SELECT語(yǔ)句的結(jié)果可進(jìn)行集合操作。集合操作主要包括:UNION(并)、INSTERSECT(交)EXCEPT(差)70/7670/1317.3.1并運(yùn)算并運(yùn)算可將兩個(gè)或多個(gè)查詢(xún)語(yǔ)句的結(jié)果集合并為一個(gè)結(jié)果集,這個(gè)運(yùn)算可以使用

UNION運(yùn)算符實(shí)現(xiàn)。UNION是一個(gè)特殊的運(yùn)算符,通過(guò)它可以實(shí)現(xiàn)讓兩個(gè)或更多的查詢(xún)產(chǎn)生單一的結(jié)果集。71/7671/131并操作示例72/7672/131UNION語(yǔ)法格式SELECT語(yǔ)句1UNION[ALL]SELECT語(yǔ)句2UNION[ALL]……SELECT語(yǔ)句nALL表示在結(jié)果集中包含所有查詢(xún)語(yǔ)句產(chǎn)生的全部記錄,包括重復(fù)的記錄。如果沒(méi)有指定ALL,則系統(tǒng)默認(rèn)是刪除合并后結(jié)果集中的重復(fù)記錄。73/7673/131一些說(shuō)明所有的SELECT語(yǔ)句列表中列的個(gè)數(shù)必須相同,而且對(duì)應(yīng)列的語(yǔ)義應(yīng)該相同。各SELECT語(yǔ)句中每個(gè)列的數(shù)據(jù)類(lèi)型必須兼容。合并后的結(jié)果采用第一個(gè)SELECT語(yǔ)句的列標(biāo)題。如果要對(duì)查詢(xún)的結(jié)果進(jìn)行排序,則ORDERBY子句寫(xiě)在最后一個(gè)查詢(xún)語(yǔ)句之后。74/7674/131示例例1將對(duì)計(jì)算機(jī)系學(xué)生的查詢(xún)結(jié)果與信息管理系學(xué)生的查詢(xún)結(jié)果合并為一個(gè)結(jié)果集。SELECTSno,Sname,Sage,DeptFROMStudentWHEREDept='計(jì)算機(jī)系系'UNIONSELECTSno,Sname,Sage,DeptFROMStudentWHEREDept='信息管理系'75/7675/131示例例2查詢(xún)要求同例1,但將查詢(xún)結(jié)果按年齡從小到大的順序進(jìn)行排序,并將結(jié)果列名按中文顯示SELECTSno學(xué)號(hào),Sname姓名,Sage年齡,Dept所在系FROMStudentWHEREDept='計(jì)算機(jī)系'UNIONSELECTSno,Sname,Sage,DeptFROMStudentWHEREDept='信息管理系'ORDERBYSageASC76/7676/131示例UNION操作一般用在要從不同的表中查詢(xún)語(yǔ)義相同的列,并合并查詢(xún)結(jié)果的情況。設(shè)有作者表(authors)和出版商表(publishers),其中都有城市(city)列。查詢(xún)作者和出版商所在的全部城市。SELECTcityas城市FROMauthorsUNION

SELECTcityFROMpublishers77/7677/1317.3.2交運(yùn)算返回同時(shí)在兩個(gè)集合中出現(xiàn)的記錄。其語(yǔ)法格式為:SELECT語(yǔ)句1INTERSECTSELECT語(yǔ)句2INTERSECT

……SELECT語(yǔ)句n78/7678/131示例例3查詢(xún)同時(shí)出現(xiàn)在t1表和t2表中的記錄。SELECT*fromt1INTERSECTSELECT*fromt279/7679/131示例例4查詢(xún)同時(shí)出現(xiàn)在t1、t2和t3表的記錄。SELECT*fromt1INTERSECTSELECT*fromt2INTERSECTSELECT*fromt380/7680/131示例例5查詢(xún)李勇和劉晨所選的相同課程,列出課程名和學(xué)分。(即同時(shí)被李勇和劉晨選的課程)SELECTCname,CreditFROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHERESname='李勇'INTERSECTSELECTCname,CreditFROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHERESname='劉晨'81/7681/131例5另一種實(shí)現(xiàn)方法SELECTCname,CreditFROMCourseWHERECnoIN(--李勇選的課程SELECTCnoFROMSCJOINStudentSONS.Sno=SC.SnoWHERESname='李勇')ANDCnoIN(--劉晨選的課程SELECTCnoFROMSCJOINStudentSONS.Sno=SC.SnoWHERESname='劉晨')82/7682/1317.3.3差運(yùn)算SELECT語(yǔ)句1EXCEPTSELECT語(yǔ)句2EXCEPT……SELECT語(yǔ)句n83/7683/131示例例6查詢(xún)?cè)趖1表中有但在t2表中沒(méi)有的記錄。SELECT*fromt1EXCEPTSELECT*fromt284/7684/131示例例7查詢(xún)李勇選了但劉晨沒(méi)有選的課程的課程名和開(kāi)課學(xué)期。SELECTC.Cno,Cname,SemesterFROMCourseCJOINSCONC.Cno=SC.CnoJOINStudentSONS.Sno=SC.Sno

WHERESname='李勇'EXCEPTSELECTC.Cno,Cname,SemesterFROMCourseCJOINSCONC.Cno=SC.CnoJOINStudentSONS.Sno=SC.SnoWHERESname='劉晨'85/7685/131例7的另一種實(shí)現(xiàn)方式SELECTC.Cno,Cname,SemesterFROMCourseCJOINSCONC.Cno=SC.CnoJOINStudentSONS.Sno=SC.SnoWHERESname='李勇'ANDC.CnoNOTIN( SELECTC.CnoFROMCourseC JOINSCONC.Cno=SC.Cno JOINStudentSONS.Sno=SC.Sno WHERESname='劉晨')86/7686/1317.4其他一些查詢(xún)功能7.4.1開(kāi)窗函數(shù)7.4.2公用表表達(dá)式7.4.3Merge語(yǔ)句87/1317.4.1開(kāi)窗函數(shù)在SQLServer中,一組行被稱(chēng)為一個(gè)窗口,開(kāi)窗函數(shù)是指可以用于“分區(qū)”或“分組”計(jì)算的函數(shù)。這些函數(shù)結(jié)合OVER子句對(duì)組內(nèi)的數(shù)據(jù)進(jìn)行編號(hào),并進(jìn)行求和、計(jì)算平均值等統(tǒng)計(jì)因此,從這個(gè)角度來(lái)說(shuō),ROW_NUMBER(對(duì)數(shù)據(jù)進(jìn)行編號(hào)的函數(shù))、SUM、AVG等都可以稱(chēng)為開(kāi)窗函數(shù)。88/1311.將OVER子句與聚合函數(shù)結(jié)合使用OVER子句用于確定在應(yīng)用關(guān)聯(lián)的開(kāi)窗函數(shù)之前,對(duì)行集的分區(qū)和排序。<OVER_CLAUSE>::=OVER([PARTITIONBYvalue_expression,...[n]])PARTITIONBY:將結(jié)果集劃分為多個(gè)分區(qū)。value_expression:指定對(duì)行集進(jìn)行分區(qū)所依據(jù)的列。89/131示例例1查詢(xún)課程號(hào)、課程名、開(kāi)課學(xué)期、學(xué)分以及該學(xué)期開(kāi)設(shè)課程的總學(xué)分、平均學(xué)分、最低學(xué)分和最高學(xué)分。SELECTCno,Cname,Semester,Credit,SUM(Credit)OVER(PARTITIONBYSemester)AS'Total',AVG(Credit)OVER(PARTITIONBYSemester)AS'Avg',MIN(Credit)OVER(PARTITIONBYSemester)AS'Min',MAX(Credit)OVER(PARTITIONBYSemester)AS'Max'FROMCourse90/131示例例2

設(shè)有表:CREATETABLEMyOrderDetail(OrderIDintNOTNULL,--訂單號(hào)ProductIDintNOTNULL,--產(chǎn)品號(hào)OrderQtysmallintNOTNULL--訂購(gòu)數(shù)量)91/131例2(續(xù)):查詢(xún)要求圖示總計(jì):為每個(gè)訂單的總訂購(gòu)數(shù)量;百分比:為每個(gè)產(chǎn)品的訂購(gòu)數(shù)量占該訂單總訂購(gòu)數(shù)量的百分比。92/131例2(續(xù))查詢(xún)訂單號(hào)、產(chǎn)品號(hào)、訂購(gòu)數(shù)量、每個(gè)訂單的總訂購(gòu)數(shù)量以及每個(gè)產(chǎn)品的訂購(gòu)數(shù)量占該訂單總訂購(gòu)數(shù)量的百分比。(MySimpleDB)SELECTOrderID訂單號(hào),ProductID產(chǎn)品號(hào),

OrderQty訂購(gòu)數(shù)量,SUM(OrderQty)OVER(PARTITIONBYOrderID)總計(jì),CAST(1.0*OrderQty/SUM(OrderQty)OVER(PARTITIONBYOrderID)*100ASDECIMAL(5,2))AS所占百分比FROMMyOrderDetail93/131排名函數(shù)排名函數(shù)為分區(qū)中的每一行返回一個(gè)排名值。根據(jù)所用函數(shù)的不同,某些行可能與其他行具有相同的排名值。SQLServer提供了4個(gè)排名函數(shù):RANKNTILEDENSE_RANKROW_NUMBER94/131RANK()函數(shù)RANK()

OVER([<partition_by_clause>,…[n]]<order_by_clause>)<partition_by_clause>:將FROM子句生成的結(jié)果集劃分成排名函數(shù)適用的分區(qū)。<order_by_clause>:指定應(yīng)用于分區(qū)中的行時(shí)所基于的排序依據(jù)列。RANK()函數(shù)返回結(jié)果集的分區(qū)內(nèi)每行的排名。每個(gè)分區(qū)內(nèi)行的排名從1開(kāi)始。95/131例3查詢(xún)要求圖示查詢(xún)訂單號(hào)、產(chǎn)品號(hào)、訂購(gòu)數(shù)量以及每個(gè)產(chǎn)品在每個(gè)訂單中的訂購(gòu)數(shù)量排名。96/131例3(續(xù))查詢(xún)訂單號(hào)、產(chǎn)品號(hào)、訂購(gòu)數(shù)量以及每個(gè)產(chǎn)品在每個(gè)訂單中的訂購(gòu)數(shù)量排名。(MySimpleDB)SELECTOrderID,ProductID,OrderQty,RANK()OVER(PARTITIONBYOrderIDORDERBYOrderQtyDESC)ASRANKFROMMyOrderDetailORDERBYOrderID97/131DENSE_RANK()函數(shù)DENSE_RANK()函數(shù)與RANK()函數(shù)的作用基本一樣,使用方法也一樣,唯一區(qū)別是DENSE_RANK()函數(shù)的排名中間沒(méi)有任何間斷,即該函數(shù)將返回的是一個(gè)連續(xù)的整數(shù)值。98/131例4用DENSE_RANK()函數(shù)實(shí)現(xiàn)例3。

SELECTOrderID,ProductID,OrderQty,DENSE_RANK()OVER(PARTITIONBYOrderIDORDERBYOrderQtyDESC)ASDENSE_RANKFROMOrderDetailORDERBYOrderID99/131100/131NTILE()函數(shù)是將有序分區(qū)中的行劃分到指定數(shù)目的組中,每個(gè)組有一個(gè)編號(hào),編號(hào)從1開(kāi)始。對(duì)每一個(gè)行,NTILE()函數(shù)返回此行所屬的組的編號(hào)。NTILE(integer_expression)OVER([<partition_by_clause>]<order_by_clause>)101/131示例例5查詢(xún)訂單號(hào)、產(chǎn)品號(hào)、訂購(gòu)數(shù)量,將數(shù)據(jù)按訂購(gòu)數(shù)量降序排序,并將數(shù)據(jù)劃分到4個(gè)組中。(MySimpleDB,MyOrderDetail)SELECTOrderID,ProductID,OrderQty,NTILE(4)OVER(ORDERBYOrderQtyDESC)ASFourGroupsFROMMyOrderDetail102/131例5結(jié)果圖示由于表中有10行數(shù)據(jù),要分為4組,不能整除,因此第一、二組每組包含3行數(shù)據(jù),第三、四組每組包含2行數(shù)據(jù)。103/131示例例6改進(jìn)例5的查詢(xún)。將每個(gè)訂單中的數(shù)據(jù)按訂購(gòu)數(shù)量降序排序,并將每個(gè)訂單的數(shù)據(jù)劃分到3個(gè)組中。SELECTOrderID,ProductID,OrderQty,NTILE(3)OVER(PARTITIONBYOrderIDORDERBYOrderQtyDESC)ASThreeGroupsFROMMyOrderDetail104/131例6結(jié)果圖示105/131ROW_NUMBER()函數(shù)返回結(jié)果集分區(qū)內(nèi)行的序列號(hào),每個(gè)分區(qū)的第一行從1開(kāi)始。ROW_NUMBER()OVER([<partition_by_clause>]<order_by_clause>)與Rank()函數(shù)的區(qū)別是生成的序列號(hào)不重復(fù)。106/131示例例7查詢(xún)“計(jì)算機(jī)文化學(xué)”的考試情況,列出學(xué)號(hào)、姓名、所在系、考試成績(jī)及成績(jī)排名。SELECTS.Sno,Sname,Dept,Grade,ROW_NUMBER()OVER(ORDERBYGradeDESC)AS'Number'FROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHEREC.Cname='計(jì)算機(jī)文化學(xué)'107/131示例例8改進(jìn)例7查詢(xún)。查詢(xún)“計(jì)算機(jī)文化學(xué)”的考試情況,列出學(xué)號(hào)、姓名、所在系、考試成績(jī)及每個(gè)學(xué)生在每個(gè)系中的成績(jī)排名。SELECTS.Sno,Sname,Dept,Grade,ROW_NUMBER()OVER(PARTITIONBYDeptORDERBYGradeDESC)AS'Dept_Number'FROMStudentSJOINSCONS.Sno=SC.SnoJOINCourseCONC.Cno=SC.CnoWHEREC.Cname='計(jì)算機(jī)文化學(xué)'108/131例7、例8結(jié)果圖示例7結(jié)果例8結(jié)果109/1317.4.2公用表表達(dá)式公用表表達(dá)式(CTE,CommonTableExpression)是SQLServer2005版本之后引入的一個(gè)新特性。將查詢(xún)語(yǔ)句產(chǎn)生的結(jié)果集指定一個(gè)臨時(shí)命名的名字,這些命名的結(jié)果集就稱(chēng)為公用表表達(dá)式。命名好公用表表達(dá)式后就可以在SELECT、INSERT、UPDATE、DELETE等語(yǔ)句中被多次引用。公用表表達(dá)式還可以包括對(duì)自身的引用,這種表達(dá)式稱(chēng)為遞歸公用表表達(dá)式。110/131公用表表達(dá)式的語(yǔ)法格式WITH<common_table_expression>[,...n]<common_table_expression>::=expression_name[(column_name[,...n])]AS(SELECT語(yǔ)句

)111/131示例例9定義一個(gè)統(tǒng)計(jì)每門(mén)課程的選課人數(shù)的簡(jiǎn)單CTE,并利用該CTE查詢(xún)課程號(hào)和選課人數(shù)。WITHCnoCount(Cno,Counts)AS(SELECTCno,COUNT(*)FROMSCGROUPBYCno)SELECTCno,CountsFROMCnoCountORDERBYCounts112/131例10使用公用表表達(dá)式來(lái)限制返回結(jié)果。改進(jìn)例9的查詢(xún),定義一個(gè)統(tǒng)計(jì)每門(mén)課程的選課人數(shù)的CTE,并利用該CTE查詢(xún)選課人數(shù)超過(guò)2人的課程。WITHCnoCount(Cno,Counts)AS(SELECTCno,COUNT(*)FROMSC

GROUPBYCno)SELECTCno,CountsFROMCnoCountWHERECounts>2ORDERBYCounts113/131Employees表及數(shù)據(jù)示例114/131示例首先建立兩個(gè)包含職工全部信息的CTE,然后利用這兩個(gè)CTE查詢(xún)每個(gè)職工信息及上級(jí)領(lǐng)導(dǎo)信息。WITHEmp1AS(SELECT*FROMEmployees),

Emp2AS(SELECT*FROMEmployees)SELECT*FROMEmp1JOINEmp2

ONEmp1.ManagerID=Emp2.EmployeeID115/131查詢(xún)結(jié)果圖示116/131遞歸CTE:包含三部分內(nèi)容例程的調(diào)用。遞歸CTE的第一個(gè)調(diào)用包括一個(gè)或多個(gè)由UNIONALL、UNION、EXCEPT或INTERSECT運(yùn)算符聯(lián)接的CTE查詢(xún)定義,這些查詢(xún)定義形成了CTE結(jié)構(gòu)的基準(zhǔn)結(jié)果集,因此被稱(chēng)為“定位點(diǎn)成員”。所有定位點(diǎn)成員查詢(xún)定義必須放置在第一個(gè)遞歸成員定義之前,而且必須使用UNIONALL運(yùn)算符聯(lián)接最后一個(gè)定位點(diǎn)成員和第一個(gè)遞歸成員。例程的遞歸調(diào)用。遞歸調(diào)用包括一個(gè)或多個(gè)由引用CTE本身的UNIONALL運(yùn)算符聯(lián)接的CTE查詢(xún)定義。這些查詢(xún)定義被稱(chēng)為“遞歸成員”。終止檢查。終止檢查是隱式的;當(dāng)上一個(gè)調(diào)用中未返回行時(shí),遞歸將停止。117/131簡(jiǎn)單遞歸CTE偽代碼WITHcte_name(column_name[,...n])AS(CTE_query_definition--定義定位點(diǎn)成員UNIONALLCTE_query_definition--定義引用cte_name的遞歸成員)SELECT*FROMcte_name--使用CTE的語(yǔ)句118/131示例例12顯示上級(jí)領(lǐng)導(dǎo)職工號(hào)、領(lǐng)導(dǎo)職務(wù)、領(lǐng)導(dǎo)管轄的職工以及領(lǐng)導(dǎo)所在層次(設(shè)最高層領(lǐng)導(dǎo)層次為0)WITHDirectReports(ManagerID,EmployeeID,Title,Level)AS(SELECTManagerID,EmployeeID,Title,0ASLevelFROMEmployeesWHEREManagerIDISNULL

UNIONALLSELECTe.ManagerID,e.EmployeeID,e.Title,d.Level+1FROMEmployeeseINNERJOINDirectReportsdONe.ManagerID=d.EmployeeID)SELECTManagerID,Title,EmployeeID,LevelFROMDirectReports119/131執(zhí)行結(jié)果圖示120/1317.4.3Merge語(yǔ)句MERGE語(yǔ)句是SQLServer2008新增加的數(shù)據(jù)操作語(yǔ)句。該語(yǔ)句的功能是根據(jù)源表對(duì)目標(biāo)表執(zhí)行插入、更新或刪除操作,最典型的應(yīng)用就是進(jìn)行兩個(gè)表的同步。121/131MERGE語(yǔ)句的簡(jiǎn)單描述MERGE目標(biāo)表USING源表ON匹配條件WHENMATCHEDTHEN

語(yǔ)句WHENNOTMATCHEDTHEN

語(yǔ)句;122/131示例設(shè)有Product及ProductNew兩個(gè)表,現(xiàn)希望將Product表中的數(shù)據(jù)同步到ProductNew表中。CREATETABLEProduct(ProductIDvarchar(7)PRIMARYKEY,ProductNamevarchar(50)NOTNULL,Pricedecimal(6,1)DEFAULT0)CREATETABLEProductNew(ProductIDvarchar(7)PRIMARYKEY,ProductNamevarchar(50)NOTNULL,Pricedecimal(6,1)DEFAULT0)123/131示例(續(xù))在Product表中插入如下數(shù)據(jù):INSERTINTOProductValues('4100037','優(yōu)盤(pán)',50),('4100038','鼠標(biāo)',30),('4100039','鍵盤(pán)',100)124/131示例(續(xù))將Product表中數(shù)據(jù)同步到ProductNew中。MERGEProductNewASdUSINGProductASsONs.ProductID=d.ProductIDWHENNOTMATCHEDTHENINSERT(Produc

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論