新聞中心
SQL Server內(nèi)連接和外連接的區(qū)別在哪里呢?這是很多人都提到過(guò)的問(wèn)題,下面就為您分析SQL Server內(nèi)連接和外連接的具體區(qū)別,供您參考。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)金灣,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
假設(shè)一個(gè)數(shù)據(jù)庫(kù)中有兩張表,一張是學(xué)生表StudentInfo,一張是班級(jí)表ClassInfo,兩張表之間用ClassId字段進(jìn)行關(guān)聯(lián)。
如果用SQL Server內(nèi)連接,正常的寫法是這樣的:
Select StudentInfo.*,ClassInfo.* from StudentInfo join ClassInfo on StudentInfo.ClassId=ClassInfo.ClassId
用這種寫法不會(huì)出現(xiàn)笛卡爾積,但是內(nèi)連接是允許省略連接條件的,也就是可以省略掉on后面的內(nèi)容,所以如果寫成這樣:
Select StudentInfo.*,ClassInfo.* from StudentInfo,ClassInfo
也是可以通過(guò)編譯的,但是這樣一來(lái)就產(chǎn)生了一個(gè)笛卡爾積(關(guān)于笛卡爾積的內(nèi)容見文章最后注解)。
但是因?yàn)榕庐a(chǎn)生笛卡爾積而拒絕使用內(nèi)鏈接是不正確的,只要不省略掉連接條件,是不會(huì)產(chǎn)生笛卡爾積的。
具體采用內(nèi)連接還是外連接要看具體問(wèn)題的需要。內(nèi)連接的特性是只顯示符合連接條件的記錄,以剛才的語(yǔ)句為例,查詢結(jié)果只顯示學(xué)生表和班級(jí)表中ClassId相等的記錄。舉例來(lái)說(shuō),如果有條學(xué)生記錄的ClassId字段為空,那么用內(nèi)鏈接將不會(huì)顯示這條學(xué)生記錄,因?yàn)樵诎嗉?jí)表里面是找不到對(duì)應(yīng)的ClassId的。
而外連接就不一樣,以左外連接為例(右外連接類似),它除了顯示符合連接條件的記錄以外,還會(huì)顯示所有左表中的記錄(右外連接就是所有右表中的記錄)。還是以剛才的例子說(shuō)明,如果學(xué)生表中有條學(xué)生記錄的ClassId字段為空,用學(xué)生表左外連接班級(jí)表,那么是會(huì)顯示這條學(xué)生記錄的。
所以如果要求只顯示已有分班的學(xué)生記錄,那么就應(yīng)該用內(nèi)連接查詢;如果要求查詢所有學(xué)生記錄,那么就應(yīng)該采用外連接查詢。
笛卡爾積:
假設(shè)集合A={a,b},集合B={0,1,2},則兩個(gè)集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}??梢詳U(kuò)展到多個(gè)集合的情況。類似的例子有,如果A表示某學(xué)校學(xué)生的集合,B表示該學(xué)校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。
【編輯推薦】
SQL Server添加列及刪除列
SQL Server存儲(chǔ)過(guò)程的單步調(diào)試
sql server系統(tǒng)表說(shuō)明
SQL Server系統(tǒng)表的應(yīng)用
Sql Server全文索引的遷移
當(dāng)前文章:SQL Server內(nèi)連接和外連接的區(qū)別
文章網(wǎng)址:http://www.5511xx.com/article/dpchdde.html


咨詢
建站咨詢
