Mysql:“select <fieldname> from”的结果顺序与“select * from”</fieldname>的结果顺序不同

时间:2010-07-29 15:38:11

标签: mysql

我有一个带有几个记录表'困难'的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 | 
+-----------+

我的问题是:是什么决定了这个订单?它有什么逻辑吗?它是否类似于“表示记录的文件恰好位于文件系统中的顺序”或其他所有意图和目的随机的东西?

谢谢,最大

4 个答案:

答案 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();

有关详情see this tutorialthe documentation

答案 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,如果你关心的是什么订单