是的,在您的查询位置order by
确实很重要。order by
AFAIK,在 SQL 规范中,如果您未在最外层查询中指定,则根本无法保证结果集中的行顺序。有时,您可以偶然获得所需的行排序,但不能保证。
为了展示它,这是一个小测试 - 假设我们有这样的表格test
:
create table test(id int, name text);
insert into test
select 1, 'John' union all
select 2, 'Adele';
现在让我们运行一些查询。这个可以正常工作(由 保证order by
):
select * from test as t1 order by t1.name;
id name
-----------
2 Adele
1 John
这个几乎可以肯定会正常工作,它是从有序子查询中选择的,SQL 没有理由重新排序它:
select * from (select * from test order by name) as t1
id name
-----------
2 Adele
1 John
但是假设我们必须在这个查询中使用自连接。这一个,再次,将正常工作(由 保证order by
):
select *
from test as t1
inner join test as t2 on t2.id = t1.id
order by t1.name;
id name
-----------
2 Adele
1 John
但这一个将因为merge join
. SQL 必须在合并连接期间按连接列对集合进行排序,因此它重新排序t1
,并且由于您没有指定 outer order by
,因此将返回按以下顺序排序的结果id
:
select *
from (select * from test order by name) as t1
inner join test as t2 on t2.id = t1.id;
id name
-----------
1 John
2 Adele
sql fiddle demo
对于您最初的问题,order by
如果您的选择之间发生了一些数据修改,即使在最外层查询中指定也无法工作。