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,并返回给客户端;
 
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号