首页 > 数据库 >MySQL的排序和分页语句(十八)

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

时间:2022-11-10 15:36:50浏览次数:30  
标签:语句 列名 limit MySQL 排序 order select desc


我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。

上一章简单介绍了 MySQL的分组和分组后筛选语句(十七),如果没有看过,​​请观看上一章​​

一. MySQL的排序和分页

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

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

  • 单字段排序
  • 多字段排序

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

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

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

可以看出来,是按照 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;

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

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

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

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

select * from user 
order by deptId desc;

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

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

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

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

select * from user 
order by age;

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

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

三. 多字段进行排序

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;

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

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

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

select * from user 
order by age desc,deptId;

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

以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;

MySQL的排序和分页语句(十八)_数据_07

四.一 limit n 情况

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

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

select * from user 
order by age desc
limit 4;

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

年龄从大到小,查询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;

MySQL的排序和分页语句(十八)_MySQL的命令执行顺序_09

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

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

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

与第一种情况是相同的。

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

实际项目中,从前台传递过来两个值, 一个是 页数,一个是每页所显示的最大条数, 如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;

MySQL的排序和分页语句(十八)_MySQL的命令执行顺序_11

查询第二页的数据为:

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

MySQL的排序和分页语句(十八)_数据_12

查询第三页的数据为:

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

MySQL的排序和分页语句(十八)_数据_13

五. 单表查询总结

五.一 单表查询命令

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 是必须存在的,其余的都是非必须的。

谢谢!!!


标签:语句,列名,limit,MySQL,排序,order,select,desc
From: https://blog.51cto.com/u_13420484/5841771

相关文章

  • MySQL的分组和分组后筛选语句(十七)
    我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。上一章简单介绍了MySQL的查询where语句(十六),如果没有看过,​​请观看上一章​​一.MySQL的分组语句MySQL中......
  • MySql数据库触发器DML(数据库操作)
    1.数据库触发器的作用是什么?触发器主要用于强制复杂的业务规则和要求,还有助于强制引用的完整性,便于在添加,更新或删除表中的行时保留表之间已定义的关系。 2.新建两张......
  • MySQL的子查询(二十)
    勿以恶小而为之,勿以善小而不为--------------------------刘备上一章简单介绍了MySQL的多表连接查询(十九),如果没有看过,​​请观看上一章​​一.MySQL的子查询一.一子......
  • MySQL合并查询结果(二十一)
    勿以恶小而为之,勿以善小而不为--------------------------刘备上一章简单介绍了MySQL的子查询(二十),如果没有看过,​​请观看上一章​​一.合并查询结果多条sql查询语句......
  • MySQL的索引(二十三)
    勿以恶小而为之,勿以善小而不为--------------------------刘备上一章简单介绍了MySQL的视图(二十二),如果没有看过,​​请观看上一章​​一.索引一.一索引的产生前面已经......
  • MySQL的视图(二十二)
    勿以恶小而为之,勿以善小而不为--------------------------刘备上一章简单介绍了MySQL合并查询结果(二十一),如果没有看过,​​请观看上一章​​一.视图一.一视图的出现......
  • Mongodb数据库和MySQL的比较
    谈谈Mongodb和MySQL的区别什么是Mongodb数据库Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),非关系型数据库(nosql),属于文档型数据库。文档是mongoDB......
  • 一个 MySQL 隐式转换的坑,差点把服务器整崩溃了
    我是风筝,公众号「古时的风筝」,专注于Java技术及周边生态。文章会收录在​​JavaNewBee​​中,更有Java后端知识图谱,从小白到大牛要走的路都在里面。本来是一个平静而......
  • 为什么说MySQL单表行数不要超过2000w?
    作为在后端圈开车的多年老司机,是不是经常听到过,“mysql单表最好不要超过2000w”,“单表超过2000w就要考虑数据迁移了”,“你这个表数据都马上要到2000w了,难怪查询速度......
  • 解决golang报错:imports github.com/go-sql-driver/mysql from implicitly required mo
    这句话的意思是,从隐式的引入模块导入的比如我使用某个第三方包,这个第三方包里面包含了mysql包我在代码里直接使用了这个mysql包,但是在go.mod里没有引入,代码里ide是不会报......