我只想卷死各位,或者被各位卷死,在此特别感谢康师傅的MySQL教程

排序数据

排序规则

  • 使用 ORDER BY 子句排序
    • ASC(ascend):升序
    • DESC(descend):降序
  • ORDER BY 子句在SELECT语句的结尾。

单列排序

如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的。

1
2
3
4
5
6
7
8
9
-- 练习:按照salary从高到低的顺序显示员工信息
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary DESC;

-- 练习:按照salary从低到高的顺序显示员工的信息
SELECT last_name,salary,department_id
FROM employees
ORDER BY salary ASC;

我们也可以使用列的别名进行排序,根据salary计算出年薪,随后根据年薪排序

1
2
3
SELECT last_name,salary,salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary ASC;

补充:列的别名只能在ORDER BY 中使用,不能在WHERE中使用,因为WHERE的执行顺序先于别名,故在WHERE使用时会报错

SQL执行顺序
先从FROM开始走,挑出来是哪个表
然后看看WHERE有哪些过滤条件,筛选完之后,得到一批数据(包括所有字段)
再看看SELECT想查什么(只选择SELECT需要的字段),再加上别名
之后再ORDER BY进行排序

如下代码会报错

1
2
3
SELECT employee_id,salary,salary * 12  annual_sal
FROM employees
WHERE annual_sal > 12000;

强调格式:WHERE需要声明在FROM后,ORDER BY之前。

1
2
3
4
SELECT last_name,salary,department_id
FROM employees
WHERE department_id IN (10,20,30)
ORDER BY department_id DESC;

多列排序

  • 可以使用不在SELECT列表中的列排序。
  • 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
1
2
3
4
-- 显示员工信息,按照department_id的降序排序,salary的升序排序
SELECT last_name,salary,department_id
FROM employees
ORDER BY department_id DESC,salary ASC;

分页

背景

  1. 查询返回的记录太多了,查看起来很不方便,怎么样能够实现分页查询呢?
  2. 表里有 4 条数据,我们只想要显示第 2、3 条数据怎么办呢?

实现规则

  • 分页原理:所谓分页显示,就是将数据库中的结果集,一段一段显示出来需要的条件。
  • MySQL中使用LIMIT实现分页
  • 格式:LIMIT 位置偏移量, 行数

第一个“位置偏移量”参数指示MySQL从哪一行开始显示,是一个可选参数,如果不指定“位置偏移量”,将会从表中的第一条记录开始(第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,以此类推);第二个参数“行数”指示返回的记录条数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-- 需求1:每页显示20条记录,此时显示第1页
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;

-- 需求2:每页显示20条记录,此时显示第2页
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;

-- 需求3:每页显示20条记录,此时显示第3页
SELECT employee_id,last_name
FROM employees
LIMIT 40,20;

-- 每页显示pageSize条记录,此时显示第pageNo页,公式:LIMIT (pageNo - 1) * pageSize,pageSize;

-- WHERE...ORDER BY... LIMIT 声明顺序如下:
SELECT last_name,salary,department_id
FROM employees
WHERE salary > 8000
ORDER BY salary ASC
LIMIT 0,20

-- 练习1:表里有 107 条数据,我们只想要显示第 32、33 条数据怎么办呢?
SELECT employee_id,last_name,salary,department_id
FROM employees
LIMIT 31,2;

-- MySQL8.0新特性:LIMIT 条目数 OFFSET 位置偏移量
-- 练习2:表里有 107 条数据,我们只想要显示第 32、33 条数据怎么办呢?
SELECT employee_id,last_name,salary,department_id
FROM employees
LIMIT 2 OFFSET 31;

-- 练习:查询员工表中工资最高的员工信息
SELECT employee_id,last_name,salary,department_id
FROM employees
ORDER BY salary DESC
LIMIT 1;

课后练习

  1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
1
2
3
SELECT last_name,department_id,salary * 12 AS annual_salary
FROM employees
ORDER BY annual_salary DESC;
  1. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
1
2
3
4
5
SELECT last_name,salary
FROM employees
WHERE salary < 8000 || salary > 17000
ORDER BY salary DESC
LIMIT 20,20;
  1. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
1
2
3
4
SELECT *
FROM employees
WHERE email LIKE '%e%'
ORDER BY LENGTH(email) DESC,department_id ASC;