在使用多表关联查询时,连接条件放在on和where得到的结果集是不同的
数据准备
1 | select * from person; |
内连接、全连接
1 | select * from person p inner join account a on p.id=a.id; |
内连接的结果集返回交集数据
使用on条件1
select * from person p inner join account a on p.id=a.id and p.id!=4;
使用where条件1
select * from person p inner join account a on p.id=a.id where p.id!=4;
结果集相同,可知内连接时过滤条件使用在on和where上时作用相同
左连接
1 | select * from person p inner join account a on p.id=a.id; |
左连接的结果集返回左表数据,不满足连接条件来自右表字段为空
使用on条件1
select * from person p left join account a on p.id=a.id and p.id!=4;
id为4的记录还在,这是由left join的特性决定的,使用left join时on后面的条件只对右表有效(可以看到右表的id=4的记录没了)
使用where条件1
select * from person p left join account a on p.id=a.id where p.id!=4;
可见id为4的记录没了
总结
其实on上的过滤条件就是先对右表数据过滤,再与左表连接,再生成连接中间表
where是对中间表进行过滤