數(shù)據(jù)庫:左連接、右連接、全連接_第1頁
數(shù)據(jù)庫:左連接、右連接、全連接_第2頁
數(shù)據(jù)庫:左連接、右連接、全連接_第3頁
數(shù)據(jù)庫:左連接、右連接、全連接_第4頁
數(shù)據(jù)庫:左連接、右連接、全連接_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、數(shù)據(jù)庫:左連接、右連接、全連接!2009-08-08 01:43在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時(shí)各數(shù)據(jù)之間的關(guān)系不必確定, 常把一個(gè)實(shí)體 的所有信息存放在一個(gè)表中。當(dāng)檢索數(shù)據(jù)時(shí),通過連接操作查詢出存放在多個(gè)表 中的不同實(shí)體的信息。連接操作給用戶帶來很大的靈活性, 他們可以在任何時(shí)候 增加新的數(shù)據(jù)類型。為不同實(shí)體創(chuàng)建新的表,爾后通過連接進(jìn)行查詢。連接可以在SELECT語句的FRO時(shí)句或WHERE句中建立,似是而非在FRO句中指出連接時(shí)有助于將連接操作與WHERE句中的搜索條件區(qū)分開來。所以, 在Transact-SQL中推薦使用這種方法。SQL-92標(biāo)準(zhǔn)所定義的FROM句的連接語法格式為:FRO

2、M join_table join_type join_tableON (join_condition)其中join_table指出參與連接操作的表名,連接可以對(duì)同一個(gè)表操作,也可以 對(duì)多表操作,對(duì)同一個(gè)表操作的連接乂稱做自連接。join_type指出連接類型,可分為三種:內(nèi)連接、外連接和交義連接。內(nèi)連接(INNERJOIN)使用比較運(yùn)算符 進(jìn)行表問某(些)列數(shù)據(jù)的比較操作,并列出這些表中與連接條件相匹配的數(shù)據(jù) 行。根據(jù)所使用的比較方式不同,內(nèi)連接乂分為等值連接、自然連接和不等連接 三種。外連接分為左外連接(LEFT OUTER JOIN LEFT JOIN)、右外連接(RIGHT OUTER

3、 JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOI板FULL JOIN)三種。與內(nèi)連 接不同的是,外連接不只歹0出與連接條件相匹配的行,而是歹0出左表(左外連接時(shí))、右表(右外連接時(shí))或兩個(gè)表(全外連接時(shí))中所有符合搜索條件的數(shù)據(jù)行。交義連接(CROSS JOIN股有WHEREF句,它返回連接表中所有數(shù)據(jù)行的笛卡爾 積,其結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二 個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。連接操作中的ON (join_condition)子句指出連接條件,它由被連接表中的歹0和比較運(yùn)算符、邏輯運(yùn)算符等構(gòu)成。無論哪種連接都不能對(duì)text、nte

4、xt和image數(shù)據(jù)類型歹0進(jìn)行直接連接,但可以 對(duì)這三種列進(jìn)行間接連接。例如:SELECT p1.pub_id,p2.pub_id,p1.pr_infoFROM pub_info AS pl INNER JOIN pub_info AS p2ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)(一)內(nèi)連接 內(nèi)連接查詢操作列出與連接條件匹配的數(shù)據(jù)行, 它使用比較運(yùn)算符比較被連接列 的歹0值。內(nèi)連接分三種:1、 等值連接:在連接條件中使用等于號(hào)(=)運(yùn)算符比較被連接列的列值,其查詢 結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。2、 不等連接:在連接

5、條件使用除等于運(yùn)算符以外的其它比較運(yùn)算符比較被連接 的歹0的歹0值。這些運(yùn)算符包括、=、=、!、!和。3、 自然連接:在連接條件中使用等于(=)運(yùn)算符比較被連接列的列值,但它使用 選擇列表指出查詢結(jié)果集合中所包括的列,并刪除連接表中的重復(fù)列。例,下面使用等值連接歹0出authors和publishers表中位于同一城市的作者和 出版社:SELECT *FROM authors AS a INNER JOIN publishers AS pON a.city=p.city乂如使用自然連接,在選擇列表中刪除authors和publishers表中重復(fù)列(city和state):SELECT a.*

