详解T-SQL的联接机制
T-SQL的聯(lián)接分三種類型:
交叉聯(lián)接 ( cross join )
內部聯(lián)接 ? ?(inner join)
外部聯(lián)接 ? ?(outer join)
每種聯(lián)接在邏輯上經(jīng)歷不同的階段,分為笛卡爾乘積、篩選、添加外部行,如圖:
| 聯(lián)接類型 | 階段 |
| 交叉聯(lián)接 | 笛卡兒乘積 |
| 內部聯(lián)接 | 笛卡爾乘積、篩選 |
| 外部聯(lián)接 | 笛卡兒乘積、篩選、添加外部行 |
接下來將以例子逐個講解三種聯(lián)接,假設有一張表a, 如下:
id
--
1
2
3
4
和一張表b ,如下:
id
--
3
4
5
6
?
1、交叉聯(lián)接是最簡單的聯(lián)接,它只進行笛卡兒乘積。如果表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、內聯(lián)接進行了笛卡兒乘積和篩選兩個階段。在寫法上,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、外部聯(lián)接是指左外聯(lián)接(left outer join)、右外聯(lián)接(right outer join)、全外聯(lián)接(full outer join)。寫法上,outer 是可選的。?
? ? 外聯(lián)接進行了笛卡爾乘積、篩選、和添加外部行三個階段。相對于內聯(lián)接,外聯(lián)接多了一個添加外部行的階段,也就是說在進行完篩選后,把該保留的記錄添加回輸出表中。
?
1) 所謂左外聯(lián)接就是保留左側表的所有記錄,如有不匹配列的記錄,則用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) 右外聯(lián)接就是保留右側表的所有記錄,如有不匹配列的記錄,則用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) 全外聯(lián)接就是保留兩側表的所有記錄,如有不匹配列的記錄,則用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
?
注:以上例子講的都是兩張表的聯(lián)接。如是多表聯(lián)接,則從左側開始,每個聯(lián)接所生成的輸出表是下一個聯(lián)接的左側表。
?
轉載于:https://www.cnblogs.com/victorguan/p/6480050.html
總結
以上是生活随笔為你收集整理的详解T-SQL的联接机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站权重与排名浅谈
- 下一篇: poj 1679: The Unique