如果在表格中插入了项目,然后我编写了一个查询,例如select * from table
,为什么结果不符合我的预期?
答案 0 :(得分:9)
可以使用语句中的“Order by”子句强制查询的顺序。 SQL数据库实际上并不了解您放入内容的顺序,或以给定顺序存储数据。这意味着您需要告诉SQL您希望项目的顺序。例如:
Select * from Table
order by column1 desc
想想就像将一些东西交给你的朋友一样 - 她以后会为你准备好所有这些东西,但她会在同一时间把它存放到某个地方。当你不打算为其他东西腾出空间时,她可能会移动它,或者可能按照你给她的顺序将它移回去,但是你并没有告诉她要保持顺序,所以她没有。
数据库需要能够在后台移动东西,所以它们的构建方式本质上不知道任何顺序 - 当你将它提供给数据库时你需要知道顺序,以便你可以把它放到以你想要的顺序回来。 order子句允许SQL对数据强加一个顺序,但它不记得或者有一个单独的数据。
重要事项:即使SQL在最后100万次没有order by语句的情况下以正确的顺序返回项目,也不能保证它会这样做。即使表上存在聚簇索引,也不能保证按预期的顺序返回结果。特别是当SQL版本发生变化时,没有明确使用order by子句会破坏假设查询将按照他们想要的顺序的程序!
答案 1 :(得分:2)
在插入的顺序中期望结果是一种常见的误解。即使使用聚簇索引,结果集也可能不符合预期。强制执行订单的唯一方法是使用“order by”子句。订单与预期不同的原因可能会有所不同。查询可以并行执行,并且结果集可以合并,或者可以归因于查询优化计划,同时尽可能快地返回结果集。