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 的执行顺序:

  

  1. FROM <left_table>
  2. ON <join_condition>
  3. <join_type> JOIN <right_table>
  4. WHERE <where_condition>
  5. GROUP BY <group_by_list>
  6. HAVING <having_condition>
  7. SELECT
  8. DISTINCT <select_list>
  9. ORDER BY <order_by_condition>
  10. 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

原文地址:https://www.cnblogs.com/xianhaiyan/p/15234438.html