关联查询时用on筛选和用where筛选的区别

刚开始用left join是总是傻傻分不清楚筛选条件到底该放在on之后还是where之后,这里我们先说原理再通过例子方便大家理解

使用left join时,原理简单的可以描述为先将左边的主表结果集查询出来,然后遍历主表结果集,对于每一条主表数据都会根据on后的条件去查询从表,查到了就拿出从表中需要的数据,查不到就为空。也就是说on后的条件仅仅是针对从表数据进行筛选的。这样即使筛选不到也不影响最终的结果集数量。

而筛选条件放在where之后,这个大家清楚,就是对总得结果集进行筛选了。

举个简单例子:现在有两张表,TA是用户表,TB是企业表,其中TA表中用户有归属企业字段(字段为enterprise_id)。TB表中企业又分国企和私企两种类型(企业类型字段为type,1-国企  2-私企)。

现在有两个需求:

1.管理人员需要查看所有用户,如果该用户属于国企单位,还要查看其企业名称,注意私企用户也要显示,只不过私企太多,管理人员并不关心其归属的私企名称

2.管理人员需要查看所有属于国企单位的用户以及其企业名称

我们先上sql:

对于需求1,sql如下:

select TA.*,TB.name as '企业名称' from TA left join TB on ta.enterprise_id=TB.id and TB.type=1;

对于需求2,sql如下:

select TA.*,TB.name as '企业名称' from TA left join TB on ta.enterprise_id=TB.id where TB.type=1;

可以看到需求1的sql,筛选条件是放在On后的,而需求2的sql,筛选条件在where后,那么区别是什么呢?

需求1:结合上面的原理,对于本例来说意味着TA表的用户数据管理员都可以看到,如果用户归属企业类型是国企,管理员还可以看到其企业名称,但如果不是国企则也仅仅是看不到企业名称而已,用户数据还是在的。

需求2:结合上面的原理,对于本例来说非国企的用户都会被过滤掉,管理员看到的只有国企用户

猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/79235219