详解Oracle的几种分页查询语句

合集下载

Oracle的分页查询代码

Oracle的分页查询代码

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
28 consistent gets
0 physical reads
0 redo size
4 3 TABLE ACCESS (FULL) OF 'T1' (Cost=826 Card=96985 Bytes=1842715)
5 3 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=1 Card=1 Bytes=11)
6 5 INDEX (UNIQUE SCAN) OF 'PK_T' (UNIQUE)
PL/SQL 过程已成功完成。
SQL> SELECT /*+ FIRST_ROWS */ USER_ID, USERNAME, NAME
2 FROM
3 (
4 SELECT ROWNUM RN, USER_ID, USERNAME, NAME
5 FROM
6 (
7 SELECT ER_ID, ERNAME,
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=97811 Card=20 Bytes=1200)
1 0 VIEW (Cost=97811 Card=20 Bytes=1200)
2 1 COUNT (STOPKEY)
3 2 NESTED LOOPS (Cost=97811 Card=96985 Bytes=2909550)

oracle 分页sql写法

oracle 分页sql写法

一、概述在进行数据库查询时,经常会遇到需要分页展示数据的情况。

而在Oracle数据库中,需要用到分页查询的SQL语句。

本文将就Oracle 中的分页SQL写法进行详细介绍。

二、基本分页SQL语句在Oracle数据库中,可以使用ROWNUM来实现分页查询。

以下是基本的分页SQL语句示例:```sqlSELECT * FROM (SELECT t.*, ROWNUM rnFROM (SELECT * FROM your_table ORDER BY order_column) t WHERE ROWNUM <= pageSize * pageNum)WHERE rn > pageSize * (pageNum - 1)```其中,your_table是要查询的表名,order_column是用来排序的字段,pageSize是每页展示的数据条数,pageNum是要查询的页数。

三、分页SQL写法解析1. 内部查询和外部查询分页SQL语句中,有一个内部查询和一个外部查询。

内部查询用来获取排序后的数据和每行数据对应的行号,外部查询用来根据行号来筛选需要的数据并展示。

2. 内部查询内部查询中使用了ROWNUM来标记行号,并通过ORDER BY语句来对数据进行排序。

内部查询的结果会被外部查询筛选。

3. 外部查询外部查询使用了WHERE语句来筛选出需要展示的数据,并且通过pageSize和pageNum来计算需要查询的数据范围。

四、使用样例假设有一个名为employee的表,包含字段id、name、age,现需要从该表中查询第2页的数据,每页展示10条数据,并按id字段进行排序。

则对应的分页SQL语句为:```sqlSELECT * FROM (SELECT t.*, ROWNUM rnFROM (SELECT id, name, age FROM employee ORDER BY id) t WHERE ROWNUM <= 10 * 2)WHERE rn > 10 * (2 - 1)```这条SQL语句将返回employee表中第11-20条数据,并按id字段排序。

oracle得分页实现方式

oracle得分页实现方式

oracle得分页实现方式Oracle是一款强大的关系型数据库管理系统,它提供了多种实现分页功能的方式。

本文将介绍几种常用的Oracle实现分页的方式,并对每种方式进行详细说明。

一、使用ROWNUM实现分页ROWNUM是Oracle中的一种伪列,它可以用来给查询结果集中的每一行分配一个唯一的行号。

通过使用ROWNUM,我们可以很方便地实现分页功能。

具体步骤如下:1. 编写SQL语句,查询需要分页的数据。

例如,我们需要查询一个名为"students"的表中的数据,并按照学生的ID进行升序排序。

SELECT * FROM students ORDER BY student_id;2. 使用ROWNUM限制查询结果的行数。

例如,我们需要查询第1页的数据,每页显示10条记录。

SELECT * FROM students WHERE ROWNUM <= 10;3. 使用ROWNUM进行分页。

例如,我们需要查询第2页的数据,每页显示10条记录。

SELECT * FROM (SELECT * FROM students WHERE ROWNUM <= 20) WHERE ROWNUM > 10;通过以上步骤,我们可以实现基于ROWNUM的分页功能。

需要注意的是,ROWNUM是在数据返回给客户端之前进行计算的,因此我们需要在外层查询中再次使用ROWNUM进行限制,以达到分页的效果。

二、使用ROW_NUMBER()函数实现分页ROW_NUMBER()函数是Oracle中的一个窗口函数,它可以为查询结果集中的每一行分配一个唯一的行号。

通过使用ROW_NUMBER()函数,我们可以更加灵活地实现分页功能。

具体步骤如下:1. 编写SQL语句,查询需要分页的数据,并使用ROW_NUMBER()函数为每一行分配行号。

例如,我们需要查询一个名为"students"的表中的数据,并按照学生的ID进行升序排序。

oracle分页sql语句

oracle分页sql语句

oracle分页sql语句分页查询是在大数据量的情况下,为了提高查询效率和减少内存占用,将结果分批次展示给用户的一种常用技术。

在Oracle数据库中,我们可以使用ROWNUM和ROW_NUMBER函数来实现分页查询。

1. 使用ROWNUM实现分页查询ROWNUM是Oracle中的伪列,它会为查询结果集中的每一行赋予一个唯一的行号。

我们可以利用ROWNUM来实现分页查询的功能。

```sqlSELECT *FROM (SELECT t.*, ROWNUM AS rnFROM table_name tWHERE conditionsORDER BY order_column)WHERE rn BETWEEN start_row AND end_row;```其中,table_name是要查询的表名,conditions是查询条件,order_column是排序列,start_row和end_row是要查询的行范围。

2. 使用ROW_NUMBER函数实现分页查询ROW_NUMBER函数是Oracle提供的窗口函数之一,它可以为查询结果集中的每一行赋予一个唯一的序号。

我们可以利用ROW_NUMBER函数来实现分页查询的功能。

```sqlSELECT *FROM (SELECT t.*, ROW_NUMBER() OVER(ORDER BY order_column) AS rnFROM table_name tWHERE conditions)WHERE rn BETWEEN start_row AND end_row;```其中,table_name是要查询的表名,conditions是查询条件,order_column是排序列,start_row和end_row是要查询的行范围。

3. 使用OFFSET-FETCH语法实现分页查询Oracle 12c及以上版本引入了OFFSET-FETCH语法,可以更简洁地实现分页查询的功能。

Day08-Oracle分页查询和视图

Day08-Oracle分页查询和视图

Day08-Oracle分页查询和视图view Oracle分页查询分页查询是我们学习任何一种数据库,必需掌握的一个要点。

mysql数据库的分页查询说明:select * from 表名 where 条件 limit 从第几条取,取几条;oracle数据库的分页查询说明:oracle每张表都有rownum默认字段,默认情况下是不显示的。

但是是一直存在的。

SQL>select t2.* from (select t1.*,rownum rn from (select * from emp) t1 where rownum<=6) t2 where rn>=4;解释:select * from emp//为第一张表,查询表中的所有数据select t1.*,rownum rn from(select * from emp) t1where rownum<=6//为第二张表,把表一查到的数据看成一张临时表从中取出前6条数据,并形成第二张临时表。

select t2.* from(select t1.*,rownum rn from(select * from emp) t1 where rownum<=6) t2where rn>=4;//为第三张表,把表二中取到的6条数据看成临时表,并从这6条数据中从第4条取到第6条数据,再形成第三张临时表,也就是我们所要查询的最终结果。

分页查询语法模版:select t2.* from(select t1.*,rownum rn from(select * from 表名) t1 where rownum<=大范围(取到多少条数据)) t2where rn>=小范围(从第几条数据开始取);特别说明:oracle分页查询是通过三层筛选法进行查询的。

每一次都可以带where条件来对要查询的信息进行筛选。

建议:针对不同情况分页查询,尽可能的在最内层(第一层)设置条件,包括多表分页;第二层设置最大取值范围;第三层从第几条数据开始取值。

oracle分页sql语句

oracle分页sql语句

oracle分页sql语句Oracle是一种关系型数据库管理系统,它支持使用SQL语言进行数据查询与操作。

在实际应用中,我们经常需要对大量数据进行分页展示,以提高查询效率和用户体验。

下面列举了10个符合题目要求的Oracle分页SQL语句,并对每个语句进行详细解释。

1. 使用ROWNUM进行简单分页查询```sqlSELECT *FROM (SELECT t.*, ROWNUM rnFROM table_name tWHERE conditionORDER BY column_name)WHERE rn BETWEEN start_row AND end_row;```这个SQL语句使用ROWNUM函数来对查询结果进行分页,首先对原始查询结果进行编号,然后使用WHERE子句筛选出需要的行。

其中start_row和end_row表示需要展示的起始行和结束行。

2. 使用OFFSET和FETCH进行分页查询```sqlSELECT *FROM table_nameWHERE conditionORDER BY column_nameOFFSET start_row ROWS FETCH NEXT page_size ROWS ONLY;```这个SQL语句使用OFFSET和FETCH关键字来进行分页查询,OFFSET 表示跳过的行数,page_size表示每页展示的行数。

这种方式在Oracle 12c及以上版本中支持。

3. 使用关联子查询进行分页查询```sqlSELECT *FROM table_nameWHERE (SELECT COUNT(*)FROM table_nameWHERE condition AND column_name < t.column_name) < start_rowAND conditionORDER BY column_nameFETCH FIRST page_size ROWS ONLY;```这个SQL语句使用关联子查询来进行分页查询。

Oracle分页查询

Oracle分页查询

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。

分页查询格式:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) AWHERE ROWNUM <= 40)WHERE RN >= 21其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。

ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。

