数据库学习之分页查询
目录文章目录说明语法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数据库分页的三种方法
更多推荐
所有评论(0)