4

如果在表中插入项目,然后我编写查询,例如select * from table,为什么结果不是我期望的顺序?

4

2 回答 2

11

可以通过在语句中使用“Order by”子句来强制查询的顺序。SQL 数据库实际上并不了解您将事物放入的顺序,或者以给定的顺序存储数据。这意味着您需要告诉 SQL 您想要项目的顺序。例如:

Select * from Table
  order by column1 desc

把它想象成把一些东西交给你的朋友拿着——她稍后会为你准备好所有的东西,但同时她会把它存放在某个地方。当你不想为其他东西腾出空间时,她可能会移动它,或者可能会按照你给她的相同顺序把它交还给她,但你没有告诉她保持秩序,所以她不会.

数据库需要能够在后台移动事物,因此它们的构建方式本质上并不知道任何顺序 - 当您将其提供给数据库时,您需要知道顺序,以便您可以将其放回稍后订购您想要的。order 子句允许 SQL 对数据强加一个顺序,但它不记得或自己有一个。

要点:即使 SQL 在最后 100 万次没有 order by 语句的情况下以正确的顺序返回项目,也不能保证它会这样做。即使表上存在聚集索引,也不能保证按您期望的顺序返回结果。特别是当 SQL 版本发生变化时,不显式使用 order by 子句可能会破坏假设查询将按照他们想要的顺序的程序!

于 2012-06-12T15:32:26.190 回答
2

以插入的顺序期望结果是一种常见的误解。即使使用聚集索引,结果集也可能不如预期。强制命令的唯一方法是使用“order by”子句。订单与预期不同的原因可能会有所不同。查询可能是并行执行的,结果集可能会被合并,也可能是由于查询优化计划,同时试图尽可能快地返回结果集。

于 2012-06-12T15:46:19.027 回答