您的位置:首页 > 职场人生

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

2009-07-05 09:27 633 查看
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页。(几页自己定)
[align=left]第一页: 第二页: 第三页:[/align]
[align=left]7934 7839 7566
7902 7788 7521
7900 7782 7499
7876 7698 7369
7844 7654[/align]
[align=left]1.显示第一页的内容:[/align]
[align=left]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;[/align]
[align=left]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.显示第三页内容[/align]
[align=left]SQL> select * from (select a.*,rownum rn from (select * from emp order by empno desc) a where rownum<=14) where rn>=11;[/align]
[align=left]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语句来实现的。[/align]
[align=left]当然,其中的数字我们可以使用替代符&来替代,这样当我们执行语句的时候就不用一条一条的输入了,例如:[/align]
[align=left]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[/align]
[align=left]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[/align]
[align=left]如果要执行第二条时,如下:[/align]
[align=left]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[/align]
[align=left]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[/align]
[align=left]注意:上面的a为定义的别名,可以为任意字符,rn可以为任意字符[/align]
[align=left]rownum为表中的一个伪字段,我们同样可以查询,例如[/align]



[align=left]一个简单的分页显示就到这里了。 [/align]
本文出自 “宗军” 博客,请务必保留此出处http://tech110.blog.51cto.com/438717/174234
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: