SQL联接查询
表联接最常见的即是出现在查询模型中,但是实际的用法绝不会局限在查询模型中。较常见的联接查询包括了以下几种类型:Inner Join, Outer Join, Full Join, Cross Join。
其中Outer Join又会细分为Left Outer Join与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一侧的表中每一条记录与另一侧表中的所有记录联结起来,得到的是两侧表中所有记录的笛卡儿积。
联接