資源描述:
《《多表查詢》word版》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、多表查詢1.多表連接使用關(guān)系數(shù)據(jù)庫的主要優(yōu)點是可以通過構(gòu)造多個表中的數(shù)據(jù)來消除數(shù)據(jù)冗余。在數(shù)據(jù)庫設(shè)計階段,由于一致性、方便性及性能的要求,表中的一列數(shù)必須有限制,而不能將所有數(shù)據(jù)都存儲在一個表中,因此,許多信息將分散存儲在不同的表中,以防止數(shù)據(jù)冗余、更新復(fù)雜等問題的產(chǎn)生。要從多個表中查詢數(shù)據(jù),就需要使用連接操作,連接操作給用戶帶來很大的靈活性,它們可以在任何時候增加新的數(shù)據(jù)類型,而能夠從多個表中選擇和操作數(shù)據(jù)。(1)笛卡爾乘積查詢笛卡爾乘積就是從多個表中取數(shù)據(jù)時,在WHERE子句中沒有指定多個表的公共關(guān)
2、系。笛卡爾乘積查詢實際上就是在兩個表之間的交叉連接實現(xiàn)查詢的方式,此連接不帶WHERE子句,返回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于一個表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二個表中符合查詢條件的數(shù)據(jù)行數(shù)。例如:A表中有M條記錄,B表中有N條記錄,其笛卡爾乘積是M×N條記錄。在關(guān)系數(shù)據(jù)庫中,表就是一個聯(lián)合,當(dāng)從兩個(或多個)表中查詢數(shù)據(jù)時,如果沒有指定條件,那么這種查詢結(jié)果就是笛卡爾乘積。例1將學(xué)生課程數(shù)據(jù)庫中的表Student和表SC進(jìn)行笛卡爾乘積查詢(即交叉查詢)。Select*fromStudent,SC或Sel
3、ectStudent.*,SC.*fromStudentCrossJoinSC(2)通過WHERE子句連接多表在連接中,可以實現(xiàn)3個表或者多個表的連接。通過WHERE子句實現(xiàn)多表連接,首先在FROM子句中連接多個表的名稱,然后將任意兩個表的連接條件分別寫在WHERE子句后即可。語法格式如下:Select字段名表From表1,表2,表3…Where表1.字段=表2.字段And表2.字段=表3.字段and…說明:在交叉連接查詢語句中使用了WHERE子句時,返回的結(jié)果集是被連接的兩個基表所有行的笛卡爾積中滿足
4、WHERE子句條件搜索到的行數(shù)的所有行數(shù)。例2將學(xué)生課程數(shù)據(jù)庫中的表Student和表SC進(jìn)行按照WHERE子句的條件進(jìn)行笛卡爾乘積查詢(即交叉查詢)。Select*fromStudent,SCwhereStudent.Sno=SC.Sno或SelectStudent.*,SC.*fromStudentCrossJoinSCwhereStudent.Sno=SC.Sno(3)通過FROM子句連接多表FROM子句連接多個表就是內(nèi)連接的擴展。在FROM子句中連接多個表的語法如下:Select字段名表From
5、表1Join表2Join表3…ON表3.字段=表2.字段ON表2.字段=表1.字段and…注意:在FROM子句中連接多個表時,F(xiàn)ROM子句中所列出表的順序(如:表1、表2和表3),一定要與ON語句后所列表的順序相反(例如:表3、表2和表1),否則查詢語句將不會執(zhí)行。例3將學(xué)生課程數(shù)據(jù)庫中的表Student、表SC和Course實現(xiàn)這3個表的連接查詢,查詢3個表中學(xué)號相同的學(xué)生選修課的有關(guān)信息和學(xué)生有關(guān)信息。SelectStudent.*,SC.*,Course.*fromStudentJoinSCJoi
6、nCourseONCourse.Cno=SC.CnoONSC.Sno=Student.Sno2.內(nèi)連接內(nèi)連接就是使用比較運算符進(jìn)行表與表之間列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù)行。內(nèi)連接可以用來組合兩個或者多個表中的數(shù)據(jù)。一般用INNERJOIN或JOIN關(guān)鍵字來指定內(nèi)連接,它是連接查詢默認(rèn)的連接方式。內(nèi)連接的語法格式如下:SELECTselect_listFROM表名1INNERJOIN表名2[ONjoin_condition][WHEREsearch_conditions][ORD
7、ERBYorder_expression]在內(nèi)連接中,根據(jù)使用的比較方式不同,可以將內(nèi)連接分為以下3種。①等值連接:在連接條件中使用等于運算符比較被連接的列。②不等值連接:在連接條件中使用除等于運算符外的其他比較運算符比較被連接的列。③自然連接:它是等值連接的一種特殊情況,用來把目標(biāo)中重復(fù)的屬性列去掉。使用Join運算時,應(yīng)當(dāng)注意以下兩點:①在Join運算中,可以連接任何兩個相同類型的數(shù)值列。如果被連接列不是數(shù)值型的,則它們必須具有相同的數(shù)據(jù)類型,并且包含相同類型的數(shù)據(jù),但是列名稱不必相同。②如果兩個來
8、源表中包含名稱相同的列,用SELECT子句選取這些列時就應(yīng)當(dāng)冠以表名,否則會出現(xiàn)錯誤提示信息:列名“XXXXXX”不明確。(1)等值連接等值連接就是在連接條件中使用比較運算符等于號(=)來比較連接列的列值,其查詢結(jié)果中將列出被連接表中的所有列,并且包括重復(fù)列。等值連接用于返回所有連接表中具有匹配值的行,而排除所有其他的行。等值連接查詢有兩種表示方法。例4使用等值連接從兩個表中檢索數(shù)據(jù)。在學(xué)生課程數(shù)據(jù)庫中,從表Student、表SC檢索學(xué)生的