在使用查询语句的时候,经常要返回前几条或者中间某几行数据,但是你的数据库查询记录有几万、几十万时,这个时候怎么办呢?mysql 已经为我们提供了上面这样一个功能。
使用LIMIT查询,效率非常快,且能查询出你需要的数据,再也不用全表查询导致查询数据库崩溃的情况。
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。
select* from table LIMIT [offset,] rows | rows OFFSET offset
offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)
例如:
select* from table LIMIT 9; //从第1行开始,检索前 9个记录行,显示9条数据,共显示id为1....9
等价于 select* from table LIMIT 0,9; //从第1行开始,检索前 9个记录行,显示9条数据,共显示id为1....9
select* from table LIMIT 2,10;--检索从第3行开始,累加10条记录,共显示id为3....12
select* from table LIMIT 6,10;--检索从第7行开始,累加10条记录,共显示id为7,8...16
select* from table LIMIT 10,5;--检索从第10行开始,累加5条数据,共显示id为11,12...15
select* from table LIMIT 10,-1; //查询所有记录,这种方法MySQL中已经不支持了
注意:返回所有记录就不用limit了,limit正是用来限制返回数据条数的
客户端通过传递start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:
比如:
查询第1条到第10条的数据的sql是:select * from table limit 0,10; ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;
查询第11条到第20条的数据的sql是:select * from table limit 10,10; ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;
通过上面的分析,可以归纳得出符合需求的分页SQL伪代码,如下所示。总之,我们只需要告诉数据库要从第几行开始拿多少条数据就行了。
mysql分页:select * from 表 limit (pageNo-1)*pageSize,pageSize;
oracle分页:select a.* (select 表.*,rowum rn from 表) a where rn>(pageNo-1)*pageSize and rn <=pageNo*pageSize;
在MyBatis中LIMIT之后的语句不允许的变量不允许进行算数运算,会报错。
如: LIMIT (#{pageNo}-1)*#{pageSize},#{pageSize}; // 错误
LIMIT ${(pageNo-1)*pageSize},${pageSize}; (正确)