在OracleRownum深度分析
对于rownum是从查询Oracle系统配置命令返回的行数,对收益分配的第一行是1,其次是2,等等,伪领域可以用来限制总的行数由查询返回的,但不能使用rownum作为前缀的任何表的名称。
例子如下:
例如,表:学生(学生)表,表结构是:
复制代码代码如下所示:
ID字符(6)--学号
(10)名字名字空
学生表(ID char(6),名VARCHAR2(100));
插入出售的价值('200001,张1);
插入出售的价值('200002 ','王');
插入出售的价值('200003 ','李三');
插入出售的价值('200004、赵四);
承诺;
(1)对查询条件等于一定值的行号
如果你想在学生的名单中找到的第一个学生的信息,rownum = 1可以作为一个条件。但你要在学生的观察发现二学生信息,并使用rownum = 2的结果找出数据。因为rownum是从1开始的,但更多的超过1的自然数作为虚假条件当行号等于判断。因此,rownum = n(n>1的自然数)可以不被发现。
SQL>行号,ID,从学生那里rownum = 1名;(可以用来限制返回的条目,数量,确保无误,如隐式游标)。
SQL>行号、ID、名称从学生那里rownum = 1;
行号标识名称
-------------------------------------------------------------------
1200001一个
SQL>行号、ID、名称从学生那里rownum = 2;
行号标识名称
-------------------------------------------------------------------
(2) rownum for query conditions greater than a certain value
如果你想从第二排找到一个记录,它不能使用rownum > 2时记录。原因是,rownum是伪列总是从1开始。Oracle认为rownum >条件n(n>1的自然数)仍然是无效的,所以没有记录。
SQL>行号,ID,从学生那里rownum > 2名;
行号标识名称
-------------------------------------------------------------------
我怎么能二线后找到记录。下面的子查询的方法可以解决这个问题。注意,在子查询rownum必须有别名,否则,它将不会找到记录。这是因为rownum不表的列。如果你不能得到一个别名,你可以不知道rownum是子查询或主查询的列的列。
SQL> select * from(行号不,ID,名字从学生那里没有> 2);
没有身份证的名字
-------------------------------------------------------------------
3200003 Li San
4200004 Zhao Si
SQL> select * from(行号、ID、名称从学生那里rownum > 2);
行号标识名称
-------------------------------------------------------------------
(3)小于一定值的行号查询条件
如果你想找一个以前的第三的记录,当使用rownum1自然数的条件被认为是有效的,一个记录可以发现。
SQL>行号,ID,从学生那里rownum < 3名;
行号标识名称
-------------------------------------------------------------------
1200001一个
2200002王二
在一些情况下,可能需要在一个范围内的数据的行号查询,然后怎么做可以从真正的人类看到rownum小于某值的查询条件,rownum大于一定值的查询直接为假,但是可以间接的把它认为是真的,那你必须使用子查询,例如,查询之间的第二的行号的数据第三条,包括数据的第二和第三线,所以我们只能写下面的语句,让它返回小于或等于三的行,然后确定新的rownum别名列大于或等于主查询两行。但这样的操作会影响大型数据集的速度。
SQL> select * from(行号不,ID,名字从学生那里rownum = 2;
没有身份证的名字
-------------------------------------------------------------------
2200002王二
3200003 Li San
(4)行号和排序
Oracle Rownum是序号时产生的数据,因此需要注意的rowmun行数据,为指定类型的数据指定。
SQL>行号,ID,名字从学生秩序的名字;
行号标识名称
-------------------------------------------------------------------
3200003 Li San
2200002王二
1200001一个
4200004 Zhao Si
你可以看到,行号不是一个由名称列生成的序列号,系统在记录的插入顺序记录的数量,和rowid是分配秩序。为了解决这个问题,必须使用子查询
SQL>行号、ID、名称(按名称选择从学生的顺序);
行号标识名称
-------------------------------------------------------------------
1200003 Li San
2200002王二
3200001一个
4200004 Zhao Si
这是命令的名字,和正确的序列号是标有行号(小到大)