詳解T SQL的聯接機制

2022-08-20 05:39:13 字數 2552 閱讀 1895

t-sql的聯接分三種型別:

交叉聯接 ( cross join )

內部聯接    (inner join)

外部聯接    (outer join)

每種聯接在邏輯上經歷不同的階段,分為笛卡爾乘積、篩選、新增外部行,如圖:

聯接型別

階段

交叉聯接

笛卡兒乘積

內部聯接

笛卡爾乘積、篩選

外部聯接

笛卡兒乘積、篩選、新增外部行

接下來將以例子逐個講解三種聯接,假設有一張表a, 如下:

id --

1

2

3

4

和一張表b ,如下:

id --

3 4

5 6

1、交叉聯接是最簡單的聯接,它只進行笛卡兒乘積。如果表a有x條記錄,表b有y條記錄,cross join 之後會生成x*y條記錄。 

select a.id as aid,b.id as bid from a cross join b 

aid bid

--- ---

1 3

2 3

3 3

4 3

1 4

2 4

3 4

4 4

1 5

2 5

3 5

4 5

1 6

2 6

3 6

4 6

2、內聯接進行了笛卡兒乘積篩選兩個階段。在寫法上,inner join 的 inner是可選的,並且在on 後面指定篩選的條件(條件可以相等也可以不相等)。

select a.id as aid, b.id as bid from a

inner join b on a.id=b.id

aid bid

--- ---

3 3

4 4

select a.id as aid,b.id as bid from a

join b on a.id>b.id

aid bid

--- ---

4 3

如上結果,on指定的條件把不符合的記錄給過濾掉了。

3、外部聯接是指左外聯接(left outer join)、右外聯接(right outer join)、全外聯接(full outer join)。寫法上,outer 是可選的。 

外聯接進行了笛卡爾乘積篩選、和新增外部行三個階段。相對於內聯接,外聯接多了乙個新增外部行的階段,也就是說在進行完篩選後,把該保留的記錄新增回輸出表中。

1) 所謂左外聯接就是保留左側表的所有記錄,如有不匹配列的記錄,則用null 填充

select a.id as aid,b.id as bid from a 

left outer join b on a.id=b.id 

aid bid 

--- ------

1 (null)

2 (null)

3 3

4 4

2) 右外聯接就是保留右側表的所有記錄,如有不匹配列的記錄,則用null 填充

select a.id as aid,b.id as bid from a 

right join b on a.id=b.id 

aid bid

------ ---

3 3

4 4

(null) 5

(null) 6

3) 全外聯接就是保留兩側表的所有記錄,如有不匹配列的記錄,則用null 填充

select a.id as aid,b.id as bid from a 

full join b on a.id=b.id 

aid bid

------ ------

1 (null)

2 (null)

3 3

4 4

(null) 5  

(null) 6

詳解T SQL的聯接機制

t sql的聯接分三種型別 交叉聯接 cross join 內部聯接 inner join 外部聯接 outer join 每種聯接在邏輯上經歷不同的階段,分為笛卡爾乘積 篩選 新增外部行,如圖 聯接型別 階段 交叉聯接 笛卡兒乘積 內部聯接 笛卡爾乘積 篩選 外部聯接 笛卡兒乘積 篩選 新增外部行...

TCP協議的連線機制 三次握手訊號的原理

這篇文章是寫給什麼人看的?網路程式設計是現代計算機程式設計中不可缺少的乙個環節,這裡面的程式設計師主要分為兩種型別 一種是專門搞網路程式設計的,估計是一些通訊專業的童鞋,他們的任務是管理整個網路的通訊 第二種是使用網路作為乙個傳輸介質的的,最常見的就是使用socket程式設計的人,他們一般只是使用一...

關於feof機制的詳解

在擼 的時候遇到乙個問題,使用feof fp 做為檔案結束檢測,使用fscanf讀取檔案,但是往往會 讀取最後一行兩次。測試文件如下 測試 如下 include include int main fclose fp return 0 測試結果如下 從結果上來看,test 輸出了兩次,然而我只需要輸出...