sql 各種連接方式的區(qū)別_第1頁(yè)
sql 各種連接方式的區(qū)別_第2頁(yè)
sql 各種連接方式的區(qū)別_第3頁(yè)
sql 各種連接方式的區(qū)別_第4頁(yè)
sql 各種連接方式的區(qū)別_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、數(shù)據(jù)庫(kù)innerjoin,leftjoin,rightjoin的區(qū)另Uinnerjoin:內(nèi)連接,結(jié)果只包含滿足條件的列。leftjoin:左外連接,結(jié)果包含滿足條件的行及左側(cè)表中的全部行。rightjoin:右外連接,結(jié)果包含滿足條件的行及右側(cè)表中的全部行。SQL語(yǔ)句(innerjoin,leftoutjoin,rightoutjoin)leftjoin:左連接,返回左表中所有的記錄以及右表中連接字段相等的記錄。rightjoin:右連接,返回右表中所有的記錄以及左表中連接字段相等的記錄。innerjoin:內(nèi)連接,又叫等值連接,只返回兩個(gè)表中連接字段相等的行。fulljoin:外連接,返回

2、兩個(gè)表中的行:leftjoin+rightjoincrossjoin:結(jié)果是笛卡爾積,就是第一個(gè)表的行數(shù)乘以第二個(gè)表的行數(shù)。declareatable(aint,bint)declarebtable(aint,bint)insertavalues(1,1)insertavalues(2,2)insertbvalues(1,1)insertbvalues(3,3)select*fromaselect*fromb-左:select*from*=Bb.a-右:seiect*from*=Bba-內(nèi)seiect*from*=Bba-外:seiect*from*=Bba-交叉連接select*fromac

3、rossjoinbleft以左邊為準(zhǔn)右邊有則顯示無(wú)則NULLright反之inner只取都不null的,相當(dāng)于用froma,bwhere?=?(連接是on?=?)leftjoin和leftouterjoin的區(qū)別通俗的講:AleftjoinB的連接的記錄數(shù)與A表的記錄數(shù)同ArightjoinB的連接的記錄數(shù)與B表的記錄數(shù)同AleftjoinB等價(jià)BrightjoinA舉個(gè)例子:假設(shè)a表和b表的數(shù)據(jù)是這樣的。abidnameidstock1a1152b2503cselect*fromainnerjoinbona.id=b.id這個(gè)語(yǔ)法是連接查詢中的內(nèi)連接,它產(chǎn)生的結(jié)果是兩個(gè)表相匹配的記錄出現(xiàn)在結(jié)

4、果列表中。根據(jù)上面的表,出現(xiàn)的結(jié)果是這樣的a.idnameb.idstock1a1152b250select*froma,bwherea.id=b.id這個(gè)語(yǔ)法是內(nèi)連接的另外一種寫法,其執(zhí)行結(jié)果與innerjoin樣select*fromaleft/rightjoinbona.id=b.id這個(gè)是外連接語(yǔ)法中的左外連接或右外連接如果是左外連接的話,它將顯示a表的所有記錄,selecta.*,b.*fromaleftjoinbona.id=b.id查詢的結(jié)果是這樣的:a.idnameb.idstock1a1152b2503cnullnull如果是右外連接的話,它將顯示b表的所有記錄,select

5、a.*,b.*fromarightjoinbona.id=b.id查詢的結(jié)果是這樣的:a.idnameb.idstock1a1152b250selecta.*,b.*fromaleftjoinbona.k=b.kselecta.*,b.*fromaleftouterjoinbona.k=b.k上面兩種一樣leftjoin是leftouterjoin的簡(jiǎn)寫selecta.*,b.*fromaleftinnerjoinbona.k=b.k沒有這種寫法,錯(cuò)誤的語(yǔ)句在你要使用多個(gè)leftjoin的時(shí)候比如說(shuō)10個(gè)我們把10個(gè)全都寫成leftjoin的形式然后再SQL讓他自動(dòng)運(yùn)行一下,它會(huì)把最后一次出現(xiàn)