6、,p.pub_id,p.pub_name,p.countryFROM authors AS a INNER JOIN publishers AS pON a.city=p.city(二)外連接內(nèi)連接時(shí),返回查詢結(jié)果集合中的僅是符合查詢條件(WHERE搜索條件或HAVING條件)和連接條件的行。而采用外連接時(shí),它返回到查詢結(jié)果集合中的不 僅包含符合連接條件的行,而且還包括左表(左外連接時(shí))、右表(右外連接時(shí)) 或兩個(gè)邊接表(全外連接)中的所有數(shù)據(jù)行。如下面使用左外連接將論壇內(nèi)容和作者信息連接起來:SELECT a.*,b.* FROM luntan LEFT JOIN usertable as

7、bON a.username=b.username下面使用全外連接將city表中的所有作者以及user表中的所有作者,以及他們 所在的城市:SELECT a.*,b.*FROM city as a FULL OUTER JOIN user as bON a.username=b.username(三)交義連接交義連接不帶WHER?句,它返回被連接的兩個(gè)表所有數(shù)據(jù)行的笛卡爾積,返 回到結(jié)果集合中的數(shù)據(jù)行數(shù)等于第一個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)乘以第二 個(gè)表中符合查詢條件的數(shù)據(jù)行數(shù)。例,titles表中有6類圖書,而publishers表中有8家出版社,則下歹U交義連 接檢索到的記錄數(shù)將等于6*8=

8、48行。SELECT type,pub_nameFROM titles CROSS JOIN publishersORDER BY type介紹了表連接,更確切的說是inner joins內(nèi)連接.內(nèi)連接僅選出兩張表中互相匹配的記錄.因此,這會(huì)導(dǎo)致有時(shí)我們需要的記錄沒有包含進(jìn)來。為更好的理解這個(gè)概念,我們介紹兩個(gè)表作演示。蘇格蘭議會(huì)中的政黨表(party)和議員表(msp)。party(Code,Name,Leader)Code:政黨代碼Name:政黨名稱Leader:政黨領(lǐng)袖msp(Name,Party,Constituency)Name:議員名Party:議員所在政黨代碼Constituen

9、cy:選區(qū)在介紹左連接、右連接和全連接前,有一個(gè)數(shù)據(jù)庫中重要的概念要介紹一下,即空值(NULL)。有時(shí)表中,更確切的說是某些字段值,可能會(huì)出現(xiàn)空值,這是因?yàn)檫@個(gè)數(shù)據(jù)不知 道是什么值或根本就不存在??罩挡坏韧谧址曛械目崭瘢膊皇菙?shù)字類型的0。因此,判斷某個(gè)字段值是否為空值時(shí)不能使用=, 這些判斷符。必需有專用的短語:IS NULL來選出有空值字段的記錄,同理,可用IS NOT NULM出不包含空值的記錄。例如:下面的語句選出了沒有領(lǐng)導(dǎo)者的政黨。(不要奇怪,蘇格蘭議會(huì)中確實(shí)存在這樣的政黨)SELECT code, name FROM partyWHERE leader IS NULL乂如:一個(gè)

10、議員被開除出黨,看看他是誰。(即該議員的政黨為空值)SELECT name FROM mspWHERE party IS NULL好了,讓我們吉?dú)w正傳,看看什么叫左連接、右連接和全連接。A left join(左連接)包含所有的左邊表中的記錄甚至是右邊表中沒有和它匹配的記錄。同理,也存在著相同道理的right join(右連接),即包含所有的右邊表中的 記錄甚至是左邊表中沒有和它匹配的記錄 。而full join(全連接)顧名思義,左右表中所有記錄都會(huì)選出來 。講到這里,有人可能要問,到底什么叫:包含所有的左邊表中的記錄甚至是右邊 表中沒有和它匹配的記錄。Ok,我們來看一個(gè)實(shí)例:SELECT

