连接方式 | 连接类型 | 个人总结 | 阐述(生成两个集合的约束笛卡儿积) |
INNER JOIN | 内连接 | 关联相同的(用于查找关联的信息) | FROM C AS c INNER JOIN D AS d ON c.xx = d.xx |
LEFT JOIN | 左连接 | 左面全保留(可以用来查找左面多余的,右面为NULL) | FROM C AS c LEFT OUTER JOIN D AS d ON c.xx = d.xx |
RIGHT JOIN | 右连接 | 右面全保留(可以用来查找右面多余的,左面为NULL) | FROM C AS c RIGHT OUTER JOIN D AS d ON c.xx = d.xx |
FULL JOIN | 完全连接 | 显示左右关联上和左右关联不上的,关联不上为NULL | FROM C AS c FULL OUTER JOIN D AS d ON c.xx = d.xx |
CROSS JOIN | 交叉连接 | 左右互相1对全部连接 | FROM C AS c CROSS JOIN D as d |
延伸学习 | 关于EXCEPT和INTERSECT的用法 |
EXCEPT | 也是去重的, 但是它在去掉两个或多个集合中重复数据之后, 只会保留第一个结果集中的数据 |
INTERSECT | 就是查询两个结果集的并集, 利用上面的数据 |
学习地址 |
物理连接 | Nested Loops Join(嵌套循环连接) | Merge Join(合并连接) | Hash Join(哈希连接) |
最适合于 | 相对较小的两个数据集, inner table在做Join的字段上有一个索引 | 输入数据集大小中等或较大, 且在Join字段上有索引帮助排序, 或者语句要求返回一个排好序的结果集 | 输入数据集较大。 尤其适合于Data warehouse 环境下的那些复杂的查询语句 |
并发性 | 能够支持大量的并发用户同时运行 | 有索引支持的Many-to-one的join并发性较好, Many-To-Many的就差了 | 最好同时只有少数用户在同时运行 |
Join时要否两个字段相等 | 不要 | 要(除非是full outer join) | 要 |
要否使用内存资源 | 不使用 | 不使用(如果要为Merge Join做排序,可能要使用) | 使用 |
要否使用tempdb | 不使用 | many-to-many join要使用 | 使用 |
输入数据集要否排序 | 不要 | 要 | 不要 |
希望输入数据集排序否 | 希望outer input是排序的 | 是的 | 不要 |
学习地址 | http://www.cnblogs.com/CareySon/archive/2013/01/09/2853094.html |
APPLY | 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。表值函数作为右输入,外部表表达式作为左输入。通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。 |
学习地址 | https://technet.microsoft.com/zh-cn/library/ms175156(v=sql.105).aspx |
http://blog.csdn.net/ylqmf/article/details/5316694 | |
http://www.cnblogs.com/yukaizhao/archive/2008/04/30/cross_apply.html |