当前位置: 首页 > backend >正文

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。


http://www.xdnf.cn/news/15827.html

相关文章:

  • 集群与高可用
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts
  • Go并发聊天室:从零构建实战
  • Shell脚本-tee工具
  • 小程序和H5数据mock配置过程
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • SpringBoot五分钟快速入门指南
  • NW993NX584美光固态闪存NX559NX561
  • [故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型
  • 数据分析综合应用 30分钟精通计划
  • 动态规划——数位DP经典题目
  • 量子计算与AI融合的技术突破与实践路径
  • 6. 装饰器模式
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pillow’问题
  • 小架构step系列19:请求和响应
  • Java行为型模式---中介者模式
  • [故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • BeanFactory 和 FactoryBean 的区别
  • Java行为型模式---访问者模式
  • 用Dynamic chunk去干掉tokenizer?
  • 从零入门:云迁移原理详解与华为Rainbow实战指南
  • 数据结构 队列
  • 信息系统风险的安全技术防范思路
  • 教育科技内容平台的破局之路:从组织困境到 UGC 生态的构建
  • CCF编程能力等级认证GESP—C++7级—20250628
  • [FFmpeg] AVFormatContext、AVInputFormat、AVOutputFormat | libavformat
  • 为任意Java程序配置Socks5与HTTP代理的方法
  • 2025年水安备考:水利水电安全员C类考试题