以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 |