联接查询

SQL 联接查询

表联接最常见的即是出现在查询模型中,但是实际的用法绝不会局限在查询模型中。较常见的联接查询包括了以下几种类型:Inner Join, Outer Join, Full Join, Cross Join。

image

其中 Outer Join 又会细分为 Left Outer Join 与 Right Outer Join:

difference between LEFT OUTER JOIN and RIGHT OUTER JOIN.

值得一提的是,超过三个表禁止 join,需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。关于 A left join B on condition 的提醒:

  • ON 条件:用于决定如何从 表 B 中检索行,如果表 B 中没有任何数据匹配 ON 条件,则会额外生成一行全部为 NULL 的外部行。
  • WHERE 条件:在匹配阶段,where 条件不会被使用到。仅在匹配阶段完成后,where 子句才会被使用。它将从匹配产生的结果中检索过滤。

Inner Join

Inner Join 是最常用的 Join 类型,基于一个或多个公共字段把记录匹配到一起。Inner Join 只返回进行联结字段上匹配的记录。如:

select * from products inner join categories on products.category_id=categories.category_id

以上语句,只返回物品表中的种类 ID 与种类表中的 ID 相匹配的记录数。这样的语句就相当于:

select * from products, categories where products.category_id=categories.category_id

Inner Join 是在做排除操作,任一行在两个表中不匹配,注定将从结果集中除掉。(我想,相当于两个集合中取其两者的交集,这个交集的条件就是 on 后面的限定)还要注意的是,不仅能对两个表作联结,可以把一个表与其自身进行联结。

Outer Join

Outer Join 包含了 Left Outer Join 与 Right Outer Join. 其实简写可以写成 Left Join 与 Right Join。left join,right join 要理解并区分左表和右表的概念,A 可以看成左表,B 可以看成右表。left join 是以左表为准的.,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).B 表记录不足的地方均为 NULL。right join 和 left join 的结果刚好相反,这次是以右表(B)为基础的,A 表不足的地方用 NULL 填充。

Left Outer Join

Right Outer Join

Full Join

Full Join 相当于把 Left 和 Right 联结到一起,告诉 SQL Server 要全部包含左右两侧所有的行,相当于做集合中的并集操作。

Cross Join

与其它的 JOIN 不同在于,它没有 ON 操作符,它将 JOIN 一侧的表中每一条记录与另一侧表中的所有记录联结起来,得到的是两侧表中所有记录的笛卡儿积。

联接

上一页
下一页