zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    struts2之OGNL和struts2标签库和ValueStack对象
    struts2使用拦截器完成登陆显示用户信息操作和Struts2的国际化
    struts2的文件上传和文件下载
    jsp+servlet实现文件的上传和下载
    Ajax和JSON完成二级菜单联动的功能
    jxl的使用总结(java操作excel)
    Ajax异步验证登陆或者注册
    mydate97时间控件的使用
    Ckeditor一种很方便的文本编辑器
    搬家通知博文地址(将博客搬到CSDN)
  • 原文地址:https://www.cnblogs.com/xianhaiyan/p/15234438.html
Copyright © 2011-2022 走看看