使用sql语句实现表的分页显示--实用--面试官最喜欢问的考题

  1. 云栖社区>
  2. 博客>
  3. 正文

使用sql语句实现表的分页显示--实用--面试官最喜欢问的考题

科技小能手 2017-11-12 13:55:00 浏览787
展开阅读全文
Oracle 版本 Release 10.2.0.4.0  系统平台 linux 5.0 企业版
以oracle自带的emp表为例
注意:如果装完后没有emp表,可以执行下面脚本安装
SQL> @/u02/app/oracle/product/10.2.0/db2/rdbms/admin/utlsampl.sql
执行完后emp表就装上了,默认用户名和密码:scott/tiger.如果不知道密码可以更改
SQL> show user                                                        
USER is "SYS"
SQL> alter user scott identified by "123";
用户名为scott,密码为123
如果提示被锁,执行下面的命令
SQL>alter user scott account unlock;
SQL> conn scott/123
Connected.
SQL> desc emp;
 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                              VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)
查看表内容,并以empno顺序排列,由大到小
SQL> select * from emp order by empno desc;
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
7900 JAMES      CLERK           7698 03-DEC-81        950                    30
7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
7839 KING       PRESIDENT            17-NOV-81       5000                    10
7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
7566 JONES      MANAGER         7839 02-APR-81       2975                    20
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
7369 SMITH      CLERK           7902 17-DEC-80        800                    20
14 rows selected.
以实现员工号empno分页显示为例,总共14行,一页5行,共3页。(几页自己定)
第一页:               第二页:               第三页:
7934                     7839                   7566
7902                     7788                   7521
7900                     7782                   7499
7876                     7698                   7369
7844                     7654
1.显示第一页的内容:
SQL> select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=5) where rn>=1;                               
EMPNO ENAME      JOB              MGR  HIREDATE      SAL      COMM     DEPTNO         RN
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 
7934   MILLER     CLERK               7782  23-JAN-82       1300              10          1
7902   FORD        ANALYST         7566  03-DEC-81       3000               20          2
7900   JAMES      CLERK               7698  03-DEC-81        950                30          3
7876   ADAMS      CLERK             7788  23-MAY-87     1100               20          4
7844   URNER       SALESMAN    7698  08-SEP-81        1500          0   30          5
2.显示第二页的内容                             
SQL> select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=10) where rn>=6;
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO         RN
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- -----
7839 KING       PRESIDENT            17-NOV-81       5000                    10          6
7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20          7
7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10          8
7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30          9
7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30         10

3.显示第三页内容
SQL> select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=14) where rn>=11;
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO         RN
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ------
7566 JONES      MANAGER         7839 02-APR-81       2975                    20         11
7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30         12
7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30         13
7369 SMITH      CLERK                   7902 17-DEC-80        800                    20         14 

这样就设置就达到了分三页显示内容的目的。一些论坛上和网站上的分页显示内容就是基于sql语句来实现的。
当然,其中的数字我们可以使用替代符&来替代,这样当我们执行语句的时候就不用一条一条的输入了,例如:
SQL> select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=&max) where rn>=&min;
Enter value for max: 10
Enter value for min: 6
old   1: select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=&max) where rn>=&min
new   1: select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=10) where rn>=6
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO         RN
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ------
7839 KING       PRESIDENT            17-NOV-81       5000                    10          6
7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20          7
7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10          8
7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30          9
7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30         10
如果要执行第二条时,如下:
SQL> /
Enter value for max: 5
Enter value for min: 1
old   1: select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=&max) where rn>=&min
new   1: select * from (select a.*,rownum rn from (select * from emp order by empno desc) a  where rownum<=5) where rn>=1
EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO         RN
---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ------
7934 MILLER     CLERK           7782 23-JAN-82       1300                    10          1
7902 FORD       ANALYST         7566 03-DEC-81       3000                    20          2
7900 JAMES      CLERK           7698 03-DEC-81        950                    30          3
7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20          4
7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30          5
注意:上面的a为定义的别名,可以为任意字符,rn可以为任意字符
rownum为表中的一个伪字段,我们同样可以查询,例如
  
一个简单的分页显示就到这里了。               
 


本文转自 zhangzj1030 51CTO博客,原文链接:http://blog.51cto.com/tech110/174234

网友评论

登录后评论
0/500
评论
科技小能手
+ 关注