每页显示20条记录,此时显示第2页:
第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,每页显示20条,第二页第一条为第21条,所以要显示第二页偏移量为 (21-1)=20。
SELECT employee_id, last_name FROM employees LIMIT 20, 20;
每页显示20条记录,此时显示第3页:
第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,每页显示20条,第三页第一条为第41条,所以要显示第三页偏移量为 (41-1)=40。
SELECT employee_id, last_name FROM employees LIMIT 40, 20;
3.1 每页显示pageSize条记录,此时显示第pageNo页:
由上面的例子:
第一页偏移量:( 1 - 1 ) * 20
第二页偏移量:( 2 - 1 ) * 20
第三页偏移量:( 3 - 1 ) * 20
可以得出,每页显示pageSize条记录,此时显示第pageNo页的偏移量计算公式为: ( pageNo - 1 ) * pageSize
3.2 WHERE … ORDER BY …LIMIT 声明顺序如下:
SELECT employee_id,last_name,salary FROM employees WHERE salary > 6000 ORDER BY salary DESC LIMIT 0,10;
注意:LIMIT 子句必须放在整个SELECT语句的最后!
表里有107条数据,我们只想要显示第 32、33 条数据:
# 表里有107条数据,我们只想要显示第 32、33 条数据 SELECT employee_id, last_name FROM employees # 偏移量为 要显示的第一条数据的行数减一 LIMIT 31, 2;
3.3 MySQL8.0新特性:LIMIT … OFFSET …
例如,“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。
LIMIT … OFFSET … :
从查询出来的结果集拿去 N 条数据 ( LIMIT … ) ,偏移 M 个位置 ( OFFSET … )
表里有107条数据,我们只想要显示第 32、33 条数据:
# 表里有107条数据,我们只想要显示第 32、33 条数据 SELECT employee_id, last_name FROM employees # 获取 32 33 条数据 => 获取两条数据 # 从 32 条开始 => 偏移量为 (32-1) LIMIT 2 OFFSET 31;
查询员工表中工资最高的员工信息:
# 查询员工表中工资最高的员工信息 SELECT employee_id, last_name, salary FROM employees # 查询工资最高,倒序排序,选出第一个 ORDER BY salary DESC LIMIT 1 OFFSET 0; # 或 SELECT employee_id, last_name, salary FROM employees ORDER BY salary DESC LIMIT 0, 1;
3.4 拓展
LIMIT 可以使用在MySQL、PGSQL、MariaDB、SQLite 等数据库中使用,表示分页,需要放到 SELECT 语句的最后面。
不能使用在SQL Server、DB2、Oracle!
4 排序与分页练习
题目:
# 1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示 # 2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据 # 3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
解答:
- #1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
#1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示 SELECT last_name, department_id, (salary*12) AS annual_sal FROM employees ORDER BY annual_sal DESC, last_name ASC;
- #2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
#2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据 SELECT last_name, salary FROM employees WHERE salary>17000 OR salary<8000 ORDER BY salary DESC LIMIT 20,20; # 或 SELECT last_name, salary FROM employees WHERE salary NOT BETWEEN 8000 AND 17000 ORDER BY salary DESC LIMIT 20,20;
- #3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
#3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序 SELECT last_name, email, department_id FROM employees WHERE email LIKE '%e%' # 字节数 邮箱的长度 # length() 求长度 ORDER BY length(email) DESC, department_id ASC; # 或 SELECT last_name, email, department_id FROM employees WHERE email REGEXP '[e]' ORDER BY length(email) DESC, department_id ASC