6、的leftjoin變成leftouterjoin所以依此推理,最后一個(gè)leftjoin會(huì)以leftouterjoin的形式存在當(dāng)然,不管變不變對(duì)結(jié)果的顯示沒有任何影響希望我的實(shí)驗(yàn)?zāi)軐?duì)你有所幫助使用關(guān)系代數(shù)合并數(shù)據(jù)1關(guān)系代數(shù)合并數(shù)據(jù)集合的理論基礎(chǔ)是關(guān)系代數(shù),它是由E.F.Codd于1970年提出的。在關(guān)系代數(shù)的形式化語(yǔ)言中:用表、或者數(shù)據(jù)集合表示關(guān)系或者實(shí)體。P用行表示兀組。P用列表示屬性。P關(guān)系代數(shù)包含以下8個(gè)關(guān)系運(yùn)算符選取一一返回滿足指定條件的行。p投影一一從數(shù)據(jù)集合中返回指定的列。p笛卡爾積一一是關(guān)系的乘法,它將分別來(lái)自兩個(gè)數(shù)據(jù)集合中的行以所有可能的方式進(jìn)行組合。p并一一關(guān)系的加法和減法,

7、它可以在行的方向上合并兩個(gè)表中的數(shù)據(jù),就像把一個(gè)表壘在另一個(gè)表之上一樣。p交一一返回兩個(gè)數(shù)據(jù)集合所共有的行。p差一一返回只屬于一個(gè)數(shù)據(jù)集合的行。p連接在水平方向上合并兩個(gè)表,其方法是:將兩個(gè)表中在共同數(shù)據(jù)項(xiàng)上相互匹配的那些行合并起來(lái)。p除一一返回兩個(gè)數(shù)據(jù)集之間的精確匹配。p此外,作為一種實(shí)現(xiàn)現(xiàn)代關(guān)系代數(shù)運(yùn)算的方法,SQL還提供了:子查詢一一類似于連接,但更靈活;在外部查詢中,方式可以使用表達(dá)式、列表或者數(shù)據(jù)集合的地方都可以使用子查詢的結(jié)果。p本章將主要講述多種類型的連接、簡(jiǎn)單的和相關(guān)的子查詢、幾種類型的并、關(guān)系除以及其他的內(nèi)容。2使用連接2.1連接類型在關(guān)系代數(shù)中,連接運(yùn)算是由一個(gè)笛卡爾積運(yùn)算

8、和一個(gè)選取運(yùn)算構(gòu)成的。首先用笛卡爾積完成對(duì)兩個(gè)數(shù)據(jù)集合的乘運(yùn)算,然后對(duì)生成的結(jié)果集合進(jìn)行選取運(yùn)算,確保只把分別來(lái)自兩個(gè)數(shù)據(jù)集合并且具有重疊部分的行合并在一起。連接的全部意義在于在水平方向上合并兩個(gè)數(shù)據(jù)集合(通常是表),并產(chǎn)生一個(gè)新的結(jié)果集合,其方法是將一個(gè)數(shù)據(jù)源中的行于另一個(gè)數(shù)據(jù)源中和它匹配的行組合成一個(gè)新元組。SQL提供了多種類型的連接方式,它們之間的區(qū)別在于:從相互交疊的不同數(shù)據(jù)集合中選擇用于連接的行時(shí)所采用的方法不同。連接類型定義內(nèi)連接只連接匹配的行左外連接包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行右外連接包含右邊表的全部行(不管左邊的表中是否存

9、在與它們匹配的行),以及左邊表中全部匹配的行全外連接包含左、右兩個(gè)表的全部行,不管另外一邊的表中是否存在與它們匹配的行。(H)(theta)連接使用等值以外的條件來(lái)匹配左、右兩個(gè)表中的行交叉連接生成笛卡爾積一它不使用任何匹配或者選取條件,而是直接將一個(gè)數(shù)據(jù)源中的每個(gè)行與另一個(gè)數(shù)據(jù)源的每個(gè)行都一一匹配在INFORMIX中連接表的查詢?nèi)绻鸉ROM子句指定了多于一個(gè)表引用,則查詢會(huì)連接來(lái)自多個(gè)表的行。連接條件指定各列之間(每個(gè)表至少一列)進(jìn)行連接的關(guān)系。因?yàn)檎诒容^連接條件中的列,所以它們必須具有一致的數(shù)據(jù)類型。SELECT語(yǔ)句的FROM子句可以指定以下幾種類型的連接FROM子句關(guān)鍵字相應(yīng)的結(jié)果集C

