以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 |
来源:51CTO
作者:King_crazy
链接:https://blog.csdn.net/King_crazy/article/details/100180975