mysql在left join后的where条件里过滤join表将变为inner join

sql1:此时是正常的左连接

select user.name,dept.dept_name from user left join dept on dept.id= user.dept_id and dept.is_deleted='N' where user.is_delete='N'

此时将返回全部user并附带所属的单位(有可能有些user没有dept)
那假如想查出单位名为:“希望小学”的教师记录,但是不想使用inner join,那要怎么处理呢?此时看sql2

sql2:在where里过滤join表的条件,使其变成内连接

select user.name,dept.dept_name from user left join dept on dept.id= user.dept_id and dept.is_deleted='N' 
where user.is_delete='N' and dept.dept_name='希望小学'

此时就只查出单位为“希望小学”的教师记录了,变成了inner join,实际上两者是一样的,mysql可能内部会自动转化成inner join,因为实测速度变快了为inner join的速度

select user.name,dept.dept_name from user inner join dept on dept.id= user.dept_id 
and dept.dept_name='希望小学'
and dept.is_deleted='N' where user.is_delete='N'

这种动态left join变inner join方式可以用于mybatis,也是以上场景

select user.name,dept.dept_name from user left join dept on dept.id= user.dept_id and dept.is_deleted='N' 
where user.is_delete='N' 
<if test="et.deptName != null and et.deptName != ''">
            and dept.dept_name like concat('%',#{et.deptName},'%')
        </if>
### MySQLLEFT JOIN 与 FILTERED LEFT JOIN 的性能和结果差异 #### 结果差异 当直接使用 `LEFT JOIN` 时,所有的左数据都会被保留下来,即使右没有匹配的数据也会返回 NULL 值。然而,在 `WHERE` 子句中加入额外的过滤条件可能会改变这种行为[^1]。如果 `WHERE` 条件包含了针对右列的非空约束(如 `IS NOT NULL`),MySQL 可能会将外连接转换为内连接,从而导致结果类似于 `INNER JOIN` 而不再是完整的 `LEFT JOIN` 行为[^2]。 对于经过预过滤后的 `LEFT JOIN` (即先对参与联结的格应用某些筛选标准再做联合运算),由于已经减少了待处理的数据量,因此其最终输出可能更接近于仅包含满足特定业务逻辑需求的那一部分记录集合,而不是单纯依赖后续阶段施加的进一步限制来裁剪整个关联产物。 #### 性能对比分析 从理论上讲,“Filtered Left Join”的方式通常能够带来更好的查询现,原因在于它可以提前削减不必要的计算负担——通过尽早剔除不符合要求的部分,减少实际参与到昂贵笛卡尔乘积操作的元素数量,进而降低整体复杂度并加快响应速度[^4]。 另一方面,尽管单纯的 `LEFT JOIN` 实现起来更为简洁直观,但在存在严格的选择性或者涉及大量无意义组合的情况下,则可能导致资源浪费以及延长执行周期等问题;尤其是在面对大规模数据集时尤为明显。不过值得注意的是,具体到每一个实例上的相对优劣还需要考虑多种因素共同作用的结果,比如索引的存在与否及其质量、统计信息的新鲜程度等都可能显著影响两者的实际效能差距[^5]。 ```sql -- Example of Filtered Left Join Approach SELECT l.*, r.column_name FROM left_table AS l LEFT JOIN ( SELECT * FROM right_table WHERE some_condition = 'value' ) AS r ON l.key_column = r.foreign_key; ``` 以上代码片段展示了如何实现一个带有前置过滤步骤的Left Join过程。这我们首先限定右侧子查询只获取符合条件的数据项,然后再将其作为临时结果集与左侧主进行链接动作。 综上所述,虽然两种方法都能达到相似的目的,但从效率角度出发推荐优先尝试采用“Filtered Left Join”模式除非特殊情况下证明后者具备绝对优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值