10、ROSSJOIN笛卡爾乘積(所有可能的行對(duì))INNERJOIN僅對(duì)滿足連接條件的CROSS中的列LEFTOUTERJOIN一個(gè)表滿足條件的行,和另一個(gè)表的所有行RIGHTOUTERJOIN與LEFT相同,但兩個(gè)表的角色互換FULLOUTERJOINLEFTOUTER和RIGHTOUTER中所有行的超集內(nèi)連接(InnerJoin內(nèi)連接是最常見的一種連接,它頁(yè)被稱為普通連接,而E.FCodd最早稱之為自然連接。下面是ANSISQL-92標(biāo)準(zhǔn)select*fromt_institutioniinnerjoint_tellertoni.inst_no=t.inst_nowherei.inst_no=5

11、801其中inner可以省略。等價(jià)于早期的連接語(yǔ)法select*fromt_institutioni,t_tellertwherei.inst_no=t.inst_noandi.inst_no=58012.3外連接左外連接(LeftOuterJion)select*fromt_institutionileftouterjoint_tellertoni.inst_no=t.inst_no其中outer可以省略。右外連接(RigtOuterJion)select*fromt_institutionirightouterjoint_tellertoni.inst_no=t.inst_no全外連接(F

12、ullOuter)全外連接返回參與連接的兩個(gè)數(shù)據(jù)集合中的全部數(shù)據(jù),無(wú)論它們是否具有與之相匹配的行。在功能上,它等價(jià)于對(duì)這兩個(gè)數(shù)據(jù)集合分別進(jìn)行左外連接和右外連接,然后再使用消去重復(fù)行的并操作將上述兩個(gè)結(jié)果集合并為一個(gè)結(jié)果集。在現(xiàn)實(shí)生活中,參照完整性約束可以減少對(duì)于全外連接的使用,一般情況下左外連接就足夠了。在數(shù)據(jù)庫(kù)中沒有利用清晰、規(guī)范的約束來(lái)防范錯(cuò)誤數(shù)據(jù)情況下,全外連接就變得非常有用了,你可以使用它來(lái)清理數(shù)據(jù)庫(kù)中的數(shù)據(jù)。select*fromt_institutionifullouterjoint_tellertoni.inst_no=t.inst_no外連接與條件配合使用當(dāng)在內(nèi)連接查詢中加入條

13、件是,無(wú)論是將它加入到j(luò)oin子句,還是加入到where子句,其效果是完全一樣的,但對(duì)于外連接情況就不同了。當(dāng)把條件加入到j(luò)oin子句時(shí),SQLServer、Informix會(huì)返回外連接表的全部行,然后使用指定的條件返回第二個(gè)表的行。如果將條件放到where子句中,SQLServer將會(huì)首先進(jìn)行連接操作,然后使用where子句對(duì)連接后的行進(jìn)行篩選。下面的兩個(gè)查詢展示了條件放置位子對(duì)執(zhí)行結(jié)果的影響:條件在join子句select*fromt_institutionileftouterjoint_tellertoni.inst_no=t.inst_noandi.instno=5801inst_no

14、inst_nameinst_noteller_notell5801天河區(qū)58010001tom5801天河區(qū)58010002david5802越秀區(qū)5803白云區(qū)結(jié)果是:條件在where子句nameselect*fromt_institutionileftouterjoint_tellertoni.inst_no=t.inst_nowherei.inst_no=5801結(jié)果是:instnoinstname5801天河區(qū)5801天河區(qū)instnotellernotellername58010001tom58010002david2.4自身連接自身連接是指同一個(gè)表自己與自己進(jìn)行連接。這種一元連接通

15、常用于從自反關(guān)系(也稱作遞歸關(guān)系)中抽取數(shù)據(jù)。例如人力資源數(shù)據(jù)庫(kù)中雇員與老板的關(guān)系。下面例子是在機(jī)構(gòu)表中查找本機(jī)構(gòu)和上級(jí)機(jī)構(gòu)的信息。selects.inst_nosuperiornst,s.inst_namesup_inst_name,i.inst_no,i.inst_namefromt_institutionijoint_institutionsoni.superior_inst=s.inst_no結(jié)果是:superiornstsup_inst_nameinst_noinst_name800廣州市5801天河區(qū)800廣州市5802越秀區(qū)800廣州市5803白云區(qū)2.5交叉(無(wú)限制)連接交叉連

16、接用于對(duì)兩個(gè)源表進(jìn)行純關(guān)系代數(shù)的乘運(yùn)算。它不使用連接條件來(lái)限制結(jié)果集合,而是將分別來(lái)自兩個(gè)數(shù)據(jù)源中的行以所有可能的方式進(jìn)行組合。數(shù)據(jù)集合中一的每個(gè)行都要與數(shù)據(jù)集合二中的每一個(gè)行分別組成一個(gè)新的行。例如,如果第一個(gè)數(shù)據(jù)源中有5個(gè)行,而第二個(gè)數(shù)據(jù)源中有4個(gè)行,那么在它們之間進(jìn)行交叉連接就會(huì)產(chǎn)生20個(gè)行。人們將這種類型的結(jié)果集稱為笛卡爾乘積。大多數(shù)交叉連接都是由于錯(cuò)誤操作而造成的;但是它們卻非常適合向數(shù)據(jù)庫(kù)中填充例子數(shù)據(jù),或者預(yù)先創(chuàng)建一些空行以便為程序執(zhí)行期間所要填充的數(shù)據(jù)保留空間。select*fromt_institutionicrossjoint_tellert在交叉連接中沒有on條件子句AP

17、PENDIX3.1A參考資料與資源MicrosoftSQLServerp2000BilePaulNielsenPaulNielsen的Web站點(diǎn)purl HYPERLINK http:/www.is www.is/url3.2注文章所有SQL在IBMInformixDynamicServerVersion9.40.TC2E1測(cè)試通過表A記錄如下:aIDaNuma20050111a20050112a20050113a20050114a20050115表B記錄如下:bIDbName200603240120060324022006032403200603240482006032408實(shí)驗(yàn)如下:l.l

18、eftjoinsql語(yǔ)句如下:select*fromAleftjoinBonA.alD=B.blD結(jié)果如下:aIDaNumbIDbName1a20050111120060324012a20050112220060324023a20050113320060324034a20050114420060324045a20050115NULLNULL(所影響的行數(shù)為5行)結(jié)果說(shuō)明:leftjoin是以A表的記錄為基礎(chǔ)的,A可以看成左表,B可以看成右表,leftjoin是以左表為準(zhǔn)的.換句話說(shuō),左表(A)的記錄將會(huì)全部表示出來(lái),而右表(B)只會(huì)顯示符合搜索條件的記錄(例子中為:A.alD=B.blD).B

19、表記錄不足的地方均為NULL.2.rightjoinsql語(yǔ)句如下:select*fromArightjoinBonA.aID=B.bID結(jié)果如下:aIDaNumbIDbName1a20050111120060324012a20050112220060324023a20050113320060324034a2005011442006032404NULLNULL82006032408(所影響的行數(shù)為5行)結(jié)果說(shuō)明:仔細(xì)觀察一下,就會(huì)發(fā)現(xiàn),和leftjoin的結(jié)果剛好相反,這次是以右表(B)為基礎(chǔ)的,A表不足的地方用NULL填充.3.innerjoinsql語(yǔ)句如下:select*fromAinn

20、erjoinBonA.alD=B.blD結(jié)果如下:aIDaNumbIDbName1a20050111120060324012a20050112220060324023a20050113320060324034a2005011442006032404結(jié)果說(shuō)明:很明顯,這里只顯示出了A.alD=B.blD的記錄.這說(shuō)明innerjoin并不以誰(shuí)為基礎(chǔ),它只顯示符合條件的記錄.以下為網(wǎng)上的一點(diǎn)資料LEFTJOIN操作用于在任何的FROM子句中,組合來(lái)源表的記錄。使用LEFTJOIN運(yùn)算來(lái)創(chuàng)建一個(gè)左邊外部聯(lián)接。左邊外部聯(lián)接將包含了從第一個(gè)(左邊)開始的兩個(gè)表中的全部記錄,即使在第二個(gè)(右邊)表中并沒有

21、相符值的記錄。語(yǔ)法:FROMtable1LEFTJOINtable2ONtable1.field1compoprtable2.field2說(shuō)明:table1,table2參數(shù)用于指定要將記錄組合的表的名稱。fieldl,field2參數(shù)指定被聯(lián)接的字段的名稱。且這些字段必須有相同的數(shù)據(jù)類型及包含相同類型的數(shù)據(jù),但它們不需要有相同的名稱。compopr參數(shù)指定關(guān)系比較運(yùn)算符:=,=或。如果在INNERJOIN操作中要聯(lián)接包含Memo數(shù)據(jù)類型或OLEObject數(shù)據(jù)類型數(shù)據(jù)的字段,將會(huì)發(fā)生錯(cuò)誤。內(nèi)連接INNERJOIN:只顯示多表之間與關(guān)聯(lián)條件相匹配的列.外連接:LEFTJOIN:以左表為基礎(chǔ),顯

22、示左表中的所有列,不管是否與關(guān)聯(lián)條件相匹配,而右表中的數(shù)據(jù)只顯示與關(guān)聯(lián)條件相匹配的列,不匹配的列以NULL字符填充.RIGHTJOIN:以右表為基礎(chǔ),顯示右表中的所有列,不管是否與關(guān)聯(lián)條件相匹配,而左表中的數(shù)據(jù)只顯示與關(guān)聯(lián)條件相匹配的列,不匹配的列以NULL字符填充.FULLJOIN:顯示多個(gè)表中的所有的列,不匹配關(guān)聯(lián)條件的列以NULL字符填充.內(nèi)連接INNERJOIN:只顯示多表之間與關(guān)聯(lián)條件相匹配的列.外連接:LEFTJOIN:以左表為基礎(chǔ),顯示左表中的所有列,不管是否與關(guān)聯(lián)條件相匹配,而右表中的數(shù)據(jù)只顯示與關(guān)聯(lián)條件相匹配的列,不匹配的列以NULL字符填充.RIGHTJOIN:以右表為基礎(chǔ)

23、,顯示右表中的所有列,不管是否與關(guān)聯(lián)條件相匹配,而左表中的數(shù)據(jù)只顯示與關(guān)聯(lián)條件相匹配的列,不匹配的列以NULL字符填充.FULLJOIN:顯示多個(gè)表中的所有的列,不匹配關(guān)聯(lián)條件的列以NULL字符填充.WHERE子句中使用的連接語(yǔ)句,在數(shù)據(jù)庫(kù)語(yǔ)言中,被稱為隱性連接。INNERJOINON子句產(chǎn)生的連接稱為顯性連接。(其他JOIN參數(shù)也是顯性連接)WHERE和INNERJOIN產(chǎn)生的連接關(guān)系,沒有本質(zhì)區(qū)別,結(jié)果也一樣。但是!隱性連接隨著數(shù)據(jù)庫(kù)語(yǔ)言的規(guī)范和發(fā)展,已經(jīng)逐漸被淘汰,比較新的數(shù)據(jù)庫(kù)語(yǔ)言基本上已經(jīng)拋棄了隱性連接,全部采用顯性連接了。一般要使得數(shù)據(jù)庫(kù)查詢語(yǔ)句性能好點(diǎn)遵循一下原則:在做表與表的連

24、接查詢時(shí),大表在前,小表在后不使用表別名,通過字段前綴區(qū)分不同表中的字段查詢條件中的限制條件要寫在表連接條件前盡量使用索引的字段做為查詢條件語(yǔ)法格式:其實(shí)INNERJOINON的語(yǔ)法格式可以概括為:FROM(表1INNERJOIN表2ON表1.字段號(hào)二表2.字段號(hào))INNERJOIN表3ON表1.字段號(hào)二表3.字段號(hào))INNERJOIN表4ONMember.字段號(hào)二表4.字段號(hào))INNERJOIN表XONMember.字段號(hào)二表X.字段號(hào)您只要套用該格式就可以了?,F(xiàn)成格式范例:雖然我說(shuō)得已經(jīng)比較明白了,但為照顧初學(xué)者,我還是以本會(huì)員注冊(cè)系統(tǒng)為例,提供一些現(xiàn)成的語(yǔ)法格式范例,大家只要修改其中的數(shù)

