Oracle SQL查询中SELECT语句内算术表达式的执行顺序是怎样的?
SELECT 子句中算术运算的执行顺序
先明确前提:以下说的是SQL标准定义的逻辑执行顺序,不同数据库的优化器可能在不改变最终结果的前提下调整物理执行顺序,不会影响语义判断。
简单查询(无GROUP BY、HAVING)
就像你举的例子:
SELECT a*5 FROM table;
这种场景下a*5的运算执行顺序在WHERE(如果有)之后,ORDER BY(如果有)之前,完整顺序是:
- FROM 加载目标表的全量数据
- WHERE 过滤不符合条件的行
- 计算SELECT子句中的所有表达式,包括算术运算
a*5 - 执行ORDER BY 排序
- LIMIT/OFFSET 分页(如果有)
带分组聚合的查询(含GROUP BY、HAVING)
这种场景需要分两种情况判断:
算术运算作为分组维度
如果GROUP BY中直接用到了这个算术运算,比如:
SELECT a*5, sum(b) FROM table GROUP BY a*5;
这时候a*5会在GROUP BY分组阶段就完成计算,用来作为分组的判断依据,执行顺序早于聚合计算、HAVING和SELECT中的其他表达式,完整顺序是:
- FROM → WHERE 过滤行
- GROUP BY 阶段计算
a*5并按结果分组 - 计算sum、count等聚合函数
- HAVING 过滤分组结果
- 计算SELECT中剩余的其他表达式
- ORDER BY 排序
算术运算仅作为返回结果
如果算术运算和分组维度无关,只在SELECT中作为返回字段,比如:
SELECT a*5, sum(b) FROM table GROUP BY a;
这时候a*5还是在HAVING执行完成之后的SELECT阶段才计算,执行顺序介于HAVING和ORDER BY之间。
常见佐证
我们可以从SQL的语法限制验证顺序:你不能在HAVING子句中引用SELECT里定义的算术运算别名,但是可以在ORDER BY中引用。比如SELECT a*5 as b FROM table HAVING b>10会直接报错,因为HAVING执行时SELECT还没计算别名;而SELECT a*5 as b FROM table ORDER BY b是合法的,因为ORDER BY执行时SELECT的运算已经完成。
内容的提问来源于stack exchange,提问作者general46
相关产品推荐
相关产品推荐