分页的目的就是控制输出结果集大小,将结果尽快的返回。

在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。

而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。

这是,查询语句如下:SELECT * FROM(SELECT A.*, ROWNUM RNFROM (SELECT * FROM TABLE_NAME) A)WHERE RN BETWEEN 21 AND 40对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。

对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。

oracle分页方法

oracle分页方法

oracle分页方法oracle的分页一共有三种方式方法一根据rowid来分SELECT *FROM EMPWHERE ROWID IN(SELECT RIDFROM (SELECT ROWNUM RN, RIDFROM (SELECT ROWID RID, EMPNO FROM EMP ORDER BY EMPNO DESC)WHERE ROWNUM <= ( (currentPage-1) * pageSize + pageSize )) --每页显示几条WHERE RN > ((currentPage-1) * pageSize) ) --当前页数ORDER BY EMPNO DESC;eg、-- 5 = (currentPage-1) * pageSize + pageSize 每页显示几条-- 0 = (currentPage-1) * pageSize 当前页数SELECT *FROM EMPWHERE ROWID IN(SELECT RIDFROM (SELECT ROWNUM RN, RIDFROM (SELECT ROWID RID, EMPNO FROM EMP ORDER BY EMPNO DESC)WHERE ROWNUM <= ( (1-1) * 5 + 5 )) --每页显示几条 WHERE RN > ((1-1) * 5) ) --当前页数ORDER BY EMPNO DESC;方法二按分析函数来分SELECT *FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY empno DESC) RK FROM emp T)WHERE RK <= ( (currentPage-1) * pageSize + pageSize ) --每页显示几条AND RK > ( (currentPage-1) * pageSize ); --当前页数eg、-- 5 = (currentPage-1) * pageSize + pageSize 每页显示几条-- 0 = (currentPage-1) * pageSize 当前页数SELECT *FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY empno DESC) RK FROM emp T)WHERE RK <= 5AND RK > 0;方法三按rownum 来分SELECT *FROM (SELECT T.*, ROWNUM RNFROM (SELECT * FROM EMP ORDER BY EMPNO DESC) T WHERE ROWNUM <= ( (currentPage-1) * pageSize + pageSize )) --每页显示几条WHERE RN > ( (currentPage-1) * pageSize ); --当前页数eg、-- 5 = (currentPage-1) * pageSize + pageSize 每页显示几条-- 0 = (currentPage-1) * pageSize 当前页数SELECT *FROM (SELECT T.*, ROWNUM RNFROM (SELECT * FROM EMP ORDER BY EMPNO DESC) T WHERE ROWNUM <= 5)WHERE RN > 0;其中emp为表名称,empno 为表的主键id,获取按empno降序排序后的第1-5条记录,emp表有70000 多条记录。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

分页查询格式:
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WHERE RN >= 21
其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。

ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。

分页的目的就是控制输出结果集大小,将结果尽快的返回。

在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。

而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。

这是,查询语句如下:
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A )WHERE RN BETWEEN 21 AND 40
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。

对于第一个查询语句,第二层的查询条件 WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle 无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。

因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。

数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。

下面简单讨论一下多表联合的情况。

对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。

在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。

那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的
连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:
SELECT /*+ FIRST_ROWS */ * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40)WHERE RN >= 21。

相关文档
最新文档