內(nèi)連接、外連接、左連接、右連接、等值連接、自然連接和自連接之間的區(qū)別,看這篇就夠了!
來(lái)源:blog.csdn.net/qq_44756792
/article/details/95503303
多表查詢經(jīng)常用到連接,各種連接之間的區(qū)別應(yīng)該注意總結(jié)。
首先大概認(rèn)識(shí)各種連接的關(guān)系和由來(lái):
表之間的連接常有以下兩種:
在SELECT語(yǔ)句的WHERE子句中使用比較運(yùn)算符給出連接條件,對(duì)表進(jìn)行連接,將這種表示形式稱為連接謂詞表示形式。連接謂詞中的比較符可以是<、<=、=、>、>=、!=、<>、!< 和 !>,當(dāng)比較符為“=”時(shí),就是等值連接,等值連接的結(jié)果中有重復(fù)列,在目標(biāo)列中去除相同的字段名就是自然連接。 以JOIN關(guān)鍵字指定的連接,T-SQL擴(kuò)展了以JOIN關(guān)鍵字指定連接的表示方式,使表的連接運(yùn)算能力有所增強(qiáng),以JOIN關(guān)鍵字指定的連接有三種類型:內(nèi)連接、外連接、交叉連接(笛卡爾積)。
下面詳細(xì)分析各種連接方式的特點(diǎn):
1.等值連接(相等連接):
SELECT XSB.* , CJB.*
FROM XSB , CJB
WHERE XSB.學(xué)號(hào) = CJB.學(xué)號(hào)
使用”=”關(guān)系將表連接起來(lái)的查詢,其查詢結(jié)果中列出被連接表中的所有列,包括其中的重復(fù)列。
2.自然連接:
數(shù)據(jù)庫(kù)應(yīng)用中最常用的是“自然連接”,它在目標(biāo)列中去除相同的字段名。
SELECT XSB.* , CJB.課程號(hào), CJB.成績(jī)
FROM XSB , CJB
WHERE XSB.學(xué)號(hào)= CJB.學(xué)號(hào)
進(jìn)行自然連接運(yùn)算要求兩個(gè)表有共同屬性(列),自然連接運(yùn)算的結(jié)果表是在參與操作的兩個(gè)表的共同屬性上進(jìn)行等值連接后,再去除重復(fù)的屬性后所得的新表。
等值連接和自然連接的區(qū)別:
1)等值連接中不要求相等屬性值的屬性名相同,而自然連接要求相等屬性值的屬性名必須相同,即兩關(guān)系只有在同名屬性才能進(jìn)行自然連接。
2)等值連接不將重復(fù)屬性去掉,而自然連接去掉重復(fù)屬性,也可以說(shuō),自然連接是去掉重復(fù)列的等值連接。
3.內(nèi)連接
指定了INNER關(guān)鍵字的連接是內(nèi)連接,內(nèi)連接按照ON所指定的連接條件合并兩個(gè)表,返回滿足條件的行。內(nèi)連接是系統(tǒng)默認(rèn)的,可以省略INNER關(guān)鍵字。使用內(nèi)連接后仍可使用WHERE子句指定條件。擴(kuò)展:超全的數(shù)據(jù)庫(kù)建表/SQL/索引規(guī)范,適合貼在工位上!
例1
SELECT *
FROM XSB INNER JOIN CJB
ON XSB.學(xué)號(hào) =CJB.學(xué)號(hào)
例2
SELECT 姓名, 成績(jī)
FROM XSB JOIN CJB
ON XSB.學(xué)號(hào) = CJB.學(xué)號(hào)
WHERE 課程號(hào) = '206' AND 成績(jī)>=80
4.自連接
自連接作為一種特例,可以將一個(gè)表與它自身進(jìn)行連接,稱為自連接。若要在一個(gè)表中查找具有相同列值的行,則可以使用自連接。使用自連接時(shí)需為表指定兩個(gè)別名,且對(duì)所有列的引用均要用別名限定。
SELECT a.學(xué)號(hào), a.課程號(hào), b.課程號(hào), a.成績(jī)
FROM CJB a JOIN CJB b
ON a.成績(jī)=b.成績(jī) AND a.學(xué)號(hào)=b.學(xué)號(hào) AND a.課程號(hào)!=b.課程號(hào)

