为啥 SQL 查询的结果没有按我期望的顺序返回?
Posted
技术标签:
【中文标题】为啥 SQL 查询的结果没有按我期望的顺序返回?【英文标题】:Why do results from a SQL query not come back in the order I expect?为什么 SQL 查询的结果没有按我期望的顺序返回? 【发布时间】:2012-06-15 12:39:24 【问题描述】:如果在表中插入了项,然后我写了一个查询,例如select * from table
,为什么结果不是我期望的顺序?
【问题讨论】:
What is mysql row order for "SELECT * FROM table_name;"?的可能重复 @philipxy 这个问题是 RDBMS 引擎特有的,即使它不需要,也不会被那些更普遍地搜索的人找到。 (更笼统的问题 ***.com/questions/1793147/… 并不是询问订单为何更改。) 【参考方案1】:可以通过在语句中使用“Order by”子句来强制查询的顺序。 SQL 数据库实际上并不了解您将事物放入的顺序,或者以给定的顺序存储数据。这意味着您需要告诉 SQL 您想要项目的顺序。例如:
Select * from Table
order by column1 desc
把它想成是把一些东西交给你的朋友拿着——她稍后会为你准备好所有的东西,但同时她会把它存放在某个地方。当你不想为其他东西腾出空间时,她可能会移动它,或者可能会按照你给她的相同顺序把它交还给她,但你没有告诉她保持秩序,所以她不会.
数据库需要能够在后台移动东西,因此它们的构建方式本质上并不知道任何顺序 - 当您将其提供给数据库时,您需要知道顺序,以便您可以放置它稍后按您想要的顺序返回。 order 子句允许 SQL 对数据强加一个顺序,但它不记得或自己有一个。
重点:即使 SQL 在最后 100 万次没有 order by 语句的情况下以正确的顺序返回项目,也不能保证它会这样做。即使表上存在聚集索引,也不能保证按您期望的顺序返回结果。尤其是当 SQL 版本发生变化时,不显式使用 order by 子句可能会破坏假设查询将按照他们想要的顺序的程序!
【讨论】:
我喜欢“重要的一点”——如果你想避免以后出现奇怪的错误,这对于理解这一点至关重要! +1 - 好,简洁的答案。最近有这么多“插入顺序”问题。 如果我们可以从现在开始将它们合并到这个问题中,并且在一百万个地方都没有对同一个问题有好的答案,那就太好了! 如果我理解正确,那么可能会产生一些副作用:如果我请求查询中的前 100 个元素而不指定任何排序条件,那么我请求接下来的 100 个,一些行可能会出现在两个请求,因为不能保证顺序。我说的对吗? @Ignaciosegura - 正确,只要它们是两个单独的查询。【参考方案2】:按插入顺序预期结果是一种常见的误解。即使使用聚集索引,结果集也可能不如预期。强制命令的唯一方法是使用“order by”子句。订单与预期不同的原因可能会有所不同。查询可能是并行执行的,结果集可能会被合并,也可能是由于查询优化计划,同时试图尽可能快地返回结果集。
【讨论】:
以上是关于为啥 SQL 查询的结果没有按我期望的顺序返回?的主要内容,如果未能解决你的问题,请参考以下文章