Mysql:结果的顺序,带“;选择<;fieldname>;从「;与带“的结果顺序不同”;选择*from";

Mysql:结果的顺序,带“;选择<;fieldname>;从「;与带“的结果顺序不同”;选择*from";,mysql,Mysql,我有一个mysql数据库,其中有一个表“困难”,有一些记录。如果我选择了“从困难中选择*”,我会按照添加顺序将它们取回,按主键id排序: mysql> select * from difficulties; +----+-------+-----------+--------+----------+-----------+ | id | value | name | letter | low_band | high_band | +----+-------+-----------

我有一个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 | 
+-----------+
我的问题是:什么决定了这个顺序?这有什么逻辑吗?它是类似于“表示记录的文件恰好位于文件系统中的顺序”还是其他所有意图和目的都是随机的


谢谢,max

这是正确的,而且是经过设计的:如果您不要求排序,服务器就不会麻烦排序了(排序可能是一项昂贵的操作),它将以它认为合适的任何顺序返回行。如果没有请求的顺序,记录的排序方式甚至可能在不同的查询中有所不同(尽管这不太可能)

顺序绝对不是随机的——它只是查询中的行的任何方式,正如您所看到的,即使是很小的修改也会显著地改变这种非顺序。这种“未定义”的顺序依赖于实现,不可预测,不应依赖

如果您希望对元素进行排序,请使用
orderby
子句(这就是它的目的)-例如

它将始终以升序返回按名称排序的结果。或者,如果要按主键排序,请使用“最后一个在顶部”:

SELECT name FROM difficulties ORDER BY id DESC;
您甚至可以按函数排序—如果您确实想要随机排序,请执行此操作(注意:大型表的性能非常糟糕):


有关更多详细信息和说明。

从困难中选择名称。应按字母顺序返回值,因为它是一个文本字段。 我相信,
select*from难点
将以数字顺序返回。别让我那么开心


最好的做法是使用
orderby
如果您关心事物的顺序是什么

,正如Piskvor所说,MySQL将按照它认为最方便的方式对查询进行排序。为了解决问题的“为什么”部分,不同的结果顺序可能是不同执行计划的副作用。如果您有一个关于
困难的索引
,第二个查询将使用它,但第一个查询不会使用。

如果没有
ORDER BY
子句,结果将以随机顺序返回。然而,在我看来,db引擎在存储数据时返回数据的最简单(也是最快)的方法是合乎逻辑的。这就是为什么第一个结果集是按PK排序的(没有碎片,逻辑顺序与物理顺序相同)。在第二种情况下,我假设您在字段
name
上有一个索引,并且对于查询
select name from diffusions
,这个索引正在覆盖,因此db引擎会扫描这个索引,这就是为什么您会看到按
name
排序的结果。无论如何,您不应该依赖这种“默认”排序。

这实际上是错误的。除非您特别要求排序,否则SQL server不需要以任何形式的顺序返回行。(当然,
orderby
是要求订购的方式,这一点是正确的)+1个优点,也说明了为什么选择是不好的-它可以强制进行全表扫描(慢),感谢Piskvor,这一切都是有意义的。我知道order by,我只是好奇在这种情况下发生了什么。我猜我错误地认为,对于dbms来说,按照记录在表中出现的顺序返回记录(或记录中的字段)是最容易/最便宜的事情,因此它会做什么,但我没有任何假设的基础:)干杯, max@Max威廉姆斯:我猜@a1ex07与覆盖索引(即
name
列上的索引)是正确的,是xe吗?这将使得在仅请求
名称
列时,而不是在请求所有列时,“只读取索引中的任何内容”是最便宜的操作。有关详细说明,请参见示例:
SELECT name FROM difficulties ORDER BY id DESC;
SELECT name FROM difficulties ORDER BY RAND();