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

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

