left join on的条件与where中的条件

本文探讨了在SQL中联查表时,联查条件放置在ON与WHERE后的区别。通过具体例子说明,ON条件先于WHERE执行,影响左连接结果。理解这一差异对优化查询效率至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

联查表时,联查条件既可以放在 ON 之后,也可以放在 WHERE 之后,两者有什么区别呢?


有以下两张表

left_table

vstr
Sailing_1left_1
Sailing_2left_2
Sailing_3left_3
Sailing_4left_4

right_table

vstrstatus
Sailing_11right_13
Sailing_12right_22
Sailing_3right_31
Sailing_4right_40

在没有其他条件的限制下,联查这两张表,得到 结果0 如下:

select l.str AS left_str,r.str AS right_str,r.status from left_table l 
left join right_table r on l.v = r.v order by 1, 2;
left_strright_strstatus
left_1
left_2
left_3right_31
left_4right_40

有限制条件 status = 1

1)在 WHERE 后添加条件

sql_1:

select l.str AS left_str,r.str AS right_str,r.status from left_table l 
left join right_table r on l.v = r.v where r.status = 1 order by 1,2;

此时得到的 结果1 如下:

left_strright_strstatus
left_3right_31

2)在 ON 后添加条件

sql_2:

select l.str AS left_str,r.str AS right_str,r.status from left_table l 
left join right_table r on l.v = r.v and r.status = 1 order by 1,2;

得到的 结果2 如下:

left_strright_strstatus
left_1
left_2
left_3right_31
left_4

出现以上区别,原因是 ON 的执行顺序先于 WHERE(WHERE 先于 HAVING)。

sql_1的执行步骤,先生成 结果0 中间表,再对中间表过滤 status=1。

sql_2,也可以像下面这样写

select l.str AS left_str,r.str AS right_str,r.status from left_table l 
left join (select * from right_table where status = 1) r on l.v = r.v order by 1,2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值