sql语句如下:
select A.a, A.b, A.c
from A
where A.d = value
order by A.a, A.c
结果显示为:
----a--------b--------c----
--00001----20000----HEART--
--00001------0------HEART--也就是说,返回的记录中,除了b字段的值不一样,其他字段的值都是一样的,包括order by中的字段。但是,如果我把sql语句中的order by语句删除
select A.a, A.b, A.c
from A
where A.d = value
却得到了如下的结果:
----a--------b--------c----
--00001------0------HEART--
--00001----20000----HEART--我想请教一下,第一条语句,没有对字段b进行排序,为什么会产生降序的排列效果?

解决方案 »

  1.   

    因为你的数据只有两个,而且只有一个列不一样,不是升就是降了..
    但是不带order by,oracle是啥也没有做的..表象而已
      

  2.   

    巧合而已。
    oracle中(其实不仅仅是oracle中)想保证数据查询出的顺序是预想顺序的方法:
    1、order by 排序限制
    2、见表的时候使用 索引组织 表。否则查询出的数据不一定是什么顺序的。
    如: 数据库中有1000W数据,假设按顺序存储的。
    此时你删除其中的100W数据,那么这100W数据的位置就空了,新数据就会插入到这个空白区域。如果你最开始的数据是 1,2,3,4...这样的顺序存储的,但是删除的是 5,7,9...这样不连续的数据
    然后再插入 1000,1001... 这样的数据的话,数据的存储顺序就会变乱。
    所以你查询出的数据如果不排序的话就不一定是什么顺序了。
      

  3.   

    谢谢楼上的回答。
    那我们只考虑第一条sql。对于没有排序的字段(A.b),它的值是升序或者降序排列,完全是随机的吗?
      

  4.   

    多插入幾條記錄 再來驗證一下 
    自己先看看  驗證一下這個ORDER BY
      

  5.   

    oracle没有进行任何排序操作,rowid表示的是数据存放的数据块内部地址,如果没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客户端,不过看起来好像是按照rowid排序似的
      

  6.   

    有索引的情况下, 根据索引排序,没有根据 rowid 来的。这里说的索引不是 A.b上得索引,而是 A.a 和 A.c上得。因为A.a 和 A.c 完全相同,那么他们的查询结果顺序取决于他们上的索引和rowid,
    当他们的顺序定下来之后,对应的A.b 自然也就定下来了。
      

  7.   

    select A.a, A.b, A.c
    from A
    where A.d = value
    order by A.a, A.c,a.b