数据库分页查询SQL

总结一下关于oracle和mysql的分页查询语句

1:mysql分页查询

mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式:

/*
* sql:可以是单表的查询语句,也可以是多表的联合查询语句
* firstIndex:起始的索引
* pageSize:每页显示的记录数
*/
select o.* from (sql) o limit firstIndex,pageSize

2:oracle分页查询

oracle的分页查询方法相对来说要多点,主要介绍俩种查询方式:ROWNUM、row_number()

①ROWNUM查询分页通式:

/*
* firstIndex:起始索引
* pageSize:每页显示的数量
* sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
*/
select * from(select a.*,ROWNUM rn from(sql) a where ROWNUM<=(firstIndex+pageSize)) where rn>firstIndex


②row_number()解析函数分页查询通式:

 /*
 * firstIndex:起始索引
 * pageSize:每页显示的数量
 * orderColumn:排序的字段名
 * sql:可以是简单的单表查询语句,也可以是复杂的多表联合查询语句
 */
select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from(sql) t) p 
where p.rownumber>firstIndex) where rownum<=pageSize



对于oracle的分页查询,特地选出这两种实现方式是因为这两者各有千秋《转》

首先, 我们知道在ROWNUM查询的方式中,在第二层的sql语句中有个"where ROWNUM<firstIndex+pageSize",根据oracle的原则,第二层查询语句会嵌入到最内层中进行查询,也就是说,最开始执行的查询语句类似于:select * from wyuse where rownum<(firstIndex+pageSize) order by id asc,从数据表中查询出(firstIndex+pageSize)条记录,所以如果这个值很小的话,效率会很好,如果对于大数据量的表单,这个值如果是上千,比如:select * from wyuse where rownum<(5000) order by id asc,这样一开始会选出5000条记录,效率自然会慢很多....

不过,相对于ROWNUM,row_number()方式可能通过简化可以少一层嵌套,不过貌似对于大数量的查询,效率也高不到哪里去.....不过,对于大数量如果为表建立索引再结合row_number()效果会很好(未测试)


### Spring Boot 中实现数据库分页查询SQL 示例 在 Spring Boot 应用程序中,可以采用多种方式来实现数据库分页查询。以下是几种常见的方法及其对应的 SQL 示例。 #### 使用 MyBatis 和 PageHelper 插件 对于使用 MyBatis 的项目来说,PageHelper 是一个非常便捷的选择。只需要简单配置并调用特定的方法即可轻松完成分页操作[^1]: ```sql -- 假设有一个名为 users 的表 SELECT * FROM users ORDER BY id LIMIT #{offset},#{pageSize}; ``` 当配合 PageHelper 时,则不需要手动编写 `LIMIT` 子句,在 Mapper 接口中的 Java 方法前加上如下代码片段就可以自动处理分页逻辑: ```java // 设置分页参数, 参数分别为当前页码(pageNum), 页面大小(pageSize) PageHelper.startPage(1, 10); List<User> userList = userMapper.selectAll(); ``` #### 利用 JdbcTemplate 进行原生 SQL 分页 如果倾向于更底层的操作或者不希望引入额外框架的话,那么可以直接借助于 JdbcTemplate 来执行带有分页特性的 SQL 查询语句[^2]: ```sql -- 同样假设存在一张叫做 orders 的订单表格 SELECT * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY order_id ASC) AS row_num,* FROM orders WHERE status='PENDING' ) t WHERE t.row_num BETWEEN #{startRow} AND #{endRow} ``` 这里的关键在于利用窗口函数 `ROW_NUMBER()` 对记录编号,并通过子查询筛选出指定范围内的数据条目。 #### 结合 Redis 实现高效分页 为了提高性能特别是面对大量数据的情况下,还可以考虑将部分计算工作转移到缓存层——Redis 上面去完成。下面给出了一种基于 Redis 集合类型的解决方案概述[^4]: ```bash # 将符合条件的数据 ID 添加到有序集合里 ZADD myset NX CH INCR score member # 获取给定分数区间内的成员列表 ZRANGEBYSCORE key min max WITHSCORES LIMIT offset count ``` 这种方法能够有效减少对关系型数据库的压力,同时也加快了响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值