执行顺序:先on条件再 where条件筛选。
on筛选之后会生成一个临时表;where在临时表上再进行筛选。
(inner)join on时和where的效果一样。
left/right on时与where效果不同。两表都不为空时,显而易见left/right on时总会有结果出来,where可能会导致结果为空。
本应放在on的条件放在了where时会失去left/right操作,效果会等同于(inner)join on
例子
有两个表:
1 | mysql> select * from user; |
select * from user u left join hotel h on u.id=h.id where h.level=1;
和select * from user u left join hotel h on u.id=h.id and h.level=1;
区别
下面例子有三条命令。明显看到第二条命令在第一个上加了一个where条件导致输出为空。
但是第三条命令把第二条多加的where加到了on中判断,使得右表没有对应的数据全部以null填充。
1 | mysql> select * from user u left join hotel h on u.id=h.id; |
总结
如果需要不满足连接条件的行也在我们的查询范围内的话,我们就必需把连接条件放在ON后面,而不能放在WHERE后面,如果我们把连接条件放在了WHERE后面,那么所有的LEFT,RIGHT,等这些操作将不起任何作用,对于这种情况,它的效果就完全等同于INNER连接。
所有的连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用.