在MYSQL中,当没有order by子句时,首先返回哪些行?
SELECT * FROM table;
看看phpmyadmin它似乎首先使用最新数据对我的数据进行排序,即使我没有带有时间戳的字段。什么是默认排序,是否基于隐藏字段?
/希望这很清楚
垫
答案 0 :(得分:1)
当没有order by子句时,任何SQL数据库中都没有已定义的返回行顺序。
然而,它通常首先写回来,只是因为这是行写入磁盘的顺序,但是不能依赖它,因为:
答案 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?