MYSQL 中过滤条件放在on和where后面的区别
1、MYSQL语句执行顺序
MySQL 语句执行的顺序,并不是按照 SQL 语句的顺序。下面是示例 SQL
SELECT DISTINCT < select_list > FROM < left_table > < join_type > JOIN < right_table > ON < join_condition > WHERE < where_condition > GROUP BY < group_by_list > HAVING < having_condition > ORDER BY < order_by_condition > LIMIT < limit_number >
下面是 SQL 的执行顺序:
- FROM <left_table>
- ON <join_condition>
- <join_type> JOIN <right_table>
- WHERE <where_condition>
- GROUP BY <group_by_list>
- HAVING <having_condition>
- SELECT
- DISTINCT <select_list>
- ORDER BY <order_by_condition>
- LIMIT <limit_number>
2、过滤条件放在on和where后区别实例
join过程可以这样理解:首先两个表做一个笛卡尔积,on后面的条件是对这个笛卡尔积做一个过滤形成一张临时表,如果没有where就直接返回结果,如果有where就对上一步的临时表再进行过滤。
准备两张表:
执行inner join:
select * from person p inner join account a on p.id=a.id and p.id!=4 and a.id!=4;
select * from person p inner join account a on p.id=a.id where p.id!=4 and a.id!=4;
执行left join:
select * from person p left join account a on p.id=a.id and p.id!=4 and a.id!=4;
select * from person p left join account a on p.id=a.id where p.id!=4 and a.id!=4;
3、总结
从性能上考虑关联查询使用规则:能使用inner join 则优先使用inner join,不要使用left join 和right join
JOIN 的作用
结果集的不同,不仅与 SQL 的优先级有关,还和 JOIN 有关
使用left join时on后面的条件只对右表有效,使用right join时on后面条件只对左表有效。
- on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回主表(left join 左表,right join 右表)的行。
- where则是在生成临时表之后使用的条件,此时已经不管是否使用了left join了,只要条件不为真的行,全部过滤掉。
参考资料:
https://www.jb51.net/article/155349.htm
https://www.jb51.net/article/155352.htm