当没有order by子句时,首先返回哪个字段?

时间:2014-09-09 03:45:47

标签: mysql

在MYSQL中,当没有order by子句时,首先返回哪些行?

SELECT * FROM table;

看看phpmyadmin它似乎首先使用最新数据对我的数据进行排序,即使我没有带有时间戳的字段。什么是默认排序,是否基于隐藏字段?

/希望这很清楚

3 个答案:

答案 0 :(得分:1)

当没有order by子句时,任何SQL数据库中都没有已定义的返回行顺序。

然而,它通常首先写回来,只是因为这是行写入磁盘的顺序,但是不能依赖它,因为:

  1. 数据库没有义务订购行
  2. 早期的行可能已被删除,而早期的磁盘页面被后来插入的行重用
  3. 数据库引擎可能在内存中缓存了一些行并决定返回第一个

答案 1 :(得分:1)

SQL本身不指定在中返回行的顺序,除非您有order by子句,因此建议您不要依赖此类行为。没有订购条款,大多数DBMS'几乎肯定会以最方便的顺序返回行。

如果切换到另一个DBMS,它可能会更改。如果切换到另一个版本的MySQL,它可能会改变。随着数据添加到数据库或从数据库中删除数据,它可能会发生变化。

它可能会改变,具体取决于它是使用索引还是进行全表扫描。前一种情况可能会根据索引属性本身进行排序,因为它是如何提取它的。后一种情况将是"排序"以任何顺序排列在主数据区中占据的顺序(即,有效地未排序)。

如果DBMS开发人员是一个虐待狂类型,它甚至可能在本月的随机时间发生变化,因为大多数人都倾向于(对我在Hursley的所有DB2开发人员朋友们大肆欢迎)。

答案 2 :(得分:1)

如果未指定ORDER BY子句,则未定义返回行的顺序;数据库引擎可以按任何顺序返回它们。这可能是它们被插入的顺序,或者它可能尝试按照它们在磁盘上出现的顺序返回行以最小化搜索,或者它可以在每个查询上以不同的随机顺序返回它们。 (当然,任何理智的引擎都不可能随机排序行;这是一个极端的例子,只是为了表明数据库引擎可以做一些奇怪的事情,并且仍然符合SQL规范。)

此外,下次发出相同查询时,订单不保证是相同的,在这方面的行为也不能保证在不同版本的数据库引擎中保持相同。 (例如,升级MySQL可能会改变返回行的顺序!)

如果您需要特定顺序的行,则必须使用ORDER BY。依赖于行的默认排序非常脆弱。

进一步阅读:What is the default order of records for a SELECT statement in MySQL?