MySQL里分页一般用LIMIT来实现:
select* from article LIMIT 1,3
select * from article LIMIT 3 OFFSET 1
上面两种写法都表示取第2,3,4三条数据。
LIMIT用法:
①如果后接一个参数,如
select* from article LIMIT 10
表示取前10个数据。
②如果后接两个参数,如LIMIT 1,3 。表示从第2位的数据开始取,取3个数。(注意MySQL的第一个数对应序号为0)。也可理解为:第一个数表示要跳过的数量,后一位表示要取的数量,例如:
select* from article LIMIT 1,3
就是跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据。
OFFSET用法:
③当limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的数量,offset表示要跳过的数量。例如:
select * from article LIMIT 3 OFFSET 1
表示跳过1条数据,从第2条数据开始取,取3条数据,也就是取2,3,4三条数据。
Leetcode原题:第二高的薪水
1、编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)
+----+-------+
| Id | Salary |
+----+-------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+-------+
比如上述 Employee 表,SQL查询应该返回‘200’作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null。
这里可以立即用LIMIT 和OFFSET结合的方法:
法一:
SELECT DISTINCT salary as SecondHigh FROM Employee
ORDER BY salary
LIMIT 1
OFFSET 1
表示从第二位开始取,只取一个数,简单明了。
当然,我们甚至连ORDER BY 和OFFSET都可以不用:
SELECT Max(Salary) SecondHigh FROM Employee
WHERE (SELECT Max(Salary) from Employee) > Salary
原理是:要求第二高工资,只需要先排除最高的工资,再找剩下的工资里面的最大值MAX即可。
当然,在数据量巨大的情况下,使用LIMIT OFFSET存在效率不高的问题,这涉及到MySQL语句的优化了,暂不讨论。