a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 98|回复: 1

[综合] Oracle辅导:举例解析oracle的ROWNUM

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
对于rownum来说它是oracle系统挨次分配为年夜发芽返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制发芽返回的总行数,而且rownum不能以任何表的名称作为前缀。   举例声名:* a* c( B) @- F& N6 T
  例如表:student(学生)表,表结构为:5 h! i5 w. v& O- e4 w: ^$ n' v
  ID       char(6)      --学号2 C/ l6 g) E  W' ~/ a
  name    VARCHAR2(10)   --姓名8 D5 u6 `2 h/ ^- Q- ~2 e
  create table student (ID char(6), name VARCHAR2(100));4 h, F( f" O$ O8 ^' Z
  insert into sale values('200001',‘张一’);6 M0 \- Q3 F( T8 v; j8 E
  insert into sale values('200002',‘王二’);
+ R9 u1 D" a3 q' p  insert into sale values('200003',‘李三’);
6 b- a$ ~; s2 f5 _$ X% ^8 R  insert into sale values('200004',‘赵四’);
# z0 q1 n0 ?3 U6 {4 p0 m  commit;
9 g2 v7 h2 O- H' f+ P  (1) rownum 对于等于某值的发芽前提& c) [# ]* p9 a" B7 `; a5 j  [+ m
  如不美观但愿找到学生表中第一条学生的信息,可以使用rownum=1作为前提。可是想找到学生表中第二条学生的信息,使用rownum=2结不美观查不到数据。因为rownum都是年夜1起头,可是1以上的自然数在rownum做等于判定是时认为都是false前提,所以无法查到rownum = n(n>1的自然数)。
% h( T9 s  Z* i0 v  SQL> select rownum,id,name from student where rownum=1;(可以用在限制返回记实条数的处所,保证犯警错,如:隐式游标)
  P3 d, @/ q9 @# I  SQL> select rownum,id,name from student where rownum=1;- W5 d' ]  _, ^4 O/ O
  ROWNUM ID     NAME; d: N: m' I" k4 ?( ?. _
  ---------- ------ ---------------------------------------------------
9 B6 R" b5 Y6 G0 }2 ^  1 200001 张一6 R1 h8 a2 i/ V8 Q
  SQL> select rownum,id,name from student where rownum =2;3 B6 R8 o4 ]+ O2 K6 `! {
  ROWNUM ID     NAME
* N4 {+ S7 e  g# Z  ---------- ------ ---------------------------------------------------' U# V5 h4 x% x9 S
  (2)rownum对于年夜于某值的发芽前提; |- h- t7 G! n% e2 c/ h
  如不美观想找到年夜第二行记灌往后的记实,当使用rownum>2是查不出记实的,原因是因为rownum是一个老是年夜1起头的伪列,Oracle 认为rownum> n(n>1的自然数)这种前提依旧不成立,所以查不到记实
* a8 r. P+ @7 Y  SQL> select rownum,id,name from student where rownum >2;# X0 _; v+ C5 Y( u: \' C' w
  ROWNUM ID     NAME3 G. U* t' A! W" @( F: S5 l  S
  ---------- ------ ---------------------------------------------------' z% ^' ?- ~% z5 \, L
  那若何才能找到第二行往后的记实呀。可以使用以下的子发芽体例来解决。注重子发芽中的rownum必需要有别号,否则仍是不会查出记实来,这是因为rownum不是某个表的列,如不美观不起别号的话,无法知道rownum是子发芽的列仍是主发芽的列。
$ W8 }4 r' W2 B- t7 n SQL>select * from(select rownum no ,id,name from student) where no>2;9 v& b0 r2 a9 x$ X' {' G- C7 o8 A  c
  NO ID     NAME/ u$ b+ F& u! u1 Z8 w8 s
  ---------- ------ ---------------------------------------------------$ ?( Y' y. `" z
  3 200003 李三
* \' G  t4 s  @$ W9 n% a, X  4 200004 赵四; d/ C6 o# z/ k) B# ]8 {
  SQL> select * from(select rownum,id,name from student)where rownum>2;+ I3 e/ t  ?% w2 e1 \' x
  ROWNUM ID     NAME
5 J$ b3 J+ }4 Z' j/ X8 o% Q8 `* Z9 l
  ---------- ------ ---------------------------------------------------
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:50 | 显示全部楼层

Oracle辅导:举例解析oracle的ROWNUM

</p>  (3)rownum对于小于某值的发芽前提, ^/ l3 J& l# d% y
  如不美观想找到第三标识表记标帜录音前的记实,当使用rownum select rownum,id,name from student where rownum  select * from (select rownum no,id,name from student where rownum=2;
2 ?: c( ^6 M$ A5 i  NO ID     NAME* j3 J% O9 J! v! s- e
  ---------- ------ ---------------------------------------------------
* t; a) B& `9 ?0 l& R  2 200002 王二
, j' ~' t# _+ _" @; `  w* \  3 200003 李三. j3 g  l1 a2 z, n3 I9 m# z
 (4)rownum和排序; R. a5 [4 Q2 S# W6 |
  Oracle中的rownum的是在取数据的时辰发生的序号,所以想对指定排序的数据去指定的rowmun行数据就必需注重了。
: d1 {, [* `( d9 o  SQL> select rownum ,id,name from student order by name;( T. ~% j; T% F" |& M2 f( e
  ROWNUM ID     NAME  @/ h% M! P! j: y8 L& l
  ---------- ------ ---------------------------------------------------  w4 i0 ]- u+ Z9 S4 [* T( g
  3 200003 李三. b. E# K$ P, s4 i7 j/ }7 r
  2 200002 王二* _4 ^- h% b7 e. X0 H" y
  1 200001 张一* Z1 Q1 G5 O  j
  4 200004 赵四: m; `2 m8 g" k& G# x! `
  可以看出,rownum并不是按照name列来生成的序号。系统是按照记实插入时的挨次给记实排的号,rowid也是挨次分配的。为体味决这个问题,必需使用子发芽: g; U! |9 m$ H" H. }, `& N: h
  SQL> select rownum ,id,name from (select * from student order by name);
, L  T* |. U0 _9 F" O" Q  ROWNUM ID     NAME3 @# \6 E/ r$ T' X  l
  ---------- ------ ---------------------------------------------------  r' L# l, Z3 n/ a& p; X0 Y
  1 200003 李三, T& N: S2 g; _' T5 O
  2 200002 王二- G6 U: c  C( d1 G
  3 200001 张一
$ _" F; U& O, i% P* j* F  4 200004 赵四
9 x9 W) G/ p& R/ V6 M3 O  这样就成了按name排序,而且用rownum标出正确序号(有小到年夜)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 14:29 , Processed in 0.359749 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表