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 
注:以上例子讲的都是两张表的联接。如是多表联接,则从左侧开始,每个联接所生成的输出表是下一个联接的左侧表。