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

  • 相关阅读:
    剑指OFFER之合并有序链表(九度OJ1519)
    剑指OFFER之反转链表(九度OJ1518)
    剑指OFFER之链表中倒数第k个节点(九度OJ1517)
    一分钟教你在博客园中制作自己的动态云球形标签页
    剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)
    剑指OFFER之打印1到最大的N位数(九度OJ1515)
    剑指OFFER之矩形覆盖(九度OJ1390)
    剑指OFFER之数值的整数次方(九度OJ1514)
    剑指OFFER之变态跳台阶(九度OJ1389)
    剑指OFFER之二进制中1的个数(九度OJ1513)
  • 原文地址:https://www.cnblogs.com/xianhaiyan/p/15234438.html
Copyright © 2011-2022 走看看