5.外連接(左外連接,右外連接、全外連接)
指定了OUTER關(guān)鍵字的為外連接,外連接的結(jié)果表不但包含滿足連接條件的行,還包括相應(yīng)表中的所有行。外連接包括以下三種:
左外連接(LEFT OUTER JOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括左表的所有行。
【例】 查找所有學(xué)生情況,以及他們選修的課程號(hào),若學(xué)生未選修任何課,也要包括其情況
SELECT XSB.* , 課程號(hào)
FROM XSB LEFT OUTER JOIN CJB
ON XSB.學(xué)號(hào) = CJB.學(xué)號(hào)
本例執(zhí)行時(shí),若有學(xué)生未選任何課程,則結(jié)果表中相應(yīng)行的課程號(hào)字段值為NULL。
右外連接(RIGHT OUTER JOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括右表的所有行。
完全外連接(FULL OUTER JOIN):結(jié)果表中除了包括滿足連接條件的行外,還包括兩個(gè)表的所有行。
其中的OUTER關(guān)鍵字均可省略**
6.交叉連接(又名笛卡爾積)
首先,先簡(jiǎn)單解釋一下笛卡爾積。
有兩個(gè)集合A和B,A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的結(jié)果集就可以分別表示為以下這種形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
以上A×B和B×A的結(jié)果就可以叫做兩個(gè)集合相乘的‘笛卡爾積’。
從以上的數(shù)據(jù)分析我們可以得出以下兩點(diǎn)結(jié)論:
兩個(gè)集合相乘,不滿足交換率,既 A×B ≠ B×A; A集合和B集合相乘,包含了集合A中元素和集合B中元素相結(jié)合的所有的可能性,即兩個(gè)集合相乘得到的新集合的元素個(gè)數(shù)是 A集合的元素個(gè)數(shù) × B集合的元素個(gè)數(shù)。
交叉連接:
SELECT * from 表1 JOIN 表2;
交叉連接實(shí)際上是將兩個(gè)表進(jìn)行笛卡爾積運(yùn)算,結(jié)果表是由第一個(gè)表的每一行與第二個(gè)表的每一行拼接后形成的表,稱為‘笛卡爾積表’,結(jié)果表的行數(shù)等于兩個(gè)表的行數(shù)之積。
如果兩張表的數(shù)據(jù)量都比較大的話,那樣就會(huì)占用很大的內(nèi)存空間這顯然是不合理的。所以,我們?cè)谶M(jìn)行表連接查詢的時(shí)候一般都會(huì)使用JOIN xxx ON xxx的語(yǔ)法,ON語(yǔ)句的執(zhí)行是在JOIN語(yǔ)句之前的,也就是說(shuō)兩張表數(shù)據(jù)行之間進(jìn)行匹配的時(shí)候,會(huì)先判斷數(shù)據(jù)行是否符合ON語(yǔ)句后面的條件,再?zèng)Q定是否JOIN。
因此,有一個(gè)顯而易見(jiàn)的SQL優(yōu)化的方案是,當(dāng)兩張表的數(shù)據(jù)量比較大,又需要連接查詢時(shí),應(yīng)該使用 FROM table1 JOIN table2 ON xxx的語(yǔ)法,避免使用 FROM table1,table2 WHERE xxx 的語(yǔ)法,因?yàn)楹笳邥?huì)在內(nèi)存中先生成一張數(shù)據(jù)量比較大的笛卡爾積表,增加了內(nèi)存的開(kāi)銷。
正文結(jié)束
1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事
3.從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧
5.37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...
一個(gè)人學(xué)習(xí)、工作很迷茫?
點(diǎn)擊「閱讀原文」加入我們的小圈子!

