数据库
首页 > 数据库> > sql-分页

sql-分页

作者:互联网

分页

oracle中使用伪列实现分页

a. 伪列

select rownum ,rowid, e.ename from emp e;
image

-- 报错 伪列不属于某一张具体的表
select e.rownum,e.rowid, e.ename from emp e;

image

b. 使用伪列实现分页

显示工资最高的前三条

select rownum, e.ename,e.sal from emp e where rownum <=3 ORDER BY sal;

这个sql错误
rownum 按初始顺序生成,一旦生成不可改变。
-- 这条先生成伪列,后排序

image

可以使用子查询实现

-- 先排序 后生成伪列   使用子查询
select rownum, e.ename,e.sal from (select * from emp order by sal desc) e where rownum <=3;

image

显示工资最高的第7-9条数据

select rownum,e.ename,e.sal from(select * from emp order by sal desc) e where rownum >= 7 and rownum <= 9;

image

原因:rownum只能使用< 、<=; 不能使用>、 >=
解决-->子查询

select * from (select rownum r, e.ename,e.sal from (select * from emp order by sal desc) e where rownum <=9) b where r >= 7;

注意 :

  1. where r >= 7; 这里判断的是虚表b 的列 rownum,不能写为 rownum >= 7,同时不能直接写为 b.rownum >= 7
  2. rownum <=9 不能写为 r <=9 :表的别名可以被自身表的列使用,但列的别名不能被自身表使用

分页SQL-oracle

假设每页显示10条数据,查询第n页的SQL语句是?

公式:
开始的索引 = (当前的页码 - 1) * 每页显示的条数 + 1
结束索引 = (当前的页码 * 每页显示的条数)

select * from (select rownum r, e.ename,e.sal from (select * from emp order by sal desc) e where rownum <= n*10 ) b where r >= (n-1)*10+1;

这里的10 就是 pageSize 页面大小;变量 n 就是 currentPage 当前页码

这个sql也可以改成 从数据库表中的第M条记录开始取N条记录形式,方便可其他数据库 参数 保持统一。

当然 实际写页面过程中 分页 需要五个变量来实现,其他一些参数都可以通过这五个变量来计算出来

1.数据总数
    查数据select count(*)

2.页面大小(每页显示的数据条数) 30
    用户自定页

3.总页数
    程序自动计算
    总页数=(数据条数%页面大小 == 0) ? (数据条数/页面大小):(数据条数/页面大小+1)

4.当前页(页码)
    用户自定页

5.当前页的对象集合(实体类集合):每页所显示的所有数据(10个人的信息)
    查数据库,分页sql
    List<Student>

mysql中使用limit实现分页

limit 是一个MySQL"方言" oracle不支持

语法:limit 开始的索引,每页查询的条数;

-- 每页显示3条记录
SELECT * FROM student LIMIT 0,3; -- 第1页
SELECT * FROM student LIMIT 3,3; -- 第2页
SELECT * FROM student LIMIT 6,3; -- 第3页

分页sql-mysql

Mysql数据库最简单就是利用LIMIT,从数据库表中M条记录开始检索N条记录的语句为:
SELECT [列名列表] FROM 表名称 LIMIT M,N
例如从表Sys_option(主键为sys_id)中从10条记录开始检索20条记录,语句如下:
select * from sys_option limit 10,20

分页sql-sqlserver

SQL Server
从数据库表中的第M条记录开始取N条记录,利用Top关键字(如果Select语句中既有top,又有orderby,则是从排序好的结果集中选择):
SELECT *
FROM ( SELECT Top N *
    FROM (SELECT Top (M + N - 1) * FROM  表名称  Order by 主键 desc) t1 ) t2
Order by 主键 asc;

例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
SELECT *
FROM (SELECT TOP 20 *
FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2
Order by sys_id asc;

标签:分页,sal,--,select,sql,rownum,SELECT
来源: https://www.cnblogs.com/jiyuchen1/p/16398620.html