美文网首页mysql 知识库
MySQL 查询条件放置 on 和 where 的区别

MySQL 查询条件放置 on 和 where 的区别

作者: haoyq | 来源:发表于2018-06-07 21:45 被阅读31次

    导语

    今天在写 SQL 的时候,遇到一个问题。需求是这样的,查询数据,按照评分倒序、近一周访问量倒序,这样进行排序。问题是常规的写法,将 day >= xxx 条件放到 where 中, 如果某些数据近一周没有访问量,那么这条数据就查不出来。解决办法呢,就是将条件放到 LEFT JOIN 中。

    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>
    

    LEFT JOIN 的作用

    结果集的不同,不仅与 SQL 的优先级有关,还和 LEFT JOIN 有关

    使用left join时on后面的条件只对右表有效

    • on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_name1) 的行。
    • where则是在生成临时表之后使用的条件,此时已经不管是否使用了left join了,只要条件不为真的行,全部过滤掉。

    以上是从两篇资料中摘抄的,可以很好的概括(原文链接在下方,其中都有示例)。


    参考资料:步步深入:MySQL架构总览->查询执行流程->SQL解析顺序MySQL left join操作中 on与where放置条件的区别SQL中过滤条件放在on和where中的区别

    相关文章

      网友评论

      • Mehere:深入了解下 笛卡尔积和内连接、外连接的关系区别。
      • 被时间推开:就是说我把on条件字段放到where反而会更慢一些,涨姿势了,谢谢
        被时间推开:@haoyq 好的
        haoyq:@被时间推开 放在不同的位置,结果集是不同的。要考虑这点

      本文标题:MySQL 查询条件放置 on 和 where 的区别

      本文链接:https://www.haomeiwen.com/subject/pemgsftx.html