为什么SQL查询的结果不按照我预期的顺序回来?
如果将项目插入表中,然后编写一个查询,如select * from table
,为什么结果不符合我的期望?
查询的顺序可以通过在声明中使用'Order by'子句来强制。 一个SQL数据库实际上并不知道你把什么东西放进去,或者按照给定的顺序存储数据。 这意味着你需要告诉SQL你想要的项目的顺序。例如:
Select * from Table order by column1 desc
想想就像把一些东西交给你的朋友一样 – 她以后会把它全部给你,但是她同时把它存储在某个地方。 她可能会移动它,而你不想为别的东西腾出空间,或者按照你给她的顺序把它交还,但是你没有告诉她要保持秩序,所以她没有。
数据库需要能够在后台移动,所以它们的构build方式本质上并不知道任何顺序 – 当你把它提交给数据库的时候,你需要知道顺序,这样你就可以把它放回以后再订购。 order子句允许SQL对数据施加一个顺序,但是它不记得或者没有。
重要的一点 :即使SQL在没有通过声明的顺序的情况下以正确的顺序返回项目最后一百万次,也不能保证它会这样做。 即使表中存在聚集索引,也不能保证以预期的顺序返回结果。 特别是当SQL版本发生变化时,如果不明确地使用order by子句,则可能会破坏假定查询将按照他们想要的顺序的程序!
预期插入顺序的结果是一个常见的误解。 即使使用聚集索引时,结果集可能不符合预期。 唯一强制执行命令的方法是使用“order by”子句。 顺序与预期不同的原因可能会有所不同。 查询可以并行执行,结果集合可以合并,也可以由于查询优化计划,而尽可能快地返回结果集。