日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle sql 分页

發布時間:2023/12/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle sql 分页 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Oracle實現分頁時,需要引入一個rownum的函數,rownum可以給記錄一個類似于id的字段。

以下收整理了常用的幾種sql分頁算法,數據庫以Oracle中emp為例。查詢結果如下:

SQL> select * from emp;

EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

?7369 SMITH????? CLERK????? 7902 1980/12/17???? 800.00?????????????? 20

?7499 ALLEN????? SALESMAN?? 7698 1981/2/20???? 1600.00??? 300.00???? 30

?7521 WARD?????? SALESMAN?? 7698 1981/2/22???? 1250.00??? 500.00???? 30

?7566 JONES????? MANAGER??? 7839 1981/4/2????? 2975.00?????????????? 20

?7654 MARTIN???? SALESMAN?? 7698 1981/9/28???? 1250.00?? 1400.00???? 30

?7698 BLAKE????? MANAGER??? 7839 1981/5/1????? 2850.00?????????????? 30

?7782 CLARK????? MANAGER??? 7839 1981/6/9????? 2450.00?????????????? 10

?7788 SCOTT????? ANALYST??? 7566 1987/4/19???? 3000.00?????????????? 20

?7839 KING?????? PRESIDENT?????? 1981/11/17??? 5000.00?????????????? 10

?7844 TURNER???? SALESMAN?? 7698 1981/9/8????? 1500.00????? 0.00???? 30

?7876 ADAMS????? CLERK????? 7788 1987/5/23???? 1100.00?????????????? 20

?7900 JAMES????? CLERK????? 7698 1981/12/3????? 950.00?????????????? 30

?7902 FORD?????? ANALYST??? 7566 1981/12/3???? 3000.00?????????????? 20

?7934 MILLER???? CLERK????? 7782 1982/1/23???? 1300.00?????????????? 10

14 rows selected
分頁方法1:使用嵌套查詢

SQL> select * from ( select t1.* , rownum as n from emp t1 where rownum? <= 15 ) where n >= 10;

EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO????????? N

----- ---------- --------- ----- ----------- --------- --------- ------ ----------

?7844 TURNER???? SALESMAN?? 7698 1981/9/8????? 1500.00????? 0.00???? 30???????? 10

?7876 ADAMS????? CLERK????? 7788 1987/5/23???? 1100.00?????????????? 20???????? 11

?7900 JAMES????? CLERK????? 7698 1981/12/3????? 950.00?????????????? 30???????? 12

?7902 FORD?????? ANALYST??? 7566 1981/12/3???? 3000.00?????????????? 20???????? 13

?7934 MILLER???? CLERK????? 7782 1982/1/23???? 1300.00?????????????? 10???????? 14

?

分頁方法2:使用minus

SQL> select * from emp where rownum <= 14 minus select * from emp where rownum < 10;

EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

?7844 TURNER???? SALESMAN?? 7698 1981/9/8????? 1500.00????? 0.00???? 30

?7876 ADAMS????? CLERK????? 7788 1987/5/23???? 1100.00?????????????? 20

?7900 JAMES????? CLERK????? 7698 1981/12/3????? 950.00?????????????? 30

?7902 FORD?????? ANALYST??? 7566 1981/12/3???? 3000.00?????????????? 20

?7934 MILLER???? CLERK????? 7782 1982/1/23???? 1300.00?????????????? 10

在方法二中,如果minus后的查詢語句執行where rownum > 10時,為什么不能查詢到任何的記錄呢?

ROWNUM是對結果集加的一個偽列,即先查到結果集之后再加上去的一個列(強調:先有結果集后再添加偽列)。

簡單的說 rownum 是對符合條件結果的序列號。它總是從1開始排起的。不能對rownum用">"。它與rownum實現的機制是有關的。同時, 也無法使用rownum = n(n>1的自然數)。rownum都是從1開始。?

分頁方法3 : 使用rowid

SQL> select * from emp where rowid in ( select rid from (select rowid as rid, rownum as id from emp t where rownum < 15) where id >= 10 );

EMPNO ENAME????? JOB???????? MGR HIREDATE????????? SAL????? COMM DEPTNO

----- ---------- --------- ----- ----------- --------- --------- ------

?7876 ADAMS????? CLERK????? 7788 1987/5/23???? 1100.00?????????????? 20

?7844 TURNER???? SALESMAN?? 7698 1981/9/8????? 1500.00????? 0.00???? 30

?7900 JAMES????? CLERK????? 7698 1981/12/3????? 950.00????????? ?????30

?7902 FORD?????? ANALYST??? 7566 1981/12/3???? 3000.00?????????????? 20

?7934 MILLER???? CLERK????? 7782 1982/1/23???? 1300.00?????????????? 10

?

方法四:使用分析函數

SQL> select * from ( select t.* , row_number() over(order by ename) as num from emp t ) where num between 10 and 15;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO NUM

----- ---------- --------- ----- ----------- --------- --------- ------ ----------

7934 MILLER CLERK 7782 1982/1/23 1300.00 10 10

7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 11

7369 SMITH CLERK 7902 1980/12/17 800.00 20 12

7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 13

7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 14

?

方法五:使用rownum偽列查詢所有記錄后,外層使用between and 或 大于 小于

SQL> select * from (select t.* , rownum as num from emp t) where num between 10 and 15;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO NUM

----- ---------- --------- ----- ----------- --------- --------- ------ ----------

7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 10

7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 11

7900 JAMES CLERK 7698 1981/12/3 950.00 30 12

7902 FORD ANALYST 7566 1981/12/3 3000.00 20 13

7934 MILLER CLERK 7782 1982/1/23 1300.00 10 14

轉載于:https://www.cnblogs.com/henuyuxiang/p/4076730.html

總結

以上是生活随笔為你收集整理的oracle sql 分页的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。