一条 SQL 查询语句的执行顺序?

一条 SQL 查询语句的执行顺序?
查询语句执行顺序
- FROM:对 FROM 子句中的左表<left_table>和右表<right_table>执行笛卡尔积(Cartesian product),生成虚拟表 VT1。
- ON:对虚拟表 VT1 应用 ON 筛选条件,只有符合<join_condition>的行才会被插入虚拟表 VT2 中。
- JOIN:如果使用了 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),则将保留表中未匹配的行作为外部行添加到虚拟表 VT2 中,生成虚拟表 VT3。如果 FROM 子句包含多个表,则对上一个连接生成的结果表 VT3 和下一个表重复执行步骤 1)~步骤 3),直到处理完所有的表。
- WHERE:对虚拟表 VT3 应用 WHERE 过滤条件,只有符合<where_condition>的记录才会被插入虚拟表 VT4 中。
- GROUP BY:根据 GROUP BY 子句中的列,对 VT4 中的记录进行分组操作,生成 VT5。
- CUBE|ROLLUP:对表 VT5 进行 CUBE 或 ROLLUP 操作,生成表 VT6。
- HAVING:对虚拟表 VT6 应用 HAVING 过滤器,只有符合<having_condition>的记录才会被插入虚拟表 VT7 中。
- SELECT:执行第二次 SELECT 操作,选择指定的列,并将结果插入虚拟表 VT8 中。
- DISTINCT:去除重复的数据,生成虚拟表 VT9。
- ORDER BY:对虚拟表 VT9 中的记录按照<order_by_list>进行排序操作,生成虚拟表 VT10。
- LIMIT:从虚拟表 VT10 中取出指定行的记录,生成虚拟表 VT11,并将结果返回给查询用户。