SQL分页
2015-11-02 11:16
295 查看
想要查询Student表。在表格中显示为一行有M条记录,现要显示第N页的记录。如此实现。
如果此表有递增的ID我们当然可以使用id进行筛选查询,如下:
但是可能由于种种原因,id并不是连续的数值。这样查询出来的分页数据,一定会不正确。那怎么办呢。
此时,就必须要用row_number() over(order by 字段)进行排序了
这时候,表中就有一列按顺序排序的id值了。
想要进行分页显示就必须加上where条件,但我们都知道在查询的sql中,Sql的执行顺序是先执行FROM,再是WHERE,再是GROUP BY,ORDER BY……,最后才是SELECT的查询字段,对于这样的执行顺序,显示,现在在这样Sql上,加where条件,不可能达到上面筛选的效果。那么,问题来了。
其实很简单。只有我们将上面的查询做为结果,再在外面进行一行筛选查询即可。即,使用派生表分页。
同进,问题也来了,不能每次要进行分页查询的时候,都对整个表进行相同的查询,这样明显很繁琐。
这时候,我们就可以使用视图了。在内部的查询做为一个视图,以后每次再进行分页的时候,就要对视图进行操作就OK了
以后再次需要分页的时候,只有对视图进行操作即可。
如果此表有递增的ID我们当然可以使用id进行筛选查询,如下:
select * from Student where Id between M*(N-1)+1 and N*M
但是可能由于种种原因,id并不是连续的数值。这样查询出来的分页数据,一定会不正确。那怎么办呢。
此时,就必须要用row_number() over(order by 字段)进行排序了
这时候,表中就有一列按顺序排序的id值了。
想要进行分页显示就必须加上where条件,但我们都知道在查询的sql中,Sql的执行顺序是先执行FROM,再是WHERE,再是GROUP BY,ORDER BY……,最后才是SELECT的查询字段,对于这样的执行顺序,显示,现在在这样Sql上,加where条件,不可能达到上面筛选的效果。那么,问题来了。
其实很简单。只有我们将上面的查询做为结果,再在外面进行一行筛选查询即可。即,使用派生表分页。
select * from( select row_number() over(order by id) id_num,* from Student) where id_num between M*(N-1)+1 and N*M
同进,问题也来了,不能每次要进行分页查询的时候,都对整个表进行相同的查询,这样明显很繁琐。
这时候,我们就可以使用视图了。在内部的查询做为一个视图,以后每次再进行分页的时候,就要对视图进行操作就OK了
create view Student_ByPage as select row_num() over (order by id) as id_num,* from Student
以后再次需要分页的时候,只有对视图进行操作即可。
select * from Student_ByPage where id_num between M*(N-1)+1 and N*M
相关文章推荐
- crontab 中 python(cx_Oracle)脚本执行时需要用户环境变量,怎么办??
- 关系型数据库设计
- 【xampp】修改mysql默认端口号后无法访问
- sqlserver 通用分页存储过程
- SQL SERVER四舍五入你除了用ROUND还有其他方法吗?
- postgresql常用的查询语句
- 对数据库视图view的理解
- MongoDB学习笔记(数据操作)
- Oracle11g,在SQL Developer里新建连接时出现错误的解决办法
- Oracle11g,在SQL Developer里新建连接时出现错误的解决办法
- MyBatis的动态SQL详解
- SQL 左外连接,右外连接,全连接,内连接
- mysql 用户表中多个host时的匹配规则
- hibernate 原生sql
- mysql 笔记 查询时分秒做条件
- SQL union 从字符串转换日期和/或时间时,转换失败(基础知识不牢固导致坑爹的问题)
- OracleParameter中参数名必须是DB中已有字段:【 ORA-01745: 无效的主机/绑定变量名】
- mysql添加外键时报errno: 150错误的解决方法
- mysql 索引总结
- Oracle SQL Developer 添加SQLServer 和Sybase 连接