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).
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)
| 归档时间: |
|
| 查看次数: |
23255 次 |
| 最近记录: |