兩句話筆記,記住ROWNUM

2021-06-23 07:52:58 字數 3472 閱讀 5523

--試驗用表

create table table_demo (id number(10),name varchar2(10));

--原來是用100條有序記錄試驗,有誤。已刪除

declare

i int := 1;

begin

loop

insert into table_example values (i,'user_' || i);

exit when i = 100;

i := i + 1;

end loop;

end;

--10條無序、不重覆記錄

insert into table_demo values ('10', 'user_10');

insert into table_demo values ('1', 'user_1');

insert into table_demo values ('8', 'user_8');

insert into table_demo values ('4', 'user_4');

insert into table_demo values ('6', 'user_6');

insert into table_demo values ('5', 'user_5');

insert into table_demo values ('3', 'user_3');

insert into table_demo values ('7', 'user_7');

insert into table_demo values ('9', 'user_9');

insert into table_demo values ('2', 'user_2');

簡單地查出第1條。

--查出第1條

select * from table_demo t where rownum = 1;

返回結果:

id     name

10     user_10

按id遞增排序,查出第1條。

①錯誤做法:

--按id遞增排序,查出第1條【錯誤】

select * from table_demo t where rownum = 1 order by t.id asc;

返回結果:

id     name

10     user_10

原因:rownum是對結果集加的乙個偽列;oracle是先給記錄乙個rownum,再進行order by。

當在where子句中使用rownum的時候,限制返回的行數為1,然後對唯一的這一條記錄進行排序。

②正確做法:

--按id遞增排序,查出第1條【正確】

select *

from (select * from table_demo t order by t.id asc)

where rownum = 1;

返回結果:

id     name

1       user_1

例如:查第2條。

①錯誤做法

--查出第2條【錯誤】

select * from table_demo t where rownum = 2;

返回結果:

(空)個人理解:rownum是對結果集加的乙個偽列。所以查詢時,每取到一條,就會去校驗一下條件:

where rownum = 2
又由於,rownum總是從1開始排起的。實際rownum=1 ≠ 2。所以,記錄被捨棄。

以此類推,所有的記錄都逐一被捨棄,最終返回空。

網上查到的解釋:「1」以上的自然數,在rownum做等於判斷是時認為都是false條件,所以無法查到rownum = n(n>1的自然數)。

②正確做法

--查出第2條【正確】

select * from (select rownum rn, t.* from table_demo t) where rn = 2

返回結果:

rn    id     name

2       1      user_1

--請按id遞增排序,查出前5條記錄。

select *

from (select * from table_demo t order by t.id asc)

where rownum <= 5;

返回結果:

id  name

1    user_1

2    user_2

3    user_3

4    user_4

5    user_5

目前只想到先遞減排序,取結果集,再遞增排序。

--請按id遞增排序,查出後5條記錄。

select *

from (select * from table_demo t order by t.id desc) c1

where rownum <= 5

order by c1.id asc

返回結果:

id     name

6      user_6

7      user_7

8      user_8

9      user_9

10    user_10

例如,m=3,n=7。

--請按id遞增排序,查出第3條至第7條記錄。(即第3、4、5、6、7這五條)

select *

from (select rownum rn, c1.*

from (select t.* from table_demo t order by t.id asc) c1)

where rn >= 3

and rn <= 7;

返回結果:

rn     id     name

3        3       user_3

4        4       user_4

5        5       user_5

6        6       user_6

7        7       user_7

兩句話寫的很好

只要你經商,就會有錢賺。備註 1.有這個想法,主要 於最近倒賣幾塊電路板,賺了幾百快錢,發現錢來得太容易了,我只是在網上和人聊聊天而已,雖然我不是陪聊,但是他們給我送錢了。2.經商的重大意義,在於大膽地開啟自己的口袋,讓錢可以很方便地流進來 土一點的道理就是,要是你不把帳號告訴別人,別人就不好打錢給...

再說兩句話 mysql 優化問題

原貼 http www.fcicq.net wp p 273 september 23,2006 at 19 37 45 filed under mysql sqlite,技術文件 使用了random posts外掛程式.重談mysql的優化問題.index cache開大點行不行?query ca...

兩句話治好頸椎病!

治好頸椎病第一句話 你拍一,我拍一,一直拍到七十七 就是右手拍左肩,左手拍右肩,能伸多遠伸多遠,一直拍到七十七次。這個動作,如果是年輕人,從後面拍更好。老人從前面拍也行。這樣做,血液馬上流暢。治好頸椎病牛人第二句話 深呼吸,下蹲起,10點10分去看戲 深呼吸,一種叫胸式呼吸,一種叫腹式呼吸。我們平時...