以left join为例:
on:生成临时表时使用的条件,无论条件是否生效,都会返回左表的行(left join性质影响)
where:生成临时表之后使用的条件,一定会过滤不满足设定条件的行
示例表:
| id | g_name |
|---|---|
| 1 | Anna |
| 2 | Bill |
| 3 | Clark |
| 4 | Dell |
| 5 | Edward |
| id | b_name | gf_id | salary |
|---|---|---|---|
| 1 | a | 1 | 8000 |
| 2 | b | 2 | 9000 |
| 3 | c | 3 | 10000 |
| 4 | d | 4 | 11000 |
| 5 | e | 6000 |
原始查询
select b.b_name,b.salary,g.g_name
from boy b
left join girl g on b.gf_id=g.id
结果:
| b_name | salary | g_name |
|---|---|---|
| a | 8000 | Anna |
| b | 9000 | Bill |
| c | 10000 | Clark |
| d | 11000 | Dell |
| e | 5000 | (NULL) |
原始查询+on(两个on使用and连接,可以看做( on b.gf_id=g.id,on salary>9000),但不能这么写,会有语法错误)
select b.b_name,b.salary,g.g_name
from boy b
left join girl g on b.gf_id=g.id and salary>9000
结果:
| b_name | salary | g_name |
|---|---|---|
| c | 11000 | Clark |
| d | 10000 | Dell |
| a | 8000 | (NULL) |
| b | 9000 | (NULL) |
| e | 5000 | (NULL) |
原始查询+where
select b.b_name,b.salary,g.g_name
from t_boy b left
join t_girl g on b.gf_id=g.id
where salary>9000
结果:
| b_name | salary | g_name |
|---|---|---|
| c | 11000 | Clark |
| d | 10000 | Dell |
本文通过具体的SQL示例,详细解释了LEFT JOIN中ON和WHERE子句的不同作用。ON用于定义临时表生成的条件,即使条件不满足也会返回左表的所有行;而WHERE则在临时表生成后进行过滤,不满足条件的行将被排除。

1676

被折叠的 条评论
为什么被折叠?



