联查表时,联查条件既可以放在 ON 之后,也可以放在 WHERE 之后,两者有什么区别呢?
有以下两张表
left_table
v | str |
---|---|
Sailing_1 | left_1 |
Sailing_2 | left_2 |
Sailing_3 | left_3 |
Sailing_4 | left_4 |
right_table
v | str | status |
---|---|---|
Sailing_11 | right_1 | 3 |
Sailing_12 | right_2 | 2 |
Sailing_3 | right_3 | 1 |
Sailing_4 | right_4 | 0 |
在没有其他条件的限制下,联查这两张表,得到 结果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_str | right_str | status |
---|---|---|
left_1 | ||
left_2 | ||
left_3 | right_3 | 1 |
left_4 | right_4 | 0 |
有限制条件 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_str | right_str | status |
---|---|---|
left_3 | right_3 | 1 |
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_str | right_str | status |
---|---|---|
left_1 | ||
left_2 | ||
left_3 | right_3 | 1 |
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;