SQL中 LEFT JOIN ,RIGHTJOIN,INNER JOIN 的使用及优先级浅析
2013-06-21 00:27
267 查看
首先了解JOIN的基本概念:
join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
FULL JOIN 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
通俗的解释是INNER JOIN就类似于查询多个表并且在WHERE之后加上联接这些表的唯一限定条件,以下两句SQL语句,返回相同的结果:
以此类推,LEFT JOIN 返回左表的所有行,也就是即使右表中无法找到对应左表记录的数据,也会返回数据。RIGHT JOIN 类似。而FULL JOIN就是LEFT 和 RIGHT 的并集,只要存在匹配就返回行。
而本文需要解决或者验证的问题是在进行多表查询的时候,LEFT JOIN ,RIGHT JOIN 会不会有优先级。
为了方便,就拿最简单的三表查询进行检验。在三表查询中,可能出现的情况也就是9种(暂时不考虑FULL JOIN)。
首先运行下面语句:
得到的结果如图:
![](http://images.cnitblog.com/blog/309352/201306/21001713-c79e24fbf5544ffb80101a8cdde938ef.jpg)
当在上面语句之后再JOIN一张表的时候:
得到的结果如图:
![](http://images.cnitblog.com/blog/309352/201306/21002610-108b39c17bb04fd7b264e2790be8a8c7.jpg)
由此得到猜想,第二条语句首先进行了第一个JOIN,然后将此结果进行第二次JOIN,也就是是按照从左到右的顺序进行JOIN。而为了验证此猜想,就要进行其他的检验。方法很简单,依次按照先LEFT JOIN 后LEFT JOIN或者先RIGHT JOIN后LEFT JOIN的顺序进行检验,当检查完每个结果集时,是否遵循先前的猜想。
join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。
RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。
FULL JOIN 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。
通俗的解释是INNER JOIN就类似于查询多个表并且在WHERE之后加上联接这些表的唯一限定条件,以下两句SQL语句,返回相同的结果:
select * from tb_Course as c,tb_CourseType as ct where c.ctpID=ct.ID select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID
以此类推,LEFT JOIN 返回左表的所有行,也就是即使右表中无法找到对应左表记录的数据,也会返回数据。RIGHT JOIN 类似。而FULL JOIN就是LEFT 和 RIGHT 的并集,只要存在匹配就返回行。
而本文需要解决或者验证的问题是在进行多表查询的时候,LEFT JOIN ,RIGHT JOIN 会不会有优先级。
为了方便,就拿最简单的三表查询进行检验。在三表查询中,可能出现的情况也就是9种(暂时不考虑FULL JOIN)。
首先运行下面语句:
select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID
得到的结果如图:
![](http://images.cnitblog.com/blog/309352/201306/21001713-c79e24fbf5544ffb80101a8cdde938ef.jpg)
当在上面语句之后再JOIN一张表的时候:
select * from tb_Course as c inner join tb_CourseType as ct on c.ctpID=ct.ID inner join tb_Teacher as t on t.CID=c.ID
得到的结果如图:
![](http://images.cnitblog.com/blog/309352/201306/21002610-108b39c17bb04fd7b264e2790be8a8c7.jpg)
由此得到猜想,第二条语句首先进行了第一个JOIN,然后将此结果进行第二次JOIN,也就是是按照从左到右的顺序进行JOIN。而为了验证此猜想,就要进行其他的检验。方法很简单,依次按照先LEFT JOIN 后LEFT JOIN或者先RIGHT JOIN后LEFT JOIN的顺序进行检验,当检查完每个结果集时,是否遵循先前的猜想。
相关文章推荐
- sql中left join(left outer join)、inner join的使用,right join(right outer join)的用法和left join的相反就可以了。
- sql连接left join、right join、inner join的使用
- sql表连接查询的区别`inner join、left join、rightjoin、outer join举例说明
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
- SQL优化--使用内连接(inner join)代替外连接(left join,right join) (转)
- SQL中Left Join、Right Join和Inner Join的使用
- sql连接left join、right join、inner join的使用
- SQL优化--使用内连接(inner join)代替外连接(left join,right join) (转)
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
- sql T_sql 关于left join ,right join ,inner join 的使用以及区别
- SQL优化--使用内连接(inner join)代替外连接(left join,right join) (转)
- Access SQL中Left Join、Right Join和Inner Join的使用
- SQL优化--使用内连接(inner join)代替外连接(left join,right join)
- SQL中left join和inner join配合使用
- sql语句中left join、 inner join的使用
- Access SQL中Left Join、Right Join和Inner Join的使用
- Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式
- sql(left join,right jion,inner join)连接详解
- sql update delete 中 使用 inner join
- sql之left join、right join、inner join的区别