SQL> create table t22(id number,name varchar2(20) primary key);Table created.SQL> insert into t22 values(2,'ha');1 row created.SQL> insert into t22 values(1,'wa');1 row created.SQL> insert into t22 values(3,'ya');1 row created.SQL> insert into t22 values(5,'ba');1 row created.SQL> commit;Commit complete.SQL> select * from t22;        ID NAME
---------- --------------------
         2 ha
         1 wa
         3 ya
         5 ba
SQL> select a.*,rownum from t22 a;        ID NAME                     ROWNUM
---------- -------------------- ----------
         2 ha                            1
         1 wa                            2
         3 ya                            3
         5 ba                            4
如上所示 难道SELECT查询时的顺序就是插入时的顺序吗
印象中以前在什么地方看到过专门对这个问题的讲解 可是忘了我只记得好像书上说过插入的数据不一定是顺序存储的
不过SELECT如果是顺序读取的话 那么也可能和插入数据的顺序不一样可能我这里数据量太小 数据库活动也不频繁 所以看起来好像查询时的顺序和插入时的顺序一样吧呵呵 我怎么感觉有点绕 绕口令一样

解决方案 »

  1.   

    不一样。表中的记录是没有顺序的! 虽然在ORACLE中其实还有一个rowid.但物理上,ORACLE会根据块中的记录情况来自行安排存储的位置。比如 你有 1-100记录,此时删除了10-50,当再次插入记录 101时,它会把这条记录放到原来 10 的那个segment 中去。
      

  2.   

    恩 谢谢
    我知道
    你说的是存储的顺序和插入的顺序么我这里问的是插入的顺序和SELECT查询时读出数据的顺序
      

  3.   

    新的数据库是顺序的,不过经常有删除插入等动作的话,就是不顺序了
    这就是为什么有人认为ORACLE有默认排序的道理
      

  4.   

    呵呵 看来是我没把问题描述清楚 我换个方式问吧比如说表TEST里 
    插入数据的顺序为 1、3、2、4、5
    那么SELECT出来的顺序一定是13245吗如果是13245的话 那么继续下面的问题
    假如过程中删了3 插入了6 
    而且碰巧6插入在了被删除的3的位置上
    那么这个时候SELECT的顺序是什么
    16245?  12456?
      

  5.   

    我的试验结果是12456,这就是说默认的SELECT出来的顺序就是插入的先后顺序?关注一下。
      

  6.   

    1.一定是13245
    2.12456
    个人观点 呵呵  
    我认为插入的顺序与select的顺序是一致的(在没有任何order by的情况下)
      

  7.   

    比如说表TEST里 
    插入数据的顺序为 1、3、2、4、5 
    那么SELECT出来的顺序一定是13245吗 如果是13245的话 那么继续下面的问题 
    假如过程中删了3 插入了6 
    而且碰巧6插入在了被删除的3的位置上 
    那么这个时候SELECT的顺序是什么 
      

  8.   

    新的数据库是顺序的,不过经常有删除插入等动作的话,就是不顺序了 
    这就是为什么有人认为ORACLE有默认排序的道理 
      

  9.   

    在不使用order by字句时,oracle不会给你做任何排序的操作。很多人认为是按rowid排序,实际上并不是如此。实际上oracle不做任何操作(如果未使用rowid)楼主这个例子只是碰巧而已,并不能说明任何问题(虽然很多情况都是感觉到是按rowid这样)。oracle进行插入时也不是说后插入的记录的rowid一定比先插入的记录的rowid大,这是无稽之谈。它插入记录时是检查个表看是否有空间插入,如果无,则新的rowid。
      

  10.   

    很多人认为是按rowid排序,实际上并不是如此。实际上oracle不做任何操作(如果未使用rowid) --这句括号内写错了,应该是  (如果未使用order by)
      

  11.   

    呵呵 一夜之间这么多人回帖啊 谢谢大家哈回答这个问题我觉得首先得搞明白三点
    1、向表中插入数据的顺序
    2、数据在ORACLE中实际存储的顺序
    3、使用SELECT(无ORDER BY子句)检索出来数据的顺序从1和3来考虑
    从前面简单的实验来看 好像向表中插入数据的顺序就是使用SELECT检索出来数据的顺序(可是往往有些问题并不是一个简单的实验九能够证明的了的)把1、3结合上2一起考虑一下
    考虑一下ORACLE存储的顺序 我们都知道 在ORACLE不一定先插入的数据就一定排在前面 因为当新插入一条记录的时候 ORACLE会自动查找空闲空间 这个时候有可能后插入的记录反而存储在早插入记录的前面
    比如说上面说的那种情况:
    插入顺序是13245
    过程中删了3 插入了6 
    而且碰巧6插入在了被删除的3的位置上 
    这个时候存储的顺序就应该是16245好 那接下来就是SELECT检索数据的顺序了 我印象中好像ORACLE读取数据是顺序读取的吧(如果我没记错的话??) 那么这个时候就应该读取出来的顺序是16245(因为存储的顺序是16245 而又是顺序读取)
    这样的话就和上面的观点“读取顺序和插入顺序一样”这个观点矛盾了哦 呵呵 因为如果按照前面的观点的话结果应该为12456好饿 ~ 吃点早餐  
      

  12.   

    通过测试发现好像不经过order的话,select出来的顺序是随机的。
    create table t_a(col_1 varchar2(1),col_2 varchar2(1));
    ----------------------------------
    INSERT INTO t_a VALUES('2','2');
    INSERT INTO t_a VALUES ('0','0');
    INSERT INTO t_a VALUES('1','1');
    COMMIT;
    SELECT * FROM t_a;
    此时得到的结果顺序是: 2,0,1
    -----------------------------------
    DELETE FROM t_a WHERE NAME='0';
    COMMIT;
    INSERT INTO t_a VALUES('3','3');
    COMMIT;
    SELECT * FROM t_a;
    此时得到的顺序是 :2,1,3
    -------------------------------
    DELETE FROM t_a WHERE NAME='3' ;
    COMMIT;
    INSERT INTO t_a VALUES('3','3');
    COMMIT;
    SELECT *FROM t_a;
    如果按生成顺序得到select的顺序的话应该是 2,1,3,但是此时得到的结果是 :2,3,1
    --------------------------------
    综上所述得到:select的顺序跟插入顺序是没有关系的。
      

  13.   

    呵呵 不容易呀 
    终于试出来不同的结果了啊
    我也做过和你一样的实验
    不过结果是SELECT顺序和插入顺序一样没得出你的这种结果
      

  14.   

    这个有意义吗以前用foxpro的时候,数据的插入是有顺序的
    后来转到sqlserver这些大型的数据库后,教材里都是一直强调缺省的顺序无意义也不可靠