【数据库学习】分页查询

目录

文章目录

  • 说明
  • 语法
    • 1.mysql语法
      • - 指定初始位置
      • - 不指定初始位置
      • - 配合offset使用
    • 2.sql server语法
      • - 三重循环
      • - 利用max(主键)
      • - 利用row_number关键字(2005版本以上才有)
      • - offset /fetch next(2012版本及以上才有)
    • 3.orcale语法
      • - 采用伪列 rownum
      • - 分页查询一
      • - 分页查询二
      • - 分页查询三
  • 参考链接


说明

分页查询是为了让我们准确查询到某部分的数据,跟我们在网页的下一页那类是可以同等理解的,一页查询多少条数据,从数据的第几行开始显示,都是这个分页查询可以实现的。

语法

1.mysql语法

说明:limit是mysql中的分页语法,但也是限制查询结果的条数
注意:limit后的数必须是整数!

- 指定初始位置

select 字段名 from 数据表名  limit 初始位置,记录条数

初始位置从0开始

- 不指定初始位置

limit 记录数

“记录数”表示显示记录的条数。如果“记录数”的值小于查询结果的总数,则会从第一条记录开始,显示指定条数的记录。如果“记录数”的值大于查询结果的总数,则会直接显示查询出来的所有记录。

- 配合offset使用

limit 记录数 offset 初始位置

2.sql server语法

原作者中带有查看性能的代码,所以有兴趣可以去看文尾的链接。

-- 设置执行时间开始,用来查看性能的
set statistics time on ;

- 三重循环

1.先取前20页,然后倒序,取倒序后前10条记录,这样就能得到分页所需要的数据,不过顺序反了,之后可以将再倒序回来,也可以不再排序了,直接交给前端排序。

-- 分页查询(top)
select * 
from (select top pageSize * 
from (select top (pageIndex*pageSize) * 
from 数据表 
order by 字段id asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
as temp_sum_student -- 另命名
order by 字段id desc ) temp_order
order by 字段id asc

-- 分页查询第2页,每页有10条记录
select * 
from (select top 10 * 
from (select top 20 * 
from 数据表 
order by sNo asc ) -- 其中里面这层,必须指定按照升序排序,省略的话,查询出的结果是错误的。
as temp_sum_student 
order by 字段id desc ) temp_order
order by 字段id asc
;

2.先查询出前10条记录,然后用not in排除了这10条,再查询。无代码。

- 利用max(主键)

先top前11条行记录,然后利用max(id)得到最大的id,之后再重新再这个表查询前10条,不过要加上条件,where id>max(id)。

-- 分页查询(max)
select top pageSize * 
from 数据表 
where 字段id>=
(select max(字段id) 
from (select top ((pageIndex-1)*pageSize+1) 字段id
from 数据表 
order by  字段id asc) temp_max_ids) 
order by 字段id;
-- 分页查询第2页,每页有10条记录
select top 10 * 
from 数据表 
where 字段id>=
(select max(字段id) 
from (select top 11 字段id
from 数据表 
order by 字段id asc) temp_max_ids) 
order by 字段id;

- 利用row_number关键字(2005版本以上才有)

直接利用row_number() over(order by id)函数计算出行数,选定相应行数返回即可

-- 分页查询(row_number)
select top pageSize * 
from (select row_number() 
over(order by 字段id asc) as rownumber,* 
from 数据表 ) temp_row
where rownumber>((pageIndex-1)*pageSize);

-- 分页查询第2页,每页有10条记录
select top 10 * 
from (select row_number() 
over(order by 字段id asc) as rownumber,* 
from 数据表 ) temp_row
where rownumber>10;

- offset /fetch next(2012版本及以上才有)

offset A rows ,将前A条记录舍去,fetch next B rows only ,向后在读取B条数据。

-- 分页查询(offset /fetch next)
select * from 数据表
order by 字段id 
offset ((@pageIndex-1)*@pageSize) rows
fetch next @pageSize rows only;

-- 分页查询第2页,每页有10条记录
select * from 数据表
order by 字段id  
offset 10 rows
fetch next 10 rows only ;

说明:原作者推荐最后一种,第一种性能很差,本人没有实操,无法判定,故照搬。

3.orcale语法

- 采用伪列 rownum

1.查询前10条记录

select * from 数据表 where ROWNUM <10;

2.按照ID排名,抓取前三条记录
不能对ROWNUM使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果,所以直接用只能从1开始
rownum >10 没有记录,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录。

select * from 数据表 where rownum>=1;

3.如果想要用rownum不从1开始,需按下面方法使用

select 表别名.* 
from (select 数据表.*,rownum rn from 数据表) 表别名 
where rn >5;

- 分页查询一

select * from (
select 表别名.*,rownum rn from (
select * from 数据表) 表别名
where rownum <=5) 
where rn>=2;

- 分页查询二

select 表别名.* from (
select 数据表.*,rownum rn 
from 数据表 
where rownum <=5) 表别名 
where rn >=3;

- 分页查询三

select 表别名.* from (
select 数据表.*,rownum rn 
from 数据表) 表别名 
where rn between 3 and 5;

因为我没有学过oracle,所以都是其他部分截取,请多参考其他的。

参考链接

1.MySQL LIMIT:限制查询结果的条数
2.数据库分页查询
3.SQL server分页的四种方法(算很全面了)
4.Oracle数据库分页的三种方法

你可能感兴趣的:(数据库,分页查询,mysql,sqlserver,oracle)