一、一条SQL查询语句的执行顺序
1、FROM:对FROM子句中的左表<left_table>和右表<right_table>执行笛卡尔积,产生虚拟表VT1;
2、ON:对虚拟表VT1应用ON筛选,只有那些符合<jion_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,并返回给查询用户。
二、一条 SQL 查询语句在 MySQL 中如何执行的
权限检查:先检查该语句是否有权限,如果没有权限直接返回错误信息,如果有权限会先查询缓存(MySQL8.0版本以前);
语法分析:如果没有缓存,分析器进行语法分析,提取sql语句中的select等关键元素,然后判断sql语句是否有语法错误,比如关键词是否正确等;
语句优化:语法解析之后,MySQL服务器会对查询的语句进行优化,确定执行方案;
调用数据库引擎接口:完成查询优化后,按照生成的执行计划调用数据库引擎接口,返回执行结果。