你的位置:首页 > 数据库

[数据库]连接、关联、JOIN、APPLY(SQL Server)


连接方式

连接类型

个人总结

阐述(生成两个集合的约束笛卡儿积)

INNER    JOIN

内连接

关联相同的(用于查找关联的信息)

FROM C AS c [INNER] JOIN D AS d ON c.xx = d.xx
前面的查询表达式将 ON 条件为 true 的每一个左侧集合元素与其右侧集合的配对元素组合起来。
如果未指定 ON 条件,则 INNER JOIN 退化为 CROSS JOIN。

LEFT     JOIN

左连接

左面全保留(可以用来查找左面多余的,右面为NULL)

FROM C AS c LEFT OUTER JOIN D AS d ON c.xx = d.xx
前面的查询表达式将 ON 条件为 true 的每一个左侧集合元素与其右侧集合的配对元素组合起来。
如果 ON 条件为 false,表达式仍处理与右侧元素(值为 null)配对的单个左侧元素实例。

RIGHT   JOIN

右连接

右面全保留(可以用来查找右面多余的,左面为NULL)

FROM C AS c LEFT OUTER JOIN D AS d ON c.xx = d.xx
前面的查询表达式将 ON 条件为 true 的每一个右侧集合元素与其左侧集合的配对元素组合起来。
如果 ON 条件为 false,表达式仍处理与左侧元素(值为 null)配对的单个左侧元素实例。

FULL     JOIN

完全连接

显示左右关联上和左右关联不上的,关联不上为NULL

FROM C AS c FULL OUTER JOIN D AS d ON c.xx = d.xx
前面的查询表达式将 ON 条件为 true 的每一个左侧集合元素与其右侧集合的配对元素组合起来。
如果 ON 条件为 false,表达式仍处理与右侧元素(值为 null)配对的一个左侧元素实例。
此外,它还处理与左侧元素(值为 null)配对的一个左侧元素实例。

CROSS  JOIN

交叉连接

左右互相1对全部连接

FROM C AS c CROSS JOIN D as d
指定两个表的叉积,返回相同的行。

 

Image

 

延伸学习

关于EXCEPT和INTERSECT的用法

EXCEPT

也是去重的, 但是它在去掉两个或多个集合中重复数据之后, 只会保留第一个结果集中的数据
查询上面有下面没有的
SELECT * FROM [dbo].[JOIN1]
EXCEPT
SELECT * FROM [dbo].[JOIN2]

INTERSECT 就是查询两个结果集的并集, 利用上面的数据
查询两个结果集中相同的
SELECT * FROM [dbo].[JOIN1]
INTERSECT
SELECT * FROM [dbo].[JOIN2]
学习地址 http://blog.csdn.net/tjvictor/article/details/5346024

 

 

 

 

 

 

 

 

 

 

 

物理连接
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