哪些SQL查询操作的返回结果会受执行顺序影响?
受排序规则/执行顺序影响的SQL操作汇总
窗口函数类(除ROW_NUMBER()外)
RANK()、DENSE_RANK()、PERCENT_RANK()、CUME_DIST():排序键不唯一时,相同值的行排名虽然符合对应函数规则,但如果后续逻辑依赖行的相对顺序,执行计划变更后结果会不一致NTILE(n):排序键不唯一时,分桶边界的行归属完全由扫描顺序决定FIRST_VALUE()、LAST_VALUE()、NTH_VALUE(expr, n):排序键不完整的情况下,取到的对应位置的值完全不确定LAG(expr, offset)、LEAD(expr, offset):排序规则不稳定时,相邻行的匹配结果会发生变化
聚合函数类
- 字符串拼接聚合:
GROUP_CONCAT(MySQL)、STRING_AGG(PostgreSQL)、LISTAGG(Oracle)等,如果聚合时未显式指定排序规则,拼接结果的元素顺序完全由行的扫描顺序决定 - 数组/集合聚合:
ARRAY_AGG、JSON_ARRAYAGG等,未指定排序时,返回的集合内元素顺序无保证 - 方言专属行聚合:
FIRST()、LAST()等取分组内首/尾行值的聚合函数,完全依赖分组内的行顺序
行筛选/采样类
LIMIT/TOP/FETCH FIRST n ROWS:外层查询未指定稳定、唯一的排序规则时,返回的前N行完全不确定,重构执行计划、数据更新、数据库版本升级都可能改变返回结果DISTINCT ON (col)(PostgreSQL专属):排序键不唯一时,返回的每组首行无固定规则- 采样操作:
TABLESAMPLE、SAMPLE()等按物理存储或扫描顺序采样的操作,执行路径变化后采样结果会发生差异
写操作类
INSERT ... SELECT:如果目标表包含自增主键/序列字段,SELECT的行顺序不同会导致自增字段的分配结果不同,后续依赖自增字段排序的查询结果会随之变化- 带行数限制的写操作:
UPDATE LIMIT、DELETE LIMIT等方言特性,未指定排序时,被修改/删除的行完全不确定
注意:SQL标准明确规定,未显式指定稳定、唯一的排序规则时,数据库返回行的顺序没有任何保证。所有依赖行顺序的逻辑都必须补充完整的排序规则,才能保证语法重构、环境变更后结果一致。
内容的提问来源于stack exchange,提问作者Bruce
相关产品推荐
相关产品推荐

