SQL语句ORDER BY子句中使用子查询的含义是什么?
在SQL的ORDER BY子句中使用子查询的含义
我们结合你给出的示例拆解这个问题:
首先看核心SQL语句:
SELECT * FROM sales ORDER BY (SELECT AVG(amount) FROM sales);
这里的(SELECT AVG(amount) FROM sales)是标量子查询——只会返回单个值的子查询,它的作用是计算sales表中amount字段的平均值(示例里算出来是200)。
这种用法的实际效果
当ORDER BY后跟一个返回固定单一值的子查询时,这个值对结果集中的每一行完全相同。因为排序依据没有差异,数据库不会对结果集做任何实际排序操作,最终返回的行顺序就是数据在存储层的原始顺序(比如InnoDB引擎下默认按主键顺序返回)。
你给出的示例结果也验证了这一点:执行排序后的查询,返回的行顺序和直接执行SELECT * FROM sales的顺序一致(id从1到5依次排列),没有发生任何排序变化。
扩展:ORDER BY中的相关子查询
除了这种返回固定值的不相关子查询,ORDER BY里还可以用相关子查询——子查询会引用外部查询的字段,为每一行生成不同的排序键。比如想按每行amount与平均值的差值排序,可以这么写:
SELECT * FROM sales s ORDER BY (SELECT s.amount - AVG(amount) FROM sales);
这种情况下,子查询会为每一行计算对应的差值,数据库会根据这个动态生成的排序键对结果集排序。
内容的提问来源于stack exchange,提问作者andy
相关产品推荐
相关产品推荐

