第四章ch4關系數(shù)據(jù)庫語言_第1頁
第四章ch4關系數(shù)據(jù)庫語言_第2頁
第四章ch4關系數(shù)據(jù)庫語言_第3頁
第四章ch4關系數(shù)據(jù)庫語言_第4頁
第四章ch4關系數(shù)據(jù)庫語言_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數(shù)據(jù)庫技術與應用第4章關系數(shù)據(jù)庫標準語言(2)4.3.3多表連接查詢同時涉及多個表的查詢稱為連接查詢用來連接兩個表的條件稱為連接條件或連接謂詞一般格式:[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>

比較運算符:=、>、<、>=、<=、!=[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>連接查詢(續(xù))連接字段連接謂詞中的列名稱為連接字段連接條件中的各連接字段類型必須是可比的,但不必是相同的連接操作的執(zhí)行過程嵌套循環(huán)法(NESTED-LOOP)首先在表1中找到第一個元組,然后從頭開始掃描表2,逐一查找滿足連接件的元組,找到后就將表1中的第一個元組與該元組拼接起來,形成結果表中一個元組。表2全部查找完后,再找表1中第二個元組,然后再從頭開始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第二個元組與該元組拼接起來,形成結果表中一個元組。重復上述操作,直到表1中的全部元組都處理完畢排序合并法(SORT-MERGE)常用于=連接首先按連接屬性對表1和表2排序對表1的第一個元組,從頭開始掃描表2,順序查找滿足連接條件的元組,找到后就將表1中的第一個元組與該元組拼接起來,形成結果表中一個元組。當遇到表2中第一條大于表1連接字段值的元組時,對表2的查詢不再繼續(xù)排序合并法找到表1的第二條元組,然后從剛才的中斷點處繼續(xù)順序掃描表2,查找滿足連接條件的元組,找到后就將表1中的第一個元組與該元組拼接起來,形成結果表中一個元組。直接遇到表2中大于表1連接字段值的元組時,對表2的查詢不再繼續(xù)重復上述操作,直到表1或表2中的全部元組都處理完畢為止索引連接(INDEX-JOIN)對表2按連接字段建立索引對表1中的每個元組,依次根據(jù)其連接字段值查詢表2的索引,從中找到滿足條件的元組,找到后就將表1中的第一個元組與該元組拼接起來,形成結果表中一個元組連接查詢(續(xù))SQL中連接查詢的主要類型

廣義笛卡爾積 等值連接(含自然連接)

非等值連接查詢 自身連接查詢 外連接查詢 復合條件連接查詢一、廣義笛卡爾積不帶連接謂詞的連接很少使用例:

SELECTStudent.*,SC.*FROMStudent,SC二、等值與非等值連接查詢等值連接、自然連接、非等值連接[例4.39]查詢每個學生及其選修課程的情況。SELECTStudent.*,SC.*FROMStudent,SCWHEREStudent.Sno=SC.Sno;等值連接連接運算符為=的連接操作

[<表名1>.]<列名1>=[<表名2>.]<列名2>任何子句中引用表1和表2中同名屬性時,都必須加表名前綴。引用唯一屬性名時可以加也可以省略表名前綴。自然連接[例4.41]查詢選修2號課程且成績在90分以上的所有學生。SELECTStudent.Sno,SnameFROMStudent,SCWHEREStudent.Sno=SC.Snoando=‘2’andGrade>90非等值連接查詢連接運算符不是=的連接操作

[<表名1>.]<列名1><比較運算符>[<表名2>.]<列名2>比較運算符:>、<、>=、<=、!=[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>

二、自身連接一個表與其自己進行連接,稱為表的自身連接需要給表起別名以示區(qū)別由于所有屬性名都是同名屬性,因此必須使用別名前綴自身連接(續(xù))[例4.42]查詢每一門課的間接先修課(即先修課的先修課)SELECTo,SECOND.CpnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Cpno=o;三、外連接(OuterJoin)外連接與普通連接的區(qū)別普通連接操作只輸出滿足連接條件的元組外連接操作以指定表為連接主體,將主體表中不滿足連接條件的元組一并輸出外連接(續(xù))

[例]查詢每個學生及其選修課程的情況包括沒有選修課程的學生----用外連接操作SELECTStudent.Sno,Sname,Ssex, Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno*=SC.Sno多表連接[補充例]查詢每個學生的學號、姓名、選修的課程名及成績。SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.Snoando=o;

嵌套查詢(子查詢)嵌套查詢概述一個SELECT-FROM-WHERE語句稱為一個查詢塊將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查詢

子查詢(續(xù))

SELECTSname 外層查詢/父查詢

FROMStudentWHERESnoIN

(SELECTSno內層查詢/子查詢

FROMSCWHERECno='2');子查詢(續(xù))子查詢的限制不能使用ORDERBY子句層層嵌套方式反映了SQL語言的結構化有些嵌套查詢可以用連接運算替代嵌套查詢分類不相關子查詢子查詢的查詢條件不依賴于父查詢相關子查詢子查詢的查詢條件依賴于父查詢嵌套查詢求解方法不相關子查詢是由里向外逐層處理。即每個子查詢在上一級查詢處理之前求解,子查詢的結果用于建立其父查詢的查找條件。嵌套查詢求解方法(續(xù))相關子查詢首先取外層查詢中表的第一個元組,根據(jù)它與內層查詢相關的屬性值處理內層查詢,若WHERE子句返回值為真,則取此元組放入結果表;然后再取外層表的下一個元組;重復這一過程,直至外層表全部檢查完為止。引出子查詢的謂詞帶有IN謂詞的子查詢帶有比較運算符的子查詢帶有ANY或ALL謂詞的子查詢帶有EXISTS謂詞的子查詢一、帶有IN謂詞的子查詢[例4.43]查詢與“劉晨”在同一個系學習的學生。

此查詢要求可以分步來完成①確定“劉晨”所在系名

SELECTSdeptFROMStudentWHERESname='劉晨';

帶有IN謂詞的子查詢(續(xù))②查找所有在IS系學習的學生。

SELECTSno,Sname,SdeptFROMStudentWHERESdept='IS';

構造嵌套查詢將第一步查詢嵌入到第二步查詢的條件中

SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=‘劉晨’);此查詢?yōu)椴幌嚓P子查詢。DBMS求解該查詢時也是分步去做的。帶有IN謂詞的子查詢(續(xù))父查詢和子查詢中的表均可以定義別名

SELECTSno,Sname,SdeptFROMStudentS1WHERES1.SdeptIN(SELECTSdeptFROMStudentS2WHERES2.Sname=‘劉晨’);帶有IN謂詞的子查詢(續(xù))[例4.44]查詢選修了課程名為“數(shù)據(jù)庫”的學生學號和姓名

SELECTSno,Sname③最后在Student關系中

FROMStudent取出Sno和SnameWHERESnoIN(SELECTSno②然后在SC關系中找出選

FROMSC修了課程的學生學號

WHERECnoIN(SELECTCno①首先在Course關系中找出

FROMCourse數(shù)據(jù)庫”的課程號,

WHERECname=‘數(shù)據(jù)庫’));帶有IN謂詞的子查詢(續(xù))用連接查詢SELECTSno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDo=oANDame=‘數(shù)據(jù)庫’;二、帶有比較運算符的子查詢

當能確切知道內層查詢返回單值時,可用比較運算符(>,<,=,>=,<=,!=或<>)。與ANY或ALL謂詞配合使用帶有比較運算符的子查詢(續(xù))例:假設一個學生只可能在一個系學習,并且必須屬于一個系,則在[例4.43]可以用=代替IN

SELECTSno,Sname,SdeptFROMStudentWHERESdept=SELECTSdeptFROMStudentWHERESname='劉晨';帶有比較運算符的子查詢(續(xù))

子查詢一定要跟在比較符之后

錯誤的例子:

SELECTSno,Sname,SdeptFROMStudentWHERE(SELECTSdeptFROMStudentWHERESname=‘劉晨’)=Sdept;補充帶有ANY或ALL謂詞的子查詢謂詞語義ANY:任意一個值ALL:所有值帶有ANY或ALL謂詞的子查詢(續(xù))需要配合使用比較運算符>ANY 大于子查詢結果中的某個值

>ALL 大于子查詢結果中的所有值<ANY 小于子查詢結果中的某個值<ALL 小于子查詢結果中的所有值>=ANY 大于等于子查詢結果中的某個值>=ALL 大于等于子查詢結果中的所有值<=ANY 小于等于子查詢結果中的某個值<=ALL 小于等于子查詢結果中的所有值=ANY 等于子查詢結果中的某個值=ALL 等于子查詢結果中的所有值(通常沒有實際意義)!=(或<>)ANY 不等于子查詢結果中的某個值!=(或<>)ALL 不等于子查詢結果中的任何一個值帶有ANY或ALL謂詞的子查詢(續(xù))[補充例]查詢其他系中比信息系任意一個(其中某一個)學生年齡小的學生姓名和年齡

SELECTSname,SageFROMStudentWHERESage<ANY(SELECTSageFROMStudentWHERESdept='IS')

ANDSdept<>'IS';/*注意這是父查詢塊中的條件*/帶有ANY或ALL謂詞的子查詢(續(xù))[補充例]:用集函數(shù)實現(xiàn)

SELECTSname,SageFROMStudentWHERESage<(SELECTMAX(Sage)FROMStudentWHERESdept='IS')ANDSdept<>'IS’;帶有EXISTS謂詞的子查詢1.EXISTS謂詞存在量詞

帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。若內層查詢結果非空,則返回真值若內層查詢結果為空,則返回假值由EXISTS引出的子查

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論