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 輸出了兩次,然而我只需要輸出...