一尘不染

聚合函数在ORDER BY子句中可以做什么?

sql

可以说我有一张植物桌:

id fruit
1  banana
2  apple
3  orange

我可以做这些

SELECT * FROM plant ORDER BY id;
SELECT * FROM plant ORDER BY fruit DESC;

这是显而易见的事情。

但是我被这个咬了,这是怎么做的?

SELECT * FROM plant ORDER BY SUM(id);
SELECT * FROM plant ORDER BY COUNT(fruit);
SELECT * FROM plant ORDER BY COUNT(*);
SELECT * FROM plant ORDER BY SUM(1) DESC;

所有这些仅返回第一行(id = 1)。

  1. 底层发生了什么?
  2. 聚合函数将在哪些情况下派上用场ORDER BY

阅读 502

收藏
2021-03-17

共1个答案

一尘不染

如果您实际选择汇总值而不是表中的列,则结果将更加清晰:

SELECT SUM(id) FROM plant ORDER BY SUM(id)

这将返回所有ID的总和。这当然是一个无用的示例,因为聚合将始终仅创建一行,因此无需排序。在查询中获得第qith列的原因是因为MySQL选择了一行,不是随机而是确定性的。碰巧的是它是您所用表的第一列,但是其他人可能会根据存储引擎,主键等获得另一行。因此,仅在ORDER
BY子句中进行聚合不是很有用。

通常,您要做的是按某个字段进行分组,然后以某种方式对结果集进行排序:

SELECT fruit, COUNT(*)
FROM plant
GROUP BY fruit
ORDER BY COUNT(*)

现在,这是一个更有趣的查询!这将使您为每个水果排一列,并为该水果的总数计数。尝试添加更多苹果,订购实际上开始有意义:

完整表格:

+----+--------+
| id | fruit  |
+----+--------+
|  1 | banana |
|  2 | apple  |
|  3 | orange |
|  4 | apple  |
|  5 | apple  |
|  6 | banana |
+----+--------+

上面的查询:

+--------+----------+
| fruit  | COUNT(*) |
+--------+----------+
| orange |        1 |
| banana |        2 |
| apple  |        3 |
+--------+----------+
2021-03-17