• 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,并返回给客户端;
  • 相关阅读:
    电脑知识
    编译器错误信息: CS0433: 类型“ASP.global_asax”同时存在于“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727...的解决方法
    windows平台下的oracle ORA-01031的解决方法
    .NET下使用HTTP请求的正确姿势
    EasyUI Datagrid 分页
    Js 运算符(加减乘除)
    Navicat 运行 Oracle 存储过程示例
    oracle数据库忘记sys(或system)账户密码
    SQL Server 死锁问题
    C# 给某个方法设定执行超时时间
  • 原文地址:https://www.cnblogs.com/volcao/p/13747104.html
Copyright © 2020-2023  润新知