11、, FROM msp JOIN party ON party=code這個(gè)是我們上一節(jié)所學(xué)的Join(注意:也叫inner join),這個(gè)語句的本意是歹U出所有議員的名字和他所屆政黨。你可以在http:/ 配,即FROM msp JOIN party ON party=code沒有把該記錄連接起來,而是過濾出去了。在該短語中,msp在Join的左邊,所有稱為左表。party在Join的右邊,所有 稱為右表。Ok,現(xiàn)在再看看這句話,“包含所有的左邊表中的記錄甚至是右邊表中沒有和它 匹配的記錄”,意思應(yīng)該很明白了吧。執(zhí)行下面這個(gè)語句,那兩個(gè)沒有政黨的議員就漏不

12、了了。SELECT , FROM msp LEFT JOIN party ON party=code關(guān)丁右連接,看看這個(gè)查詢就明白了:SELECT , FROM msp RIGHT JOIN party ON msp.party=party.code這個(gè)查詢的結(jié)果列出所有的議員和政黨,包含沒有議員的政黨,但不包含沒有政黨的議員。那么既要包含沒有議員的政黨,乂要包含沒有政黨的議員該怎么辦呢,對(duì)了,全連接(full join)。SELECT , FROM msp FULL JOIN part

13、y ON msp.party=party.code假設(shè)有A, B兩個(gè)表。表A記錄如下:aID aNum1a200501112a200501123a200501134a200501145a20050115表B記錄如下:bIDbName12006032401220060324023200603240342006032404820060324081.left joinsql語句如下:select * from Aleft join Bon A.aID = B.bID結(jié)果如下:alDaNumblDbName1a20050111120060324012a20050112220060324023a2005

14、0113320060324034a20050114420060324045a20050115NULLNULL(所影響的行數(shù)為5行)結(jié)果說明:left join是以A表的記錄為基礎(chǔ)的,A可以看成左表,B可以看成右表,left join是以左表為準(zhǔn)的 換句話說,左表(A)的記錄將會(huì)全部表示出來,而右表(B)只會(huì)顯示符合搜索條件的記錄(例子 中為:A.alD= B.blD).B表記錄不足的地方均為NULL.2.right joinsql語句如下:select * from Aright join Bon A.aID = B.bID結(jié)果如下:alDaNumblDbName1a2005011112006

15、0324012a20050112220060324023a20050113320060324034a2005011442006032404NULLNULL82006032408(所影響的行數(shù)為5行)結(jié)果說明:仔細(xì)觀察一下,就會(huì)發(fā)現(xiàn),和left join的結(jié)果剛好相反,這次是以右表(B)為基礎(chǔ)的,A表不足的 地方用NULL填充.3.inner joinsql語句如下:select * from Ainnerjoin Bon A.alD = B.blD結(jié)果如下:alD aNum blD bName1a20050111120060324012a20050112220060324023a20050113320060324034a2005011442006032404結(jié)果說明:很明顯,這里只顯示出了A.alD = B.blD的記錄.這說明inne門。in并不以誰為基礎(chǔ),它只顯示符合條件的記錄.PS:LEFT JOIN操作用于在任何的FROM子句中,組合來源表的記錄。使用LEFT JOIN運(yùn)算來創(chuàng)建一個(gè)左邊外部聯(lián)接。左邊外部聯(lián)接將包含了從第一個(gè)(左邊)開始的兩個(gè)表中的全 部記錄,即使在第二個(gè)(右邊)表中并沒有相符值的記錄。語法:FROM tablel LEFT JOIN table2 ON tablel.fieldl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論