SQL:MySQL 中各子句的执行逻辑过程

参考:MySQL中各SQL子句的逻辑执行顺序 

前言

  • 本文节选自《MySQL技术内幕:SQL编程》3.1 逻辑查询处理
  • 本文说明的执行顺序只是一种逻辑顺序,并不是MySQL中SQL查询语句的实际执行过程。MySQL在实际执行SQL语句时,由于MySQL Optimizer优化器的存在,会将SQL子句的执行顺序和过程朝着MySQL所认为的最优路径进行优化(实际上并不一定是最优)。要想确定SQL语句在MySQL的实际执行顺序,可以使用Explain关键字分析SQL语句,获取SQL语句在MySQL中的执行计划

 

MySQL中SQL查询语句逻辑过程

  • 示例代码

    • SELECT    DISTINCT <select_list>
        FROM    <lsft_table>
        <join_type> JOIN <right_table>
          ON    <join_condition>
       WHERE    <where_condition>
       GROUP BY <group_by_list>
        WITH    {CUBE|ROLLUP}
      HAVING    <having_condition>
       ORDER BY <order_by_list>
       LIMIT    <offset, limit_number>

       

  • 上述代码的逻辑执行步骤

  1. FROM:

    • 对 FROM 子句中的左表 <left_table> 和右表 <right_table> 执行笛卡儿积,产生虚拟表 VT1;
  2. ON:

    • 对虚拟表 VT1 进行 ON 筛选,只有那些符合 <join_condition> 的行才被插入虚拟表 VT2;
  3. JOIN:

    • 如果指定了联接类型为 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表 VT2,产生虚拟表VT3;
    • 如果 FROM 子句包含两个以上的表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1 ~ 步骤 3,直到处理完所有的表;
  4. WHERE:

    • 对虚拟表 VT3 应用WHERE过滤条件,只有符合 <where_condition> 的记录才会被插入虚拟表 VT4;
  5. GROUP BY:

    • 根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,产生 VT5;
  6. CUBE|ROLLUP:

    • 对 VT5 进行 CUBE 或 ROLLUP 操作,产生表 VT6;
  7. HAVING:

    • 对虚拟表 VT6 应用 HAVING 过滤器,只有符合 <having_condition> 的记录才会被插入到 VT7;
  8. SELECT:

    • 执行 SELECT 操作,选择指定的列,插入到虚拟表 VT8 中;
  9. DISTINCT:

    • 去除重复数据,产生虚拟表 VT9;
  10. ORDER BY:

    • 将虚拟表 VT9 中的记录按照 <order_by_list> 进行排序操作操作,产生虚拟表VT10;
  11. LIMIT:

    • 取出指定行的记录,产生虚拟表 VT11,并返回给客户端;

 

posted @ 2020-09-28 21:46  何永灿  阅读(496)  评论(0编辑  收藏  举报