一、MYSQL
首先执行如下脚本创建一个tmpwp表用于复现问题。
create table tmpwp as select 1 aa from dual;
select * from (select * from tmpwp order by aa ) as t;
insert into tmpwp(aa) VALUES(2);
insert into tmpwp(aa) VALUES(67);
insert into tmpwp(aa) VALUES(5);
insert into tmpwp(aa) VALUES(234);
这个时候我们查询tmpwp表会按如下顺序展示数据,可以发现顺序使我们插入的顺序,也可以说是按物理地址的顺序。
接下来我们给他排个序select * from tmpwp order by aa desc
。
最后我们给他抱上一层selectselect * from (select * from tmpwp order by aa desc ) as t;
,这个时候我们会发现顺序又回到了直接select的那个顺序。
`
二、ORACLE
看了mysql,我们再来看看oracle 是怎么实现的。
create table tmpwp as select 1 aa from dual;
insert into tmpwp(aa) VALUES(2);
insert into tmpwp(aa) VALUES(67);
insert into tmpwp(aa) VALUES(5);
insert into tmpwp(aa) VALUES(234);
我们分别针对oracle执行和mysql 一样的三次查询。
select * from tmpwp
select * from tmpwp order by aa desc
select * from (select * from tmpwp order by aa desc ) ;
三、总结
由上面所述可以总结出mysql和oracle对子查询的查询逻辑实现的差异,当我们使用mysql的子查询的时候,外层的查询语句去查询里面的有序数据,其实是会按普通表查询处理,并按物理地址排序展示出来。而oracle在查询内部的有序子查询数据的时候则会依旧有序。