資源描述:
《多表查詢導(dǎo)學(xué)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、多表查詢一、多表連接當(dāng)進(jìn)行數(shù)據(jù)庫設(shè)計時,為了減少數(shù)據(jù)冗余,提高數(shù)據(jù)庫應(yīng)用系統(tǒng)的性能。在完成關(guān)系模式轉(zhuǎn)換時,依據(jù)轉(zhuǎn)換原則,一個實(shí)體一張表,實(shí)體間的聯(lián)系依據(jù)不同的聯(lián)系類型進(jìn)行適當(dāng)?shù)奶幚?,在?lián)系表中保留聯(lián)系實(shí)體的主鍵(如:在借閱表中只保留讀者的圖書證號,以及書籍表中的圖書ID)。盡量讓每張表只描述一件事情。但是往往單表上的數(shù)據(jù)不能滿足用戶的查詢要求。用戶需要查看的數(shù)據(jù)可能來自多張表。如:檢索借過《我的成功可以復(fù)制》的圖書證號。分析:1、關(guān)于書籍明細(xì)在book表中2、關(guān)于借書明細(xì)在record表中得知:完成以上查詢必須來自兩張表。處理方法一:1、將book表,
2、record表進(jìn)行連接,組建一張臨時表。該表字段取自book,recordSelect*frombook,record(兩表連接方式,參看表連接示意)觀察以上數(shù)據(jù),表之間如何實(shí)現(xiàn)連接?解答:A表的每一行跟B表的所有行進(jìn)行一次合并。這樣合并的結(jié)果將會出現(xiàn)某些不符合實(shí)際的數(shù)據(jù),例如之上圈上紅色矩形框的數(shù)據(jù),在借閱記錄中呈現(xiàn)的是B001的記錄,而在book表中呈現(xiàn)的卻不是B001的描述,這樣的數(shù)據(jù)是不符合實(shí)際描述的。因此對于連接后的結(jié)果集,我們只需保留圖書證號相同的記錄。Select*frombook,recordWherebook.圖書ID=record.
3、圖書ID最后再篩選出我的成功可以復(fù)制的記錄Select*frombook,recordWherebook.圖書ID=record.圖書IDand書名=’我的成功可以復(fù)制’連接查詢的本質(zhì)特點(diǎn):將多張表連接成依據(jù)一定的連接條件合并成一張臨時的單表。對于該連接表的查詢就如同之前所學(xué)的單表查詢,輕而易舉。總結(jié):把多張表具有相同意義的字段其屬性值相等的合并在一起的連接方式成為等值連接。問題一:是不是只有設(shè)置主外健關(guān)系的表才能實(shí)施表連接呢?解答:不是這是兩個不同的概念,設(shè)置主外健主要是強(qiáng)調(diào)引用關(guān)系,限制用戶的輸入行為以保證數(shù)據(jù)的完整性。有沒有設(shè)置主外健關(guān)系,是不會
4、影響表連接。但是應(yīng)該這么說,表連接的條件一般是建立在有引用特性的字段上。即屬性意義相同的。二、操作細(xì)節(jié)1、為表取別名select*frombooka,recordbWherea.圖書ID=b.圖書ID--為表取別名and書名='我的成功可以復(fù)制'1、相同字段名應(yīng)該強(qiáng)制加上表名.屬性字段,如果為表取了別名則應(yīng)別名.字段select圖書id,書名frombook,record--由于book,record中都有圖書IDWherebook.圖書ID=record.圖書IDand書名='我的成功可以復(fù)制'正確檢索語句:selectbook.圖書id,書名fro
5、mbook,recordWherebook.圖書ID=record.圖書IDand書名='我的成功可以復(fù)制'注意:selectbook.圖書id,書名frombooka,recordbWherea.圖書ID=b.圖書IDand書名='我的成功可以復(fù)制'--已為表取別名,不能用原名標(biāo)識正確檢索:selecta.圖書id,書名frombooka,recordbWherea.圖書ID=b.圖書IDand書名='我的成功可以復(fù)制'三、特殊連接方式——自連接當(dāng)涉及到滿足某一條件下,行與行之間的比較,就需要把行與行合并成一行,這就需要進(jìn)行自表連接。例如:查看同時入
6、住過16013,15019的旅客有哪些?首先:Select*from入住記錄where房號in(‘16013’,’15019’)以上檢索方式將檢索出既住過15019又住過16013的旅客,但是也把只住過15019或者16013的旅客也檢索出來。因此改寫條件語句為且的條件Select*from入住記錄where房號=‘16013’and房號=’15019’但是一行中只記錄該旅客的一次入住記錄,因此之上檢索出來的結(jié)果集為空集試想:如果把某用戶的兩次入住記錄合并在一起,就可以檢索該用戶是否存在記錄既住過‘15019’又住過‘16013’取別名Select*f
7、rom入住記錄a,入住記錄bwherea.房號=‘16013’andb.房號=’15019’第二部分子查詢?nèi)纾簷z索借過《我的成功可以復(fù)制》的圖書證號。分析:1、關(guān)于書籍明細(xì)在book表中2、關(guān)于借書明細(xì)在record表中除了用連接表查詢,還可以通過以下方法A、先檢索出我的成功可以復(fù)制的圖書idSelect*frombookwhere書名='我的成功可以復(fù)制'B、再由圖書ID獲取借過該圖書ID的圖書證號Select圖書證號fromrecordwhere圖書id=?將兩條語句合并Select圖書證號fromrecordwhere圖書id=(Select圖書
8、idfrombookwhere書名='我的成功可以復(fù)制')之上:將某一查詢語句作為某一查詢的條