SQL:MySQL 中各子句的执行逻辑过程
前言
- 本文节选自《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>
-
-
上述代码的逻辑执行步骤
-
FROM:
- 对 FROM 子句中的左表
<left_table>
和右表<right_table>
执行笛卡儿积,产生虚拟表 VT1;
- 对 FROM 子句中的左表
-
ON:
- 对虚拟表 VT1 进行 ON 筛选,只有那些符合
<join_condition>
的行才被插入虚拟表 VT2;
- 对虚拟表 VT1 进行 ON 筛选,只有那些符合
-
JOIN:
- 如果指定了联接类型为 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表 VT2,产生虚拟表VT3;
- 如果 FROM 子句包含两个以上的表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1 ~ 步骤 3,直到处理完所有的表;
-
WHERE:
- 对虚拟表 VT3 应用WHERE过滤条件,只有符合
<where_condition>
的记录才会被插入虚拟表 VT4;
- 对虚拟表 VT3 应用WHERE过滤条件,只有符合
-
GROUP BY:
- 根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,产生 VT5;
-
CUBE|ROLLUP:
- 对 VT5 进行 CUBE 或 ROLLUP 操作,产生表 VT6;
-
HAVING:
- 对虚拟表 VT6 应用 HAVING 过滤器,只有符合
<having_condition>
的记录才会被插入到 VT7;
- 对虚拟表 VT6 应用 HAVING 过滤器,只有符合
-
SELECT:
- 执行 SELECT 操作,选择指定的列,插入到虚拟表 VT8 中;
-
DISTINCT:
- 去除重复数据,产生虚拟表 VT9;
-
ORDER BY:
- 将虚拟表 VT9 中的记录按照
<order_by_list>
进行排序操作操作,产生虚拟表VT10;
- 将虚拟表 VT9 中的记录按照
-
LIMIT:
- 取出指定行的记录,产生虚拟表 VT11,并返回给客户端;