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
?
注:以上例子講的都是兩張表的聯接。如是多表聯接,則從左側開始,每個聯接所生成的輸出表是下一個聯接的左側表。
?