MySQL之order by使用

Posted 李子捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之order by使用相关的知识,希望对你有一定的参考价值。

  • 备战2022春招或暑期实习,本专栏会持续输出mysql系列文章,祝大家每天进步亿点点!文末私信作者,我们一起去大厂
  • 本篇总结的是 《order by使用》,后续会每日更新~
  • 关于《Redis入门到精通》、《并发编程》、《Java全面入门》、《鸿蒙开发》等知识点可以参考我的往期博客
  • 相信自己,越活越坚强活着就该逢山开路,遇水架桥!生活,你给我压力,我还你奇迹!

目录

1、简介

2、正文

2.1 单个列排序

2.2 多个列排序

2.3 排序的方式

2.4 order by结合limit


1、简介

在使用select语句时可以结合order by对查询的数据进行排序。如果不使用order by默认情况下MySQL返回的数据集,与它在底层表中的顺序相同,可能与你添加数据到表中的顺序一致,也可能不一致(在你对表进行修改、删除等操作时MySQL会对内存进行整理,此时数据的顺序会发生改变)因此如果我们希望得到的数据是有顺序的,就应该明确排序方式。

2、正文

首先准备一张User表,DDL和表数据如下所示,可以直接复制使用。

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  `age` int(11) NOT NULL COMMENT '年龄',
  `sex` smallint(6) NOT NULL COMMENT '性别',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '李子捌', 18, 1);
INSERT INTO `user` VALUES (2, '张三', 22, 1);
INSERT INTO `user` VALUES (3, '李四', 38, 1);
INSERT INTO `user` VALUES (4, '王五', 25, 1);
INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
INSERT INTO `user` VALUES (6, '田七', 37, 1);
INSERT INTO `user` VALUES (7, '谢礼', 18, 1);

SET FOREIGN_KEY_CHECKS = 1;

数据的初始顺序如下所示:

mysql> select * from user;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  3 | 李四   |  38 |   1 |
|  4 | 王五   |  25 |   1 |
|  5 | 六麻子 |  13 |   0 |
|  6 | 田七   |  37 |   1 |
|  7 | 谢礼   |  18 |   1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)

2.1 单个列排序

我们首先来看使用order by对单个列进行排序。

需求:
根据用户年龄进行升序排序。

语句:

select * from user order by age;

结果:

mysql> select * from user order by age;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  5 | 六麻子 |  13 |   0 |
|  1 | 李子捌 |  18 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  4 | 王五   |  25 |   1 |
|  6 | 田七   |  37 |   1 |
|  3 | 李四   |  38 |   1 |
+----+--------+-----+-----+
7 rows in set (0.00 sec)

分析:
可以看到user表输出顺序按照age升序排序输出,因此可以猜测MySQL默认的排序方式是升序。此外我这里使用*通配符查询所有列,并未明确指明查询age列;其实MySQL的order by后跟的列不一定要查询出来,比如 select name from user order by age;这样也是一样的效果。

2.2 多个列排序

order by不仅可以对单个列进行排序,它也可以对多个列进行排序,只需要把需要排序的列依次跟在order by之后就可以了。
在测试之前,我们先往表中添加一条年龄相等的数据

mysql> insert into user (name, age, sex) values ('李子柒', 18, 1);
Query OK, 1 row affected (0.01 sec)

需求:
根据用户年龄升序排序之后再更加用户名称排序。

语句:

select * from user order by age, name;

结果:

mysql> select * from user order by age, name;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  5 | 六麻子 |  13 |   0 |
|  1 | 李子捌 |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  2 | 张三   |  22 |   1 |
|  4 | 王五   |  25 |   1 |
|  6 | 田七   |  37 |   1 |
|  3 | 李四   |  38 |   1 |
+----+--------+-----+-----+
8 rows in set (0.00 sec)

分析:
order by可以作用于多个列,MySQL会完全根据order by后列的顺序进行排序。不过MySQL对于中文的排序需要考虑数据库字符集编码的问题,如果不是很懂建议不要对中文进行排序,因为大多数情况我们需要得到的是拼音的排序结果,但是往往不尽人意哦!此外这里我们在age和name后都是没有跟排序方式的,所以默认都是升序,先根据age升序排序之后再根据name升序排序。如果需要使用降序,则需要指明DESC,比如 select id, name, age from user order by age, name desc;。

2.3 排序的方式

order by有两种排序方式,它们分别是:

  1. ASC -> 升序排序(默认排序方式)
  2. DESC -> 降序排序

注意:在上面说了order by对多个列进行排序,排序方式只会作用于一个列,比如你需要对user表中的数据同时按照age和name进行降序,就应该两个列都指明降序

mysql> select * from user order by age desc, name desc;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  3 | 李四   |  38 |   1 |
|  6 | 田七   |  37 |   1 |
|  4 | 王五   |  25 |   1 |
|  2 | 张三   |  22 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
|  1 | 李子捌 |  18 |   1 |
|  5 | 六麻子 |  13 |   0 |
+----+--------+-----+-----+
8 rows in set (0.00 sec)

如果你只指定age列降序排序,name列不指定,那么MySQL会根据age降序排序后,再根据name列进行默认升序排序。

mysql> select * from user order by age desc, name;
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  3 | 李四   |  38 |   1 |
|  6 | 田七   |  37 |   1 |
|  4 | 王五   |  25 |   1 |
|  2 | 张三   |  22 |   1 |
|  1 | 李子捌 |  18 |   1 |
|  8 | 李子柒 |  18 |   1 |
|  7 | 谢礼   |  18 |   1 |
|  5 | 六麻子 |  13 |   0 |
+----+--------+-----+-----+
8 rows in set (0.00 sec)

可以看到李子捌、李子柒、谢礼三行数据排序方式发生了改变。

2.4 order by结合limit

order by结合limit可以获取排序后的数据行记录数量。比如我们从user表中获取年龄最大的一个用户。可以看到李四同志38岁了,比较老了,属于年龄最大的人之一。

mysql> select * from user order by age desc limit 1;
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
|  3 | 李四 |  38 |   1 |
+----+------+-----+-----+
1 row in set (0.00 sec)

limit需要跟在order by之后,如果位置不对,MySQL会抛出异常信息。

mysql> select * from user limit 1 order by age des;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by age des' at line 1

以上是关于MySQL之order by使用的主要内容,如果未能解决你的问题,请参考以下文章

Mysql多字段order by用法

mysql:优化查询 w/混合升序 ORDER BY

sql里的排序倒序的命令是order by啥

SQL 基础之order by 排序和代替变量

mysql5.7基础 select...order by...asc 按照一个字段进行升序排序

21《MySQL 教程》ORDER BY 排序