LIMIT实现分页操作
所谓的分页就是将数据库中的结果集一段一段的显示出来(这里的一段就是指的一页)
我们通过如下几个例题来理解使用LIMIT实现分页操作是如何实现的
eg1: 每页中显示20条记录,此时显示第一页(从员工表(employees)中查询)
SELECT *
FROM employees
LIMIT 0,20;
- 这里我们的偏移量是0,就表示从第一条记录开始,然后条目数为20,也就是我们这一次想要查询二十条,这里表示的就是从第一页开始查询,然后查询二十条记录(包括第一条记录),这个时候我们认为一页就是二十条记录,那么就是表示我们现在查询的第一页
- 注意,这个时候说我们查询的是第几页其实指的是按照我们给定的偏移量和条目数的话,这个时候抽象出我们在第几页
小结: 这里我们可以总结出LIMIT关键字使用时的格式如下:
LIMIT 位置偏移量,条目数
- 这里的位置偏移量有一点类似于数组的索引
- 这里的条目数也就是记录数,就是你想要查询多少条记录,也就是一页要多少条记录
eg2:每页显示二十条记录,此时显示第二页(显示第二页,也就是显示第21~40条记录)
SELECT *
FROM employees
LIMIT 20,20;
- 这个时候的偏移量是20,条目数也是20,我们知道我们的偏移量有一点类似于数组中的索引,这个时候我们偏移量是20,那么就是代表的从第21条记录开始,然后条目数为20,那么就代表我们这个时候一共要求查询出20条记录,那么这个时候就是从21条记录到第40条记录,这个时候我们刚刚就可以认为这个时候就是每页显示20条记录,然后此时显示的是第二页
这里有一个公式,我们利用这个公式可以快速通过给出一页多少条记录和此时显示第几页计算出我们的LIMIT结构中的偏移量和条目数,公式如下:
LIMIT (y-1)*x,x
- 这个公式中的x是每页显示的记录数,y是显示的页码
这里我们通过一个例子来学习SELECT查询语句中各个子句的声明顺序
SELECT *
FROM employees
WHERE salary>6000
ORDER BY salary DESC
LIMIT 0,10;
- 我们可以发现各个子句声明顺序是(从前到后): SELECT , FROM , WHERE , ORDER BY , LIMIT
eg4:每一页显示10条记录,显示第一页
SELECT *
FROM employees
LIMIT 10;
- 这个时候我们会发现LIMIT之后只有一个数据,那么究竟是怎么回事?
- 其实我们的LIMIT 0,10 就相当于LIMIT 10
也就是我们的偏移量为0的时候,这个时候我们可以省略偏移量,只要提供条目数就可以
eg5:员工表中有107条数据,我们只想要显示第32条和第33条数据
SELECT *
FROM employees
LIMIT 31,2;
- 这个时候我们的偏移量为31,也就是从第32条记录开始显示,然后条目数为2,也就是显示两条,那么就是显示第31条和第32条
其实我们这里显示员工表中的第32条和33条数据不单单只有上面这一种解决方式,我们的MySQL8.0中提出了一种新特性,我们利用这种新特性也可以解决这个问题:
- 我们的MySQL8.0中提出了一种新的LIMIT结构:
LIMIT 条目数 OFFSET 偏移量
- 没错,我们的MySQL8.0中提出的新特性就是通过OFFSET关键字将我们的偏移量和我们的条目数置换了一个位置,使用了OFFSET之后我们的条目数在前面了,然后我们的偏移量在后面
给出解决eg5的程序:
SELECT *
FROM employees
LIMIT 2 OFFSET 31;
- 这里我们使用了OFFSET关键字之后我们的偏移量就在后面,那么偏移量就还是31就行,就是表示从第32个记录开始显示,然后我们的条目数就在前面,条目数这里就还是2,就表示一共显示两条记录,也就是显示第32条和第33条记录
eg6:查询员工表中工资最高的员工的信息
SELECT *
FROM employees
/*
这里我们必须要先对我们的员工表中的员工进行排序,这个时候由于我们想要查询工资最高的员工,所以我们这里应该是通过工资(salary字段)进行降序排列,然后再通过LIMIT分页操作实现只显示第一个,也就是工资最高的员工的信息
*/
ORDER BY salary DESC
#这里我们就使用了LIMIT的简化格式,也就是当我们的偏移量为0的时候就是只需要提供条目数就可以了
LIMIT 1;
- 或者我们这里的LIMIT 1 也可以使用LIMIT 0,1代替,都是等价的
- 这我们的排序方式是DESC(降序排序),因为我们降序排序之后我们拿出排序之后的第一条记录就是工资最高的员工的信息
补充:
LIMIT关键字可以使用在MySQL, PGSQL, MariaDB等中表示分页,不能使用在SQL Server 和 DB2等中