MySQL的排序和分页语句(十八)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL的排序和分页语句(十八)

一. MySQL的排序和分页


  • 当查询数据时,可以通过 where语句和 group by+having 语句进行筛选,得到正确的数据,然而数据是正确的,但展示的时候,可能是杂乱无章的。 就像 Excel中展示数据一样,按照字母大小写的顺序,按照成绩从高到低,进行展示一样, 我们也希望定义一个规则,让筛选出来的结果按照我们自定义的规则进行展示。 排序,需要用到 order by 关键字。 当数据量过多时,我们不希望全部展示,只希望展示其中的某一个部分,即可以进行分页展示,分页需要用到 limit 关键字。


  • 其中,排序主要分为两部分:


单字段排序

多字段排序


  • 下面,对排序和分页进行详细的讲解。


  • 仍然用的是 yuejl数据库中的 user 表。


20191210160645279.png


  • 可以看出来,是按照 id 进行从小到大的展示的。


二. 单字段排序


  • 所用命令:


select 列名1,聚集函数(列)
  from 表名
  where 条件语句
  group by 分组列名1
  having 分组后筛选
  order by 列名1 asc|desc;


  • 其中, asc 为升序排序, desc为降序排序, 默认是升序排列 asc.


  • 排列的字段,常常是 数字类型的,或者英文字符串类型的。 不建议使用中文,直接进行排序。


二.一 按照某一字段 进行升序排列 asc


  • 如 按照 年龄 age 进行升序排列:


select * from user 
  order by age asc;


20191210160656766.png


  • 会按照年龄,进行升序排列。


二.二 按照某一字段进行降序排列 desc


  • 如 按照部门编号 进行降序排列,先展示部门编号为3的,再展示部门编号为2的,最后展示部门编号为1的.


select * from user 
order by deptId desc;


20191210160703520.png


  • 会按照部门编号 deptId 进行降序排列。


二.三 省略asc 或者desc, 默认升序


  • 如,还是按照年龄进行排序, 最后省略 asc, 看其默认按照什么方式排列。


select * from user 
  order by age;


20191210160712916.png


  • 省略时,默认是按照升序进行排列的。


三. 多字段进行排序


select *|列名
from 表名
order by 列名1 asc|desc,列名2 asc|desc;


  • 其中,列名1,列名2,谁先写在前面,谁先写在后面,是有讲究的。


  • 先按照列名1进行排序, 如果列名1相同的话,再按照列名2进行排序, 以列名1,即先写的那个为主,以列名2,即后写的那个为辅。


  • 其中 如果是升序的话, asc同样可以省略。


三.一 多字段排序举例


  • 如 按照部门进行排序,如果部门编号相同,则按照年龄进行从大到小排列。


select * from user 
order by deptId,age desc;


20191210160720795.png


  • 以部门编号为主,以age为辅。


  • 如果将age desc 放置在前面呢?


select * from user 
order by age desc,deptId;


20191210160734829.png


  • 以age 为主,以deptId 为辅。


  • 很明显,两者的查询结果是不一致的。


三.二 审批状态的排序处理


  • 在业务中,排序时也通常与 if()或者case() 条件函数进行连用, 来将某些特定状态的记录放置在前面。


  • 如 将 退回状态的放置在最前面,将待审批的放置在第二,将成功的审批记录放置在最后面。


  • 如状态 status 为:


1 待审批

2 审批中

3 成功

4 退回


  • 可以 写类型 order by (if(status=4,0,status)) asc


  • 或者 order by (case status when 4 then 0 else status end) asc;


四. 分页语句 limit


  • 分页 limit 所使用的命令是:


select 列名1,聚集函数(列)
  from 表名
  where 条件语句
  group by 分组列名1
  having 分组后筛选
  order by 列名1 asc|desc
  limit [位置偏移量] 行数;


  • 其中,位置偏移量 可以省略,那么limit 就有两种写法了.


  • 第一种:


limit 行数;

  • 第二种:


limit 位置偏移量,行数


  • 下面,分别对这两种情况进行分析。


  • 按照年龄从大到小查时:


select * from user order by age desc;


20191210160753533.png


四.一 limit n 情况


  • limit 后面只跟一个参数, 表示 从1开始查询,查询 n 条记录。


  • 如按照年龄从大到小排序,查询4条记录。


select * from user 
  order by age desc 
  limit 4;


20191210160801861.png


  • 年龄从大到小,查询4条。 MySQL数据库是从1 开始的。


  • 如果 n>=最大的记录条数, 表示全部查询, 从1开始,到最后记录结束为止。


