一、前言
前几天项目中,写sql时本想通过 a left b join on and 后面的条件来使查出的两条记录变成一条,奈何发现还是有两条。在此记录一下,on与where的区别。
二、on
原始数据展示
select t1.*,t2.* from t_test_staff t1 left join t_test_department t2 on t1.departmentid = t2.id and t;
查询结果

on后面跟and,左表条件
select t1.*,t2.* from t_test_staff t1 left join t_test_department t2 on t1.departmentid = t2.id and t1.name = '员工1';
查询结果

on后面跟and,右表条件
select t1.*,t2.* from t_test_staff t1 left join t_test_department t2 on t1.departmentid = t2.id and t2.departmentname = '研发部';
查询结果

on 条件用于定义两个表之间的连接条件,它决定了哪些行会被连接在一起。在 left join 中,on 条件决定了右表(被连接的表)中的哪些行会被匹配到左表(主表)的行。
在这个例子中,table1 中的每一行都会出现在结果集中,无论 table2 中是否有匹配的行。如果 table2 中有匹配的行,则这些行的数据会被包含进来;如果没有匹配的行,则 table2 的列会显示为 null。
三、where
on后面跟where,左表条件
select t1.*,t2.* from t_test_staff t1 left join t_test_department t2 on t1.departmentid = t2.id where t1.name = '员工1';
查询结果

on后面跟where,右表条件
select t1.*,t2.* from t_test_staff t1 left join t_test_department t2 on t1.departmentid = t2.id where t2.departmentname = '研发部';
查询结果

where 条件用于过滤结果集,它在连接操作之后应用。这意味着 where 条件会进一步筛选已经通过 on 条件连接好的结果集。
在这个例子中,left join 依然会先执行,将 table1 中的每一行与 table2 中的匹配行连接起来(如果有的话)。然后,where 条件会过滤掉那些 table2.some_column 为 null 的行。
由于 left join 保证了 table1 中的每一行都会出现在结果集中,where 条件实际上将结果集转换为了一个类似于 inner join 的结果集,因为它排除了所有 table2 中没有匹配行的 table1 行(即 table2 列值为 null 的行)。
四、总结
on 条件:用于定义连接条件,决定如何连接两个表。在 left join 中,它会保留左表中的所有行,并根据条件匹配右表中的行。
where 条件:用于过滤结果集,它在连接操作之后应用。在 left join 中,使用 where 条件可以进一步筛选结果集,但需要注意它会排除所有不满足条件的行,包括那些由于 left join 而产生的 null 值行。
到此这篇关于mysql中left join后用on与where的区别全面解析的文章就介绍到这了,更多相关mysql left join on与where区别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论