SQL內外連線詳解

2022-02-23 07:28:15 字數 2679 閱讀 7738

有兩個表a和表b。

表a結構如下:

aid:int;標識種子,主鍵,自增id

aname:varchar

資料情況,即用select * from a出來的記錄情況如下圖1所示:

圖1:a表資料

表b結構如下:

bid:int;標識種子,主鍵,自增id

bnameid:int

資料情況,即用select * from b出來的記錄情況如下圖2所示:

圖2:b表資料

為了把bid和aid加以區分,不讓大家有誤解,所以把bid的起始種子設定為100。

有sql基本知識的人都知道,兩個表要做連線,就必須有個連線字段,從上表中的資料可以看出,在a表中的aid和b表中的bnameid就是兩個連線字段。

下圖3說明了連線的所有記錄集之間的關係:

圖3:連線關係圖

現在我們對內連線和外連線一一講解。

1.內連線:利用內連線可獲取兩表的公共部分的記錄,即圖3的記錄集c

語句如下:select * from a join b on a.aid=b.bnameid

執行結果如下圖4所示:

圖4:內連線資料

其實select * from a,b where a.aid=b.bnameid與select * from a join b on a.aid=b.bnameid的執行結果是一樣的。

2.外連線:外連線分為兩種,一種是左連線(left join)和右連線(right join)

(1)左連線(left join):即圖3公共部分記錄集c+表a記錄集a1。

語句如下:select * from a left join b on a.aid=b.bnameid

執行結果如下圖5所示:

圖5:左連線資料

說明:在語句中,a在b的左邊,並且是left join,所以其運算方式為:a左連線b的記錄=圖3公共部分記錄集c+表a記錄集a1

在圖3中即記錄集c中的存在的aid為:2 3 6 7 8

圖1中即表a所有記錄集a中存在的aid為:1 2 3 4 5 6 7 8 9

表a記錄集a1中存在的aid=(圖1中即a表中所有aid)-(圖3中即記錄集c中存在的aid),最終得出為:1 4 5 9

由此得出圖5中a左連線b的記錄=圖3公共部分記錄集c+表a記錄集a1,

最終得出的結果圖5中可以看出bnameid及bid非null的記錄都為圖3公共部分記錄集c中的記錄;bnameid及bid為null的aid為1 4 5 9的四筆記錄就是表a記錄集a1中存在的aid。

(2)右連線(right join):即圖3公共部分記錄集c+表b記錄集b1。

語句如下:select * from a right join b on a.aid=b.bnameid

執行結果如下圖6所示:

圖6:右連線資料

說明:在語句中,a在b的左邊,並且是right join,所以其運算方式為:a右連線b的記錄=圖3公共部分記錄集c+表b記錄集b1

在圖3中即記錄集c中的存在的aid為:2 3 6 7 8

圖2中即表b所有記錄集b中存在的bnameid為:2 3 6 7 8 11

表b記錄集b1中存在的bnameid=(圖2中即b表中所有bnameid)-(圖3中即記錄集c中存在的aid),最終得出為:11

由此得出圖6中a右連線b的記錄=圖3公共部分記錄集c+表b記錄集b1,

最終得出的結果圖6中可以看出aid及aname非null的記錄都為圖3公共部分記錄集c中的記錄;aid及aname為null的aid為11的記錄就是表b記錄集b1中存在的bnameid。

總結:通過上面的運算解說,相信很多人已經想到,上面的情況(包括圖3的關係圖)說明的都只是a在b的左邊的情況,

以下語句b在a的右邊的又會出現什麼情況呢?

select * from b left join a on a.aid=b.bnameid

select * from b right join a on a.aid=b.bnameid

其實對圖3左右翻轉一下就可以得出以下結論:

select * from b left join a on a.aid=b.bnameid和select * from a right join b on a.aid=b.bnameid所得出的記錄集是一樣的

而select * from b right join a on a.aid=b.bnameid和select * from a left join b on a.aid=b.bnameid所得出的記錄集也是一樣的。

詳細出處參考:

sql內外連線的區別

專案當中,需要將sql server中的部分資料匯入mongo中,由於sql是關係型資料庫的原因,需要聯合多表進行查詢,因此,了解了下sql中內外連線的相關概念,以作備註 1 內聯接 典型的聯接運算,使用像 或 之類的比較運算子 包括相等聯接和自然聯接。內聯接使用比較運算子根據每個表共有的列的值匹配...

SQL內外左右交叉連線

概念 根據兩個表或多個表的列之間的關係,從這些表中查詢資料。目的 實現多個表查詢操作。一般是用作關聯兩張或兩張以上的資料表時用的。看起來有點抽象,我們舉個例子,做兩張表 學生表 t student 和班級表 t class sql 92標準所定義的from子句的連線語法格式為 from join t...

sql內外鏈結,交叉連線

實際的專案,存在多張表的關聯關係。不可能在一張表裡面就能檢索出所有資料。如果沒有表連線的話,那麼我們就需要非常多的操作。比如需要從a表找出限制性的條件來從b表中檢索資料。不但需要分多表來操作,而且效率也不高。比如書中的例子 複製 如下 select fid from t customer where...