Mysql-SQL中过滤条件放在on和where中的区别

在使用多表关联查询时,连接条件放在on和where得到的结果集是不同的

数据准备

1
2
select * from person;
select * from account;


内连接、全连接

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是对中间表进行过滤

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×