做项目写SQL时,在使用left join 和where 时混淆了,网上找到了如下案例,记录一下。
原因:where是先连接然后再筛选
举例:
表1:
表2:
查询语句:select * from tab1 left JOIN tab2 on (tab2.id=tab1.id) where tab2.hobby = "游泳";
结果:
过程:
首先根据左连接生成如下中间表:
再根据where 条件进行过滤,筛选出hobby = "游泳"的一条记录,最终查询结果只有上述的一条记录。 所以left join 失效。
解决办法:将where 换成and 即:
查询的具体过程:将(tab2.hobby='游泳')作为条件放到 left join on 里面时,是对tab2里面的记录做过滤,也就是只会查出tab2中hobby='游泳的这一条数据和tab1进行拼接,具体查询结果如下所示。
查询语句:select * from tab1 left join tab2 on (tab2.id=tab1.id) and (tab2.hobby='游泳');
————————————————