多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > 數(shù)據(jù)庫 > 數(shù)據(jù)庫應(yīng)用 > Oracle中的SQL分頁查詢原理和方法詳解

Oracle中的SQL分頁查詢原理和方法詳解

來源:程序員人生   發(fā)布時(shí)間:2016-06-21 11:12:13 閱讀次數(shù):4278次

轉(zhuǎn)載請注明出處:http://blog.csdn.net/anxpp/article/details/51534006,謝謝!

    本文分析并介紹Oracle中的分頁查找的方法。

    Oracle中的表,除我們建表時(shí)設(shè)計(jì)的各個(gè)字段,其實(shí)還有兩個(gè)字段(此處只介紹2個(gè)),分別是ROWID(行標(biāo)示符)和ROWNUM(行號),即便我們使用DESCRIBE命令查看表的結(jié)構(gòu),也是看不到這兩個(gè)列的描寫的,由于,他們實(shí)際上是只在數(shù)據(jù)庫內(nèi)部使用的,所以也通常稱他們?yōu)閭瘟校╬seudo column)。

    下面我們先建表并添加1些數(shù)據(jù)來驗(yàn)證上面的說明。

    建表:

  1. create table users(
  2. id integer primary key,
  3. name nvarchar2(20)
  4. )

    插入數(shù)據(jù):

  1. insert into users(id,name) values(1,'tom');
  2. insert into users(id,name) values(2,'cat');
  3. insert into users(id,name) values(3,'bob');
  4. insert into users(id,name) values(4,'anxpp');
  5. insert into users(id,name) values(5,'ez');
  6. insert into users(id,name) values(6,'lily');

    使用describe命令查看表結(jié)構(gòu):

    01

    可以看到,確切只有建表時(shí)的兩個(gè)字段。

    但我們可以查詢的時(shí)候,查找到偽列的值:

  1. select rowid,rownum,id,name from users;

    結(jié)果:

    02

    這個(gè)rowid我們1般用不到,Oracle數(shù)據(jù)庫內(nèi)部使用它來存儲行的物理位置,是1個(gè)18位的數(shù)字,采取base⑹4編碼。

    而這個(gè)rownum,我們也正是使用它來進(jìn)行分頁查詢的,它的值,就是表示的該行的行號。

    對分頁,我們只要想辦法可以查詢到從某1起始行到終止行就能夠的,分頁的邏輯可以放到程序里面。

    因而,我們天經(jīng)地義會想到以下語句查詢第2頁的數(shù)據(jù)(每頁2條數(shù)據(jù),頁碼從1開始,所以起始行的行號為 (頁碼⑴)*每頁長度+1=3,終止行的行號為 頁碼*每頁長度=4):

  1. select * from users where rownum>=3 rownum <= 4;

    哈哈!是否是發(fā)現(xiàn)沒有任何結(jié)果,緣由很簡單,Oracle機(jī)制就是這樣的:由于第1條數(shù)據(jù)行號為1,不符合>=3的條件,所以第1行被去掉,之前的第2行變成新的第1行(即這個(gè)行號不是寫死的,可以理解為是動態(tài)的),如此下去,1直到最后1行,條件始終沒法滿足,所以就1條數(shù)據(jù)也查不出來。

    既然找到了緣由,解決方法也就很明顯了,我們只要將行號查詢出來生成1個(gè)結(jié)果集,然后再從這個(gè)結(jié)果集中,選擇行號大于我們設(shè)定的那個(gè)值就能夠了,上面的分頁查找正確的寫法應(yīng)當(dāng)是這樣:

  1. select id,name from(
  2. select rownum rn,u.* from users u) ua
  3. where ua.rn between 3 and 4;

    上面的語句還可以優(yōu)化:>=不能用,但是<=是可以的,我們不需要在子查詢中將結(jié)果全部查出來,首先使用終止行挑選子查詢的結(jié)果,SQL以下:

  1. select id,name from(
  2. select rownum rn,u.* from users u where rownum<=4) ua
  3. where ua.rn >= 3;

    結(jié)果:

    03

    很多時(shí)候,我們其實(shí)不是盲目的分頁查找的,210按某1個(gè)或多個(gè)字段的升序或降序分頁,即包括 order by 語句的分頁查詢,我們先看1下 order by 的查詢結(jié)果中rownum是怎樣的:

  1. select rownum,id,name from users order by name;

    結(jié)果:

    04

    可以看到,我們說行號完全是動態(tài)的,也是不準(zhǔn)確的,這時(shí)候候的行號其實(shí)不是經(jīng)過 order by 后新結(jié)果的增序行號。

    但有了上面的嵌套查詢的經(jīng)驗(yàn),這里也能夠好好利用1下,怎樣做呢:先查找出排序好的結(jié)果集,然后利用上面的方法得到終究結(jié)果,sql以下:

  1. select id,name from(
  2. (select rownum rn,uo.* from
  3. (select * from users u order by name) uo
  4. where rownum<=4)) ua
  5. where ua.rn>=3;

    依照上面的結(jié)果,正確的分頁結(jié)果應(yīng)當(dāng)是id為2和5的,看下結(jié)果:

    05

    OK,結(jié)果正確。

    其實(shí)連表查詢之類的,也是差不多的,多點(diǎn)嵌套而已,掌握了原理,隨意分析1下就可以寫出對應(yīng)的SQL了,而編寫SQL時(shí),我們也得動動頭腦,畢竟SQL也是由優(yōu)劣之分的。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 福利免费在线 | 99国产精品欧美久久久久久影院 | 国内久久久久影院精品 | 国产美女无遮挡免费视频网站 | 精品日韩欧美一区二区三区 | 久久精品国产线看观看亚洲 | 一级毛片女人18水真多 | xxx久久| 国产第1页| 91国内揄拍国内精品对白不卡 | 无码精品一区二区三区免费视频 | 精品一久久香蕉国产二月 | 欧美xxxx18性欧美护士 | 欧美日本一区二区三区道 | 亚洲精品高清中文字幕 | 欧美日韩一区二区三区免费 | 国产欧美曰韩一区二区三区 | 久久久久久一品道精品免费看 | 国产区精品一区二区不卡中文 | 在线视频 中文字幕 | 国产精品亚洲综合一区在线观看 | 国产精品精品国产一区二区 | 全亚洲最大的免费影院 | 免费一级毛片清高播放 | 日本午夜在线观看 | 欧美激情在线视频播放 | 最近高清中文字幕免费 | 久久精品这里 | 东京干男人 | 国产欧美精品一区二区三区 | 日本xxxⅹ色视频在线观看网站 | 日本理论免费高清在线视频 | 毛片免费在线播放 | 国产丰满眼镜女在线观看 | 欧美巨大精品欧美一区二区 | α片毛片免费看 | www黄色免费 | 国产成人亚洲毛片 | 欧美日韩一区二区三区四区 | 久久精品嫩草影院免费看 | 久草三级 |