25、據(jù)表名稱和字段名稱即可。連接兩個(gè)數(shù)據(jù)表的用法:FROMMemberINNERJOINMemberSortONMember.MemberSort=MemberSort.MemberSort語(yǔ)法格式可以概括為:FROM表1INNERJOIN表2ON表1.字段號(hào)=表2.字段號(hào)連接三個(gè)數(shù)據(jù)表的用法:FROM(MemberINNERJOINMemberSortONMember.MemberSort=MemberSort.MemberSort)INNERJOINMemberLevelONMember.MemberLevel=MemberLevel.MemberLevel語(yǔ)法格式可以概括為:FROM(表1I

26、NNERJOIN表2ON表1.字段號(hào)二表2.字段號(hào))INNERJOIN表3ON表1.字段號(hào)=表3.字段號(hào)連接四個(gè)數(shù)據(jù)表的用法:FROM(MemberINNERJOINMemberSortONMember.MemberSort=MemberSort.MemberSort)INNERJOINMemberLevelONMember.MemberLevel=MemberLevel.MemberLevel)INNERJOINMemberIdentityONMember.MemberIdentity=MemberIdentity.MemberIdentity語(yǔ)法格式可以概括為:FROM(表1INNERJO

27、IN表2ON表1.字段號(hào)二表2.字段號(hào))INNERJOIN表3ON表1.字段號(hào)二表3.字段號(hào))INNERJOIN表4ONMember.字段號(hào)二表4.字段號(hào)連接五個(gè)數(shù)據(jù)表的用法:FROM(MemberINNERJOINMemberSortONMember.MemberSort=MemberSort.MemberSort)INNERJOINMemberLevelONMember.MemberLevel=MemberLevel.MemberLevel)INNERJOINMemberIdentityONMember.MemberIdentity=MemberIdentity.MemberIdentit