四.二 limit m,n 情况


  • limit 后面跟两个参数,表示从 m+1处开始查询,往后查询n 条记录。 即最后的结果位置为 (m+n).


  • 如果m+n> 最大的记录条数, 那么从 m+1处开始查询,到最后记录结束为止。


  • 其中 第一种情况实际上是第二种情况的一种缩写版本,为 limit 0,n.


  • 如年龄 同样从大到小排序,查询3条记录,从位置2处开始查询。


select * from user
order by age desc 
limit 2,3;


20191210160810819.png


  • 变成 0,n 时,看是否与第一种情况相同。


select * from user
order by age desc 
limit 0,4;

20191210160818255.png


  • 与第一种情况是相同的。


四.三 实际项目中的分页情况


  • 实际项目中,从前台传递过来两个值, 一个是 页数,一个是每页所显示的最大条数, 如10.


  • 那么


第一页便显示的是: 0,10

第二页便显示的是: 11,10

第三页便显示的是: 21,10

第n页便显示的是: (n-1)*10,10

即第 n页 显示的数据为: (n-1)*最大条数, 最大条数。


  • user中共7条数据,每页显示3条数据,可以分3页。 (前2页都是满的,最后一页只有1条数据)


  • 查询第一页的数据为:


select * from user
order by age desc 
limit 0,3;


20191210160829533.png


  • 查询第二页的数据为:


select * from user
order by age desc 
limit 3,3;


2019121016083779.png


  • 查询第三页的数据为:


select * from user
order by age desc 
limit 6,3;


20191210160842491.png


五. 单表查询总结


五.一 单表查询命令


select [distinct] 列名|*
  from 表名 表别名
  where 条件筛选语句
  group by 分组
  having 分组筛选语句
  order by 列名 asc|desc
  limit [行偏移位置],行数;


五.二 单表查询执行顺序


1.先执行 from 语句----------指定表


2.执行where 语句 ---------- 初步筛选条件


3.group by分组语句----------进行分组,可以开始使用select中的别名


4.having 语句-----------------分组后,进行分组筛选条件


5.select 语句------------------进行查询哪些列


6.distinct 语句---------------是否去重


7.order by 语句---------------进行排序


8.limit 语句------------------进行分页处理


  • 其中,除了 from 和select 是必须存在的,其余的都是非必须的。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10月前
|
SQL 缓存 关系型数据库
如何解决MySQL 的深度分页问题?
在构建高性能Web应用程序时,数据库查询性能至关重要。本文深入探讨了MySQL中`LIMIT ... OFFSET ...`语法的性能瓶颈,并介绍了一种更高效的分页方法——游标分页(Cursor Pagination)。通过记录每页最后一个记录的唯一标识,游标分页能显著提升查询效率,将时间复杂度从O(n + m)降低到O(log n + m),特别适用于大规模数据的分页查询场景。此外,文章还介绍了其他优化方法,如覆盖索引分页、分区表、缓存和基于时间戳的分页,并提供了实践中的最佳建议,帮助开发者选择最适合的分页策略,提升系统性能和用户体验。
607 9
|
3月前
|
存储 关系型数据库 MySQL
MySQL中实施排序(sorting)及分组(grouping)操作的技巧。
使用这些技巧时,需要根据实际的数据量、表的设计和服务器性能等因素来确定最合适的做法。通过反复测试和优化,可以得到最佳的查询性能。
274 0
|
6月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
9月前
|
监控 关系型数据库 MySQL
MySQL和SQLSugar百万条数据查询分页优化
在面对百万条数据的查询时,优化MySQL和SQLSugar的分页性能是非常重要的。通过合理使用索引、调整查询语句、使用缓存以及采用高效的分页策略,可以显著提高查询效率。本文介绍的技巧和方法,可以为开发人员在数据处理和查询优化中提供有效的指导,提升系统的性能和用户体验。掌握这些技巧后,您可以在处理海量数据时更加游刃有余。
841 9
|
11月前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
275 4
|
11月前
|
SQL 关系型数据库 MySQL
mysql分页读取数据重复问题
在服务端开发中,与MySQL数据库进行数据交互时,常因数据量大、网络延迟等因素需分页读取数据。文章介绍了使用`limit`和`offset`参数实现分页的方法,并针对分页过程中可能出现的数据重复问题进行了详细分析,提出了利用时间戳或确保排序规则绝对性等解决方案。
467 1
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
MySQL高级篇——排序、分组、分页优化
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
1464 1
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
本文详细解析了MySQL中`ORDER BY`的实现原理及优化方法。通过解析与优化、执行及多种优化技术,如索引利用、内存排序、外部排序等,帮助你提升排序性能。了解其背后的机制,可显著优化查询效率。
708 4

推荐镜像

更多