连接 (读书笔记)

来源:互联网 发布:opencv java 图片人脸 编辑:程序博客网 时间:2024/05/30 07:13

1 连接

Join 分下列几种形式:

  • Inner Join
  • Outer Join (Left 和 Right)
  • Full Join
  • Cross Join

2 内部连接

在表中存在至少一个匹配时,inner join关键字返回行。

select pbe.*, HumanResources.Employee.BusinessEntityID From Person.BusinessEntity pbe Inner join HumanResources.Employee hre on pbe.BusinessEntityID = hre.BusinessEntityID

以上代码会运行报错,原因:代码中别名和表可以混合使用,但是只要确定了使用表的别名,则必须一直使用别名。

内部连接与其他连接不同之处在于,内部链接是一个排他连接 —— 即排除在两表中没有匹配的所有记录。
因为 inner join 是默认连接类型,所以写法上常常可以不写 inner 关键字。
Notice: null值之间的比较 —— null值不等于null值

3 外部连接

Left Join 关键字从左表那里返回所有的行,即使在右表中没有匹配的行。Right Join 则从右。通常使用Join是解决多表连接最好的方法。

处理复杂的外部连接

select v.VendorName, a.Address from Vendors v        left join VendorAddress va on v.VendorID = va.VendorID       Join Address a on va.Address = a.AddressID 

过程中,out join 会包含表中所有信息,而接下来的 inner join 会丢弃表中的某些记录。想要保留表中的所有数据有2种改法:

  1. 添加另一个外部连接
select v.VendorName, a.Address from Vendors v       left join VendorAddress va on v.VendorID = va.VendorID       left join Address a on va.AddressID = a.AddressID
  1. 改变连接的顺序
Select v.VendorName, a.Address from VendorAddress va        join Address a on va.AddressID = a.AddressID       right join Vendors v on v.VendorID = va.VendorID

总结: 第二种解决方法更好。应先使用内部连接,尽量少使用外部连接,这样可以减少代码中的错误。

4 完全连接

Full join 用来将join两侧的数据全部匹配,并返回所有的记录,不论记录在join的哪一侧的表中。完全连接在实战中几乎很好使用。

5 交叉连接

交叉连接不使用 on 运算符,而将join左侧的所有记录与另一侧的所有记录连接。简而言之,返回的是join两侧表记录的笛卡儿积。

交叉连接与任何其他连接语法相似,不过它使用cross关键字,示例如下:

select v.VendorName, a.Address from Vendors v        Cross Join Address a

6 联合

Uion是一个特殊的运算符,用于使两个或两个以上的查询产生一个结果集。联合不是真正的连接,作用更像将一个查询返回的数据附加到另一个查询结果的末尾。

当使用 union 处理查询时,要注意几个关键点:

  • 查询的列数要相同
  • union 返回的结果集的标题仅从第一个查询获得
  • 查询中对应列的数据类型也必须隐式一致,长度最好也一致(过长可能会被忽略)
  • 与其他非 union查询不同, union查询的默认返回选项为 distinct,而不是all。 除非在 union查询中使用All关键字,才能返回重复的行。
0 0