28、y)INNERJOINWedlockONMember.Wedlock=Wedlock.Wedlock語(yǔ)法格式可以概括為:FROM(表1INNERJOIN表2ON表1.字段號(hào)二表2.字段號(hào))INNERJOIN表3ON表1.字段號(hào)二表3.字段號(hào))INNERJOIN表4ONMember.字段號(hào)二表4.字段號(hào))INNERJOIN表5ONMember.字段號(hào)二表5.字段號(hào)外聯(lián)接。外聯(lián)接可以是左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接。在FROM子句中指定外聯(lián)接時(shí),可以由下列幾組關(guān)鍵字中的一組指定LEFTJOIN或LEFTOUTERJOIN。左向外聯(lián)接的結(jié)果集包括LEFTOUTER子句中指定的左表的所有行,而不

29、僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值。RIGHTJOIN或RIGHTOUTERJOIN。右向外聯(lián)接是左向外聯(lián)接的反向聯(lián)接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。FULLJOIN或FULLOUTERJOIN。完整外部聯(lián)接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。僅當(dāng)至少有一個(gè)同屬于兩表的行符合聯(lián)接條件時(shí),內(nèi)聯(lián)接才返回行。內(nèi)聯(lián)接消除與另一個(gè)表中的任何行不匹配的行。而外聯(lián)接會(huì)返回FROM子句中提

