使用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

相关文章
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
sql面试50题------(1-10)
这篇文章提供了SQL面试中的前10个问题及其解决方案,包括查询特定条件下的学生信息、教师信息和课程成绩等。
sql面试50题------(1-10)
|
12月前
|
数据采集 Java Linux
面试大神教你:如何巧妙回答线程优先级这个经典考题?
大家好,我是小米。本文通过故事讲解Java面试中常见的线程优先级问题。小明和小华的故事帮助理解线程优先级:高优先级线程更可能被调度执行,但并非越高越好。实际开发需权衡业务需求,合理设置优先级。掌握线程优先级不仅能写出高效代码,还能在面试中脱颖而出。最后,小张因深入分析成功拿下Offer。希望这篇文章能助你在面试中游刃有余!
219 4
面试大神教你:如何巧妙回答线程优先级这个经典考题?
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
726 1
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
4102 11
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
sql面试50题------(11-20)
这篇文章提供了SQL面试中的50道题目,其中详细解释了11至20题,包括查询与学号为“01”的学生所学课程相同的学生信息、不及格课程的学生信息、各科成绩统计以及学生的总成绩排名等问题的SQL查询语句。
sql面试50题------(21-30)
这篇文章是SQL面试题的21至30题,涵盖了查询不同老师所教课程的平均分、按分数段统计各科成绩人数、查询学生平均成绩及其名次等问题的SQL查询语句。
sql面试50题------(21-30)
|
SQL 监控 关系型数据库
PolarDB产品使用问题之SQL防火墙怎么拦截没有指定WHERE条件的特定表的SQL语
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
存储 SQL 索引
面试题MySQL问题之使用SQL语句创建一个索引如何解决
面试题MySQL问题之使用SQL语句创建一个索引如何解决
161 1