MySQL中的排序和分页


精选专栏链接 🔗


欢迎订阅,点赞+关注,每日精进1%,与百万开发者共攀技术珠峰

更多内容持续更新中!希望能给大家带来帮助~ 😀😀😀

【MySQL基础篇】MySQL中的排序、分页和多表查询


1,MySQL排序操作

MySQL中对数据的排序操作使用 ORDER BY 子句。此外:

  • ORDER BY 子句放在SELECT语句的结尾;
  • 升序排列使用ASC关键字(ascend单词的缩写);
  • 降序排列使用 DESC关键字(descend单词的缩写);
  • 如果ORDER BY后没有显式指明排序方式的话,则默认按照升序排列;
  • 可以使用不在SELECT列表中的列排序;

具体案例: 按照salary从高到低顺序显示员工信息

SQL语句如下:

sql 复制代码
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC;

查询结果如下:

具体案例: 按照salary从低到高顺序显示员工信息

使用如下两段SQL语句均可实现:

sql 复制代码
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary ASC;
sql 复制代码
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary;  # 没有显式指明排序方式的话,则默认按照`升序`排列

运行结果如下:


2,排序相关细节知识

2.1,默认排序方式

当我们多次执行如下SQL语句时:

sql 复制代码
SELECT * FROM employees;

运行结果如下:

根据多次运行的结果我们可以发现:尽管我们没有指定排序的方式,每次执行查询出来的结果集依然是按照同样的顺序排列的。

这是因为:MySQL中,当我们不指定排序方式时,默认情况下查询返回的数据是按照当初添加数据的顺序显示的。


2.2,可使用列的别名进行排序

我们可以使用列的别名进行排序。比如:

案例: 根据员工的月工资计算员工的年工资并返回(假设年工资=月工资×12)

SQL语句如下(annual_salary为列的别名):

sql 复制代码
SELECT employee_id,salary,salary * 12 annual_salary
FROM employees
ORDER BY annual_salary;

运行结果如下:


2.3,不可使用列的别名进行过滤

需要注意的是:列的别名只能在ORDER_BY中使用,不能在WHERE中使用。执行如下SQL语句会报错:

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语句如下:

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语句如下:

sql 复制代码
SELECT employee_id,last_name
FROM employees
LIMIT 0,20;

运行结果如下:

需求2:每页显示员工表中的20条记录,此时显示第二页。

SQL语句如下:

sql 复制代码
SELECT employee_id,last_name
FROM employees
LIMIT 20,20;

运行结果如下:

需求3:每页显示员工表中的20条记录,此时显示第三页。

sql 复制代码
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语句如下:

sql 复制代码
SELECT employee_id,last_name
FROM employees
LIMIT 31,2;

运行结果如下:

或者可以使用MySQL8.0中提供的新关键字OFFSET(OFFSET后跟偏移量,LIMIT后跟要显示的记录数),SQL语句如下:

sql 复制代码
SELECT employee_id,last_name
FROM employees
LIMIT 2 OFFSET 31;

运行结果如下:

需求2:查询员工表中工资最高的员工信息

SQL语句如下:(按照薪资降序排列后取第一条数据即为薪资最高的员工信息)

sql 复制代码
SELECT employee_id,last_name,salary
FROM employees
ORDER BY salary DESC
LIMIT 0,1;

运行结果如下图所示:


4,SQL语句声明顺序

SQL语句要遵从一定的声明顺序,接下来从一个具体案例开始引入。

需求:从员工表中查询薪资大于6000的员工信息,并按薪资降序排列,取第一页数据,一页显示十条;

SQL语句如下:

sql 复制代码
SELECT employee_id,last_name, salary
FROM employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 0,10;

声明顺序为:先WHERE,再ORDER BY... 再LIMIT。


相关推荐
转转技术团队3 分钟前
游戏账号大图生成
java·后端
安卓开发者9 分钟前
OkHttp 与 Chuck 结合使用:优雅的 Android 网络请求调试方案
android·okhttp
云边散步18 分钟前
第6篇:《JOIN 是红娘,帮你配对多张表!》
mysql
青云交19 分钟前
Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用(355)
java·大数据·机器学习·lstm·金融市场·波动预测·资产配置
徐子童28 分钟前
初识Redis---Redis的特性介绍
java·数据库·redis
Dubhehug40 分钟前
6.String、StringBuffer、StringBuilder区别及使用场景
java·面试题·stringbuilder·string·stringbuffer
inrgihc1 小时前
基于MySQL实现分布式调度系统的选举算法
数据库·mysql·算法
枣伊吕波1 小时前
第十八节:第七部分:java高级:注解的应用场景:模拟junit框架
java·数据库·junit
KaiwuDB1 小时前
Ubuntu 22.04系统KWDB数据库安装部署使用教程_案例传感器
数据库
安卓开发者1 小时前
Android Navigation 组件:简化应用导航的利器
android