30、到的至少一個(gè)表或視圖的所有行,只要這些行符合任何WHERE或HAVING搜索條件。將檢索通過左向外聯(lián)接引用的左表的所有行,以及通過右向外聯(lián)接引用的右表的所有行。完整外部聯(lián)接中兩個(gè)表的所有行都將返回。連接分為三種:內(nèi)連接、外連接、交叉連接2.內(nèi)連接(INNERJOIN):分為三種:等值連接、自然連接、不等連接5.外連接(OUTERJOIN):分為三種:左外連接(LEFTOUTERJOIN或LEFTJOIN)右外連接(RIGHTOUTERJOIN或RIGHTJOIN)全外連接(FULLOUTERJOIN或FULLJOIN)11.12交叉連接(CROSSJOIN):13.沒有WHERE子句,它返回連

31、接表中所有數(shù)據(jù)行的笛卡爾積-使用標(biāo)準(zhǔn)的SQL語(yǔ)法,匹配條件出現(xiàn)在on子句中,搜索條件出現(xiàn)在where子句,這樣使得查詢更容易理解-不太推薦使用等值查詢SQL左外連接,右外連接,全連接,內(nèi)連接連接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定連接條件。WHERE和HAVING子句也可以包含搜索條件,以進(jìn)一步篩選連接條件所選的行。連接可分為以下幾類:內(nèi)連接。(典型的連接運(yùn)算,使用像=或之類的比較運(yùn)算符)。包括相等連接和自然連接。內(nèi)連接使用比較運(yùn)算符根據(jù)每個(gè)表共有的列的值匹配兩個(gè)表中的行。例如,檢索students和courses表中學(xué)生標(biāo)識(shí)號(hào)相同的所有行。外連接。外連接可以是左向

32、外連接、右向外連接或完整外部連接。在FROM子句中指定外連接時(shí),可以由下列幾組關(guān)鍵字中的一組指定:LEFTJOIN或LEFTOUTERJOIN。左向外連接的結(jié)果集包括LEFTOUTER子句中指定的左表的所有行,而不僅僅是連接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值。RIGHTJOIN或RIGHTOUTERJOIN。右向外連接是左向外連接的反向連接。將返回右表的所有行。如果右表的某行在左表中沒有匹配行,則將為左表返回空值。FULLJOIN或FULLOUTERJOIN。完整外部連接返回左表和右表中的所有行。當(dāng)某行在另一個(gè)表中沒有匹配行時(shí),則

33、另一個(gè)表的選擇列表列包含空值。如果表之間有匹配行,則整個(gè)結(jié)果集行包含基表的數(shù)據(jù)值。交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。例如,下面的內(nèi)連接檢索與某個(gè)出版商居住在相同州和城市的作者:USEpub&selecta-auarne,亂刖name,p.pubnameFROMauthorsASaINNEROpublishersASpONa.cf=p.cityANDa.state-p.&tateORDERBYa.au_lnameASC;a.au_fnameASCFROM子句中的表或視圈可通過內(nèi)連接或完整外部連接按任園殖扌靛旦是,用左或右向外連接指定

34、未或視團(tuán)時(shí)表或視團(tuán)旳頃序很重爲(wèi)有關(guān)淀用左詬向外連接朋I俵的宦夢(mèng)信息,請(qǐng)參見便用外連瓠例子:誹idname時(shí)idjobpa.rent_id1張312312李因23423王武3344m.id同parent_id存在并系seletta*.bfromainnerjoinbonaid-Dparenl_id結(jié)果是1張312312李匹2342左連接selecta*.b*fromaleftjoinioraid=t.parentjdselectat*fromaleft|oinbonaJd=b.parentjd123423山12nJR武弧李+12_3右連接seieda.rcfromarighijoinoona.i

35、(J=Dpsrenija結(jié)果是1張32李四null芫全連接selectaT,b.*troiralulljoinb&na.iJ=b.paiemt_id結(jié)軀1張?2李四231342334null注意上面FULLjoin的查詢結(jié)果SQLcodeDECLARETATABLE(IDAINT,VAVARCHAR(10)DECLARETBTABLE(IDBINT,VBVARCHAR(10)INSERTINTOTASELECTAAUNIONSELECTBCUNIONSELECTCCCINSERTINTOTBSELECT2UNIONSELECT58UNIONSELECT67內(nèi)聯(lián)接簡(jiǎn)單寫法SELECTAIDA,A

36、VA,B.IDB,B.VBFROMTAA,TBBWHEREA.IDA=B.IDB-內(nèi)聯(lián)接SELECTA.IDA,A.VA,B.IDB,B.VBFROMTAAINNERJOINTBBONA.IDA=B.IDBSELECTA.IDA,A.VA,B.IDB,B.VBFROMTAAJOINTBBONA.IDA=B.IDB-左外聯(lián)接SELECTA.IDA,A.VA,B.IDB,B.VBFROMTAALEFTJOINTBBONA.IDA=B.IDBSELECTA.IDA,A.VA,B.IDB,B.VBFROMTAALEFTOUTERJOINTBBONA.IDA=B.IDB-右外聯(lián)接SELECTA.IDA,

37、A.VA,B.IDB,B.VBFROMTAARIGHTJOINTBBONA.IDA=B.IDBSELECTA.IDA,A.VA,B.IDB,B.VBFROMTAARIGHTOUTERJOINTBBONA.IDA=B.IDB-完整外聯(lián)接SELECTA.IDA,A.VA,B.IDB,B.VBFROMTAAFULLJOINTBBONA.IDA=B.IDBSELECTA.IDA,A.VA,B.IDB,B.VBFROMTAAFULLOUTERJOINTBBONA.IDA=B.IDB-交叉聯(lián)接SELECTA.IDA,A.VA,B.IDB,B.VBFROMTAACROSSJOINTBB-自聯(lián)接SELECTA

38、.IDA,A.VA,B.IDA,B.VAFROMTAA,TABWHEREA.IDA=B.IDA+1查詢分析器中執(zhí)行:一建表tablel,table2:createtabletable1(idint,namevarchar(10)createtabletable2(idint,scoreint)insertintotablelselectl,leeinsertintotablelselect2,zhanginsertintotablelselect4,wanginsertintotable2selectl,90insertintotable2select2,l00insertintotable2

39、select3,70如表tableltable2idnameidscone1lee1502zhang21DD4wang370以下均在查詢分析器中執(zhí)行一、外連接概念:包括左向外聯(lián)接、右向外聯(lián)接或完整外部聯(lián)接左連接:leftjoin或leftouterjoin(1)左向外聯(lián)接的結(jié)果集包括LEFTOUTER子句中指定的左表的所有行,而不僅僅是聯(lián)接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關(guān)聯(lián)的結(jié)果集行中右表的所有選擇列表列均為空值(null)。sql語(yǔ)句select*fromtable1leftjointable2ontable1.id=table2.id結(jié)果idnameidscone:1;lee1so2zhang21DD4vwangNULLNULL注釋:包含table1的所有子句,根據(jù)指定條件返回table2相應(yīng)的字段,不符合的以null顯

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論