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

简介:
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

相关文章
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
66 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
3月前
|
SQL
幂等修改表增加一列的sql语句
这个 SQL 查询用于修改名为 `t1` 的表,通过添加一个名为 `b` 的新列,并指定数据类型。`IF NOT EXISTS` 子句确保只有在表中不存在该列的情况下才会添加。 在你的查询中,`<数据类型>` 应该被替换为你想要的具体数据类型(例如,INT,VARCHAR等)。以下是使用 INT 数据类型的示例: ```sql ALTER TABLE t1 ADD COLUMN IF NOT EXISTS b INT; ``` 请根据你的需求选择合适的数据类型。这个查询的作用是在表 `t1` 中添加一个名为 `b` 的新列,如果该列尚不存在的话。
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
101 1
|
1月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
178 0
|
1月前
|
SQL
现有用户成就统计需求,每个用户有多个成就,某一个成就会被多人拥有,写出数据表设计方案,用一条sql查出每个成就(B.ach_name)下的男生(sex=0)和女生(sex=1)分别有多少?
现有用户成就统计需求,每个用户有多个成就,某一个成就会被多人拥有,写出数据表设计方案,用一条sql查出每个成就(B.ach_name)下的男生(sex=0)和女生(sex=1)分别有多少?
41 0
|
23天前
|
SQL 关系型数据库 MySQL
SQL常见面试题总结2
SQL常见面试题总结
52 2
|
29天前
|
SQL 关系型数据库 MySQL
MySQL SQL语句面试准备
MySQL SQL语句面试准备
13 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】——用SQL语句实现数据库和基本表的创建
【MySQL】——用SQL语句实现数据库和基本表的创建
66 3
【MySQL】——用SQL语句实现数据库和基本表的创建
|
2月前
|
SQL 关系型数据库 MySQL
慢SQL(面试题)
慢SQL(面试题)
31 1
|
3月前
|
SQL Oracle 关系型数据库
SQL 的 with as 临时中间表
SQL 的 with as 临时中间表
40 1