详解T-SQL的联接机制
来源:互联网 发布:开淘宝网店进货渠道 编辑:程序博客网 时间:2024/05/18 16:35
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的联接机制
- 详解T-SQL的联接机制
- sql的联接查询
- SQL的联接方式
- sql的左联接
- T-SQL 查询优化之联接顺序
- 【T-SQL基础】02.联接查询
- sql 左联接,右联接,内联接的比较
- SQL中表的联接(内联接,左联接,右联接,外联接,交叉联接)
- T-SQL查询笔记1:当使用联接时on和where子句的区别
- SQL数据库的联接这符串
- 详解数据库的各种联接
- 解决一个.NET联接SQL的问题
- (SQL)Select的四种联接方式
- 关于sql中联接的问题
- sql语句跨数据库的表联接
- sql的四种联接小总
- angularJS-Scope 概述
- LeetCode240. Search a 2D Matrix II题解
- 图解HTTP读书笔记1
- [BZOJ1242][Zju1015 Fishing Net弦图判定][完美消除序列]
- JZOJ3601. 【广州市选2014】Tree
- 详解T-SQL的联接机制
- Dubbo学习笔记(五)------DubboProtocol理解之Refer
- angularJS-创建自定义的指令
- 树莓派3B安装影音系统OSMC
- Delphi写dll文件
- 轻松入门git操作
- angularJS-如何使用 Scope
- mysql5.5升级为5.7遇到错误ERROR 1054 (42S22): Unknown column 'password_last_changed' in 'mysql.user'
- angularJS-验证用户输入