MySQL排序与分页
排序
默认情况下,查询返回的数据是按照添加数据的顺序来显示的
如果在ORDER BY后没有显式指定排序的方式,默认为升序
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary;
升序与降序
# 升序
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary ASC;
# 降序
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC;
可以使用列的别名,进行排序
SELECT employee_id,salary,salary*12 AS annual_asl
FROM employees
ORDER BY annual_asl;
另外,列的别名只能在ORDER BY使用,不能在WHERE中使用,下面的语句将会报错
SELECT employee_id,salary,salary*12 AS annual_asl
FROM employees
WHERE annual_sal > 200000;# WHERE不能使用别名
WHERE需要声明在FROM后,ORDER BY之前
SELECT employee_id,salary,department_id
FROM employees
WHERE department_id IN (50,60)
ORDER BY department_id DESC;
二级排序
显示员工信息,按照department_id的降序排序,salary的升序排序(department_id相同的情况下)
SELECT employee_id,salary,department_id
FROM employees
ORDER BY department_id DESC,salary ASC
分页
使用limit实现数据的分页显示
每页显示20条记录,此时显示第一页
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;
每页显示20条数据,此时显示第二页
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;
每页显示20条数据,此时显示第三页
SELECT employee_id,last_name
FROM employees
LIMIT 40,20;
每页显示pageSize条记录,此时显示第pageNo页:
公式:LIMIT(pageNo-1)*pageSize,pageSize;前者为从第几个开始(下标,0为第一个)
WHERE、ORDER BY、LIMIT声明顺序:
SELECT employee_id,last_name,salary
FROM employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 0,10;
LIMIT的结构格式:严格来说为:LIMIT位置偏移量,条目数。
结构LIMIT 0,条目数
等价于LIMIT 条目数
... LIMIT 10;
练习:表里有107条数据,我们只要显示第32、33条数据:
SELECT employee_id,last_name
FROM employees
LIMIT 31,2;
mysql8.0新特性:LIMIT...OFFSET...
SELECT employee_id,last_name
FROM employees
LIMIT 2 OFFSET 32;
OFFSET指的偏移量,相当于换个位置。
约束返回的数量可以减少数据表的网络传输量,也可以提升查询效率,如果我们知道返回结果只有1条,就可以使用LIMIT
,告诉SELECT语句只需要返回一条记录即可。这时候不需要扫描完整的表,只需要检索到一条符合条件的记录即可返回。
练习:查询员工表中工资最高的员工信息
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary
LIMIT 1;
练习:查询邮箱中包含e的员工的信息,并先按邮箱的字节数降序,再按部门序号升序,每页显示10条,从第三页(20)开始:
SELECT employee_id,last_name,email,department_id
FROM employees
WHERE email REGEXP '[e]'
ORDER BY LENGTH(email) DESC,department_id
LIMIT 10 OFFSET 20;