为啥 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 查询的结果没有按我期望的顺序返回?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 bigquery sql 没有返回任何结果?

为啥我的查询没有返回任何结果?

通用列表联盟没有按我期望的方式工作

SQL Join 没有返回我所期望的

SQL 查询没有返回我所期望的

sql查询语句的各个命令执行的标准顺序是啥?为啥?