SQL语句的执行顺序怎么理解,特别是ORDER BY子句怎么理解?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句的执行顺序怎么理解,特别是ORDER BY子句怎么理解?相关的知识,希望对你有一定的参考价值。

(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>
------------------------------
FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
OUTER(JOIN):如果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
SELECT:处理SELECT列表,产生VT8.
DISTINCT:将重复的行从VT8中移除,产生VT9.
ORDER BY:将VT9中的行按ORDER BY 子句中的列进行排序,生成游标(VC10).
TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

其中的 ORDER BY,怎么理解呢?

假设 SELECT 子句查询的是 NAME,AGE,SEX,而 ORDER BY 指定排序字段是 SCORE,那么 SELECT 子句先执行产生虚表 VT8,去重得到VT9,此时VT9根本没有SCORE列,那么ORDER BY 又怎么依据 SCORE列来排序呢?

参考技术A 如果ORDER BY指定的列是SELECT语句中没有的列,那么这句SQL是会报错的。也就是说,考虑SQL语句的解析时,不必考虑这种情况。 参考技术B 事实上,select 子句是倒数第三个,然后是top子句,最后还有一个into子句。

以上是关于SQL语句的执行顺序怎么理解,特别是ORDER BY子句怎么理解?的主要内容,如果未能解决你的问题,请参考以下文章

当sql语句中where,order by,group by同时使用查询sql语句中三者的顺序

带嵌套的Sql语句执行顺序问题

sql语句select group by order by where一般先后顺序

sql语句select group by order by where一般先后顺序

查询语句中select from where group by having order by的执行顺序

sql语句select group by order by where一般先后顺序