首页 > 数据库 >mysql limit分页用法讲解

mysql limit分页用法讲解

时间:2023-02-14 10:01:35浏览次数:48  
标签:分页 THEMEID mysql theme LIMIT 讲解 limit SELECT

1.情景展示

在Oracle当中,使用rownum来进行分页;

而在mysql中,是没有rownum的,需要通过limit来实现。

2.用法介绍

limit [offset,]rows

limit后面可以跟一个参数,也可以跟两个参数;

格式一:

limit rows

rows代表行数,表示:获取前rows行数据。

等价于:

limit 0, rows

格式二:

limit offset,rows

offset代表偏移量,rows代表行数,表示:获取偏移量后面的rows行数据,相当于查询的是:

offset<rownum≤rows

或offset+1≤rownum≤rows。

偏移量的初始值为0(不是1),这就是可以解释,为什么格式一当中的两种方式一样的原因啦。

举例子:

-- 获取表前5行数据
SELECT 1 FROM meta_theme ORDER BY THEMEID LIMIT 5;
SELECT 1 FROM meta_theme ORDER BY THEMEID LIMIT 0,5;

mysql limit分页用法讲解_偏移量

 获取第6-10行数据

分析:

6-10行,也就是10-6+1=5,共5行数据;

由于limit第一个参数的偏移量不在查询范围内,所以,要想第6行包含在内,需要:6-1=5。

mysql limit分页用法讲解_子查询_02

使用limit的问题,就在进行分页查询的时候,有点绕。

知道了limit偏移量的特性之后,我们可以发现:

要想,将第一行数据包含在内,就需要限制limit的第一个参数值必须为0;

否则的话,我们进行分页时,将会将以第一条数据遗漏,比方说:

mysql limit分页用法讲解_偏移量_03

分页虽然从数量量没有错,但是,此时已经将第一条数据排除在外了。

所以,需要保证,limit的第一页数据包含第一行记录,也就是limit需要从0开始。

LIMIT (pageIndex-1)*pageSize, pageSize

pageSize起始值为1。

注意事项:

limit 后面只能跟数字,不能跟其它

-- 错误用法1:limit后面跟 字符串转数字函数
LIMIT CAST('10' AS SIGNED)
-- 错误用法2:limit后面跟 数字计算
LIMIT 20-10

3.性能分析

基本用法

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

在中小数据量的情况下,这样的SQL足够用了;

我们可以使用了复合索引来提升查询速度(where的限制条件与order by的排序条件组合成联合索引);

SELECT THEMEID,2 test FROM meta_theme where STATUS=1 ORDER BY THEMEID LIMIT 0,5;

在这里,为了提升查询速度,我们就可以给字段STATUS+THEMEID,创建索引。

PS:表主键是唯一索引。

子查询分页

随着数据量的增加,页数会越来越多,越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢;

可以通过子查询的方式来提高分页效率。

-- 查询第10001-10010条数据
SELECT
THEMENAME,
THEMECODE
FROM
meta_theme
WHERE
THEMEID >= ( SELECT THEMEID FROM meta_theme WHERE THEMELEVEL = 5 ORDER BY THEMEID LIMIT 10000, 1 )
LIMIT 10

自连接

也可以通过自连接的方式来提高分页效率。

SELECT t1.THEMEID, THEMENAME, THEMECODE FROM meta_theme t1,( SELECT THEMEID FROM meta_theme ORDER BY THEMEID DESC LIMIT 10, 1 ) t2 
WHERE
t1.THEMEID < t2.THEMEID
ORDER BY
t1.THEMEID DESC
LIMIT 10;

小结:

可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!



作者:Marydon


标签:分页,THEMEID,mysql,theme,LIMIT,讲解,limit,SELECT
From: https://blog.51cto.com/u_15964717/6055568

相关文章

  • mysql、oracle 分组查询,每组取一条数据
    1.情景展示有这样一种需求:将数据按照机构进行分组,然后取每个机构下只取一条记录,如何实现?2.mysql分组查询出来某字段,然后和原来的表进行关联查询。方式一:通过内连接来实现查......
  • MySQL 8.0 修改root远程登录【ERROR 1410 (42000): You are not allowed to create a
    MySQL8.0的数据库root用户默认无法远程登录,需要修改root的远程授权,如下:mysql>grantallprivilegeson*.*to'root'@'%';ERROR1410(42000):Youarenotallowed......
  • (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第零节:MYSQL环境安装和表的建立以及
    pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解目录一:注意事项二:MYSQL环境(1)下载(2)安装(3)MYSQL可视......
  • mysql 创建库和表
    数据库创建数据库查看数据库删除数据库数据表创建表查看表删除表清除表数据数据库创建数据库语法CREATEDATABASE[IFNOTEXISTS]<数据库名>[[DEFA......
  • MySQL基础
    基础篇通用语法及分类DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)DML:数据操作语言,用来对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中......
  • node mysql 增删改查 demo
    前端原生jsJquery后端Node数据库MySQL​​​http://hongbin.xyz:8080/​​​​github仓库​​​​演示视频地址​​node增删改查TODO:删除用户数据库需要触发器将......
  • 关于我忘记MySQL root 密码那件事
    登录MySQL时,忘记密码,百度一番找到合适的方法问题已解决,记录一下。该篇文章仅做学习用,方便自己下次查找。1、先把MySQL的服务为停了,可以直接按win键搜服务,找到MySQL服务,......
  • mysql查询语句case及时间操作
    1、获取系统当前时间戳SELECT unix_timestamp(now())*1000 --乘以1000,为了得到毫秒时间戳   2、时间戳转年月日SELECTFROM_UNIXTIME(1676280033000/1000,......
  • mysql怎么删除重复数据并且保留其中一条
    现在有张加班表,一个人同一天只允许申请一次加班,就是加班日期和userid相同的数据应该只有一条,但是现在由于之前没有做限制,导致很多数据重复怎么通过sql删掉重复数据思路:......
  • 数据库导出excel信息(mysql数据库已经验证)
    导出表信息1SELECT2TABLE_NAME表名,3REPLACE(4REPLACE(TABLE_COMMENT,CHAR(10),''),5CHAR(13),6','7......