MySQL中的排序和分页
精选专栏链接 🔗
- MySQL技术笔记专栏
- Redis技术笔记专栏
- 大模型搭建专栏
- Python学习笔记专栏
- 深度学习算法专栏
欢迎订阅,点赞+关注,每日精进1%,与百万开发者共攀技术珠峰
更多内容持续更新中!希望能给大家带来帮助~ 😀😀😀
【MySQL基础篇】MySQL中的排序、分页和多表查询
- 1,MySQL排序操作
- 2,排序相关细节知识
- 2.1,默认排序方式
- 2.2,可使用列的别名进行排序
- 2.3,不可使用列的别名进行过滤
- 2.4,多列排序
- 3,MySQL分页操作
- 3.1,为什么要分页
- 3.2,分页案例
- 3.3,分页公式总结
- 3.4,分页练习
- 4,SQL语句声明顺序
1,MySQL排序操作
MySQL中对数据的排序操作使用 ORDER BY 子句。此外:
- ORDER BY 子句放在SELECT语句的结尾;
- 升序排列使用ASC关键字(ascend单词的缩写);
- 降序排列使用 DESC关键字(descend单词的缩写);
- 如果ORDER BY后没有显式指明排序方式的话,则默认按照
升序
排列; - 可以使用不在SELECT列表中的列排序;
具体案例: 按照salary从高到低顺序显示员工信息
SQL语句如下:
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC;
查询结果如下:
具体案例: 按照salary从低到高顺序显示员工信息
使用如下两段SQL语句均可实现:
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary ASC;
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary; # 没有显式指明排序方式的话,则默认按照`升序`排列
运行结果如下:
2,排序相关细节知识
2.1,默认排序方式
当我们多次执行如下SQL语句时:
SELECT * FROM employees;
运行结果如下:
根据多次运行的结果我们可以发现:
尽管我们没有指定排序的方式,每次执行查询出来的结果集依然是按照同样的顺序排列的。
这是因为:MySQL中,当我们不指定排序方式时,默认情况下查询返回的数据是按照当初添加数据的顺序显示的。
2.2,可使用列的别名进行排序
我们可以使用列的别名进行排序。比如:
案例: 根据员工的月工资计算员工的年工资并返回(假设年工资=月工资×12)
SQL语句如下(annual_salary为列的别名):
SELECT employee_id,salary,salary * 12 annual_salary
FROM employees
ORDER BY annual_salary;
运行结果如下:
2.3,不可使用列的别名进行过滤
需要注意的是:列的别名只能在ORDER_BY中使用,不能在WHERE中使用。
执行如下SQL语句会报错:
SELECT employee_id,salary,salary * 12 annual_salary
FROM employees
WHERE annual_salary > 80000
报错如下:
原因是,SQL语句并非顺序执行,而是:先从FROM 语句开始执行,再到WHERE语句查看过滤条件,得到初步的结果集合,然后再根据SELECT子句后的字段再次进行过滤或者给列起别名,最后再执行ORDER BY子句。
因此当执行到WHERE子句时,还没有识别到列的别名,因此会报错。
2.4,多列排序
实际开发场景可能更加复杂,不单单是根据一个字段进行排序。比如当我们购物的时候如果按照价格从低到高排列,那么同样价格的商品他们之间的顺序如何指定呢?这就涉及到了多列排序的问题。
案例: 显示员工信息,按照department_id降序排列,salary升序排列。
SQL语句如下:
SELECT employee_id,salary,department_id
FROM employees
ORDER BY department_id DESC,salary ASC;
运行结果如下:
多列排序注意点:
- 在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第一列数据中所有值都是唯一的,将不再对第二列进行排序。
3,MySQL分页操作
下图即为一个常见的网页的分页器,当用户点击相应的页码时,就会查询到相应分好页的数据并显示。
3.1,为什么要分页
上节我们解决了排序(即数据排列)的问题,但是如果一次性返回的数据过多,查看起来会很不方便。因为用户一次只能看到一部分数据,返回数据过多不仅用户看不全,而且还会造成效率低下,所以可对数据进行分页以提高查询的性能和效率。
- MySQL中使用LIMIT关键字实现数据的分页显示;
- 分页的语法格式为:
LIMIT 偏移量, 要显示的记录数
; - 比如:LIMIT 0, 20。其中偏移量为0,表示从第一条记录开始显示;要显示的记录数为20,则表示要从偏移量0处开始显示20条记录;
- 偏移量为0的情况下,可以省略偏移量参数。比如:LIMIT 0, 20可以写成LIMIT 20;
3.2,分页案例
接下来举例讲解分页操作:
需求1:每页显示员工表中的20条记录,此时显示第一页。
SQL语句如下:
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;
运行结果如下:
需求2:每页显示员工表中的20条记录,此时显示第二页。
SQL语句如下:
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;
运行结果如下:
需求3:每页显示员工表中的20条记录,此时显示第三页。
SELECT employee_id,last_name
FROM employees
LIMIT 40,20;
运行结果如下:
3.3,分页公式总结
上述三个案例中存在一些规律。当我提出如下的新需求:
新需求:每页显示员工表中的pageSize条记录,此时显示第pageNo页。
- 此时偏移量为:(pageNo-1)*pageSize;
- 此时要显示的记录数为pageSize;
- 因此LIMIT语句为:LIMIT (pageNo-1)*pageSize, pageSize;
回到最初的分页器功能,当我们设置了每页固定显示多少条数据,并点击对应的页码时。就会实现自动传入pageNo参数和pageSize参数,然后执行SQL语句查询数据并显示给用户。
3.4,分页练习
需求1:员工表中有107条数据,我们只想要显示第32,33条数据;
SQL语句如下:
SELECT employee_id,last_name
FROM employees
LIMIT 31,2;
运行结果如下:
或者可以使用MySQL8.0中提供的新关键字OFFSET
(OFFSET后跟偏移量,LIMIT后跟要显示的记录数),SQL语句如下:
SELECT employee_id,last_name
FROM employees
LIMIT 2 OFFSET 31;
运行结果如下:
需求2:查询员工表中工资最高的员工信息
SQL语句如下:(按照薪资降序排列后取第一条数据即为薪资最高的员工信息)
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC
LIMIT 0,1;
运行结果如下图所示:
4,SQL语句声明顺序
SQL语句要遵从一定的声明顺序,接下来从一个具体案例开始引入。
需求:从员工表中查询薪资大于6000的员工信息,并按薪资降序排列,取第一页数据,一页显示十条;
SQL语句如下:
SELECT employee_id,last_name, salary
FROM employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 0,10;
声明顺序为:先WHERE,再ORDER BY... 再LIMIT。