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

naw*_*fal 12 mysql sql sql-order-by aggregate-functions

可以说我有一个植物表:

id fruit
1  banana
2  apple
3  orange
Run Code Online (Sandbox Code Playgroud)

我可以做到这些

SELECT * FROM plant ORDER BY id;
SELECT * FROM plant ORDER BY fruit DESC;
Run Code Online (Sandbox Code Playgroud)

这是显而易见的事情.

但我被这个咬了,这有什么作用?

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;
Run Code Online (Sandbox Code Playgroud)

所有这些只返回第一行(id = 1).

  1. 发动机罩下发生了什么?
  2. 聚合函数会派上用场的场景是ORDER BY什么?

Emi*_*röm 18

如果您实际选择聚合值而不是表中的列,则结果会更清晰:

SELECT SUM(id) FROM plant ORDER BY SUM(id)
Run Code Online (Sandbox Code Playgroud)

这将返回所有id的总和.这当然是一个无用的例子,因为聚合总是只创建一行,因此不需要排序.你在查询中获得行qith列的原因是因为MySQL选择了一行,而不是随机但不是确定性的.它只是在你的情况下它是表中的第一列,但其他人可能会得到另一行,具体取决于存储引擎,主键等.因此,仅在ORDER BY子句中进行聚合不是很有用.

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

SELECT fruit, COUNT(*)
FROM plant
GROUP BY fruit
ORDER BY COUNT(*)
Run Code Online (Sandbox Code Playgroud)

现在这是一个更有趣的查询!这将为每个水果提供一行,以及该水果的总数.尝试添加更多的苹果,订单实际上会开始有意义:

完整表格:

+----+--------+
| id | fruit  |
+----+--------+
|  1 | banana |
|  2 | apple  |
|  3 | orange |
|  4 | apple  |
|  5 | apple  |
|  6 | banana |
+----+--------+
Run Code Online (Sandbox Code Playgroud)

上面的查询:

+--------+----------+
| fruit  | COUNT(*) |
+--------+----------+
| orange |        1 |
| banana |        2 |
| apple  |        3 |
+--------+----------+
Run Code Online (Sandbox Code Playgroud)