我有一个带有几个记录表'困难'的mysql数据库。如果我“选择*来自困难”,我会按照添加的顺序将它们取回,按主键ID排序:
mysql> select * from difficulties;
+----+-------+-----------+--------+----------+-----------+
| id | value | name | letter | low_band | high_band |
+----+-------+-----------+--------+----------+-----------+
| 1 | 1 | very_easy | VE | 1 | 1 |
| 2 | 2 | easy | E | 2 | 5 |
| 3 | 3 | medium | M | 6 | 10 |
| 4 | 4 | hard | H | 11 | 12 |
| 5 | 0 | na | NA | 0 | 0 |
+----+-------+-----------+--------+----------+-----------+
但是,如果我“从困难中选择名字”,我会以不同的顺序将其取回:
mysql> select name from difficulties;
+-----------+
| name |
+-----------+
| easy |
| hard |
| medium |
| na |
| very_easy |
+-----------+
我的问题是:是什么决定了这个订单?它有什么逻辑吗?它是否类似于“表示记录的文件恰好位于文件系统中的顺序”或其他所有意图和目的随机的东西?
谢谢,最大
答案 0 :(得分:4)
这是正确的并且是设计的:如果你不要求排序,服务器不会打扰排序(排序可能是一项昂贵的操作),它将返回行中的无论它认为合适的顺序。如果没有请求的订单,记录的排序方式甚至可能因查询而异(尽管不太可能)。
顺序绝对不是随机的 - 它只是行从查询中产生的任何方式,正如您所看到的,即使是微小的修改也可以显着改变这种非顺序。这种“未定义”的排序依赖于实现,不可预测,不应该依赖。
如果您想要对元素进行排序,请使用ORDER BY
子句(这就是它的用途) - 例如
SELECT name FROM difficulties ORDER BY name ASC;
这将始终以升序返回按名称排序的结果。或者,如果您希望按主键排序,最后一个,请使用:
SELECT name FROM difficulties ORDER BY id DESC;
您甚至可以按功能排序 - 如果您实际上想要随机顺序,请执行此操作(警告:使用较大的表格表现糟糕):
SELECT name FROM difficulties ORDER BY RAND();
答案 1 :(得分:2)
正如Piskvor所说,MySQL将对查询进行排序,但它最方便。为了解决问题的“为什么”部分,不同的结果顺序可能是不同执行计划的副作用。如果你有difficulties
的索引,第二个查询会使用它,但第一个不会。
答案 2 :(得分:1)
如果没有ORDER BY
子句,结果将以随机顺序返回。但是,对我而言,数据库引擎在存储数据时返回数据的最简单(也是最快)方式似乎合乎逻辑。所以这就是为什么第一个结果集是由PK排序的(没有碎片,逻辑顺序与物理顺序相同)。在第二种情况下,我假设您在字段name
上有索引,并且对于此索引覆盖的查询select name from difficulties
,因此数据库引擎会扫描此索引,这就是您看到{的排序结果的原因{1}}。无论如何,你不应该依赖这种“默认”排序。
答案 3 :(得分:-2)
select name from difficulties
应按字母顺序返回值,因为它是文本字段。
我相信select * from difficulties
将以数字顺序返回。不要抱我那个哈哈
最好的办法是使用ORDER BY
,如果你关心的是什么订单