经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL中order by的使用详情
来源:jb51  时间:2021/11/16 11:12:12  对本文有异议

1、简介

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

2、正文

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

  1. SET NAMES utf8mb4;
  2. SET FOREIGN_KEY_CHECKS = 0;
  3.  
  4. -- ----------------------------
  5. -- Table structure for user
  6. -- ----------------------------
  7. DROP TABLE IF EXISTS `user`;
  8. CREATE TABLE `user` (
  9. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  10. `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  11. `age` int(11) NOT NULL COMMENT '年龄',
  12. `sex` smallint(6) NOT NULL COMMENT '性别',
  13. PRIMARY KEY (`id`) USING BTREE
  14. ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  15.  
  16. -- ----------------------------
  17. -- Records of user
  18. -- ----------------------------
  19. INSERT INTO `user` VALUES (1, '李子捌', 18, 1);
  20. INSERT INTO `user` VALUES (2, '张三', 22, 1);
  21. INSERT INTO `user` VALUES (3, '李四', 38, 1);
  22. INSERT INTO `user` VALUES (4, '王五', 25, 1);
  23. INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
  24. INSERT INTO `user` VALUES (6, '田七', 37, 1);
  25. INSERT INTO `user` VALUES (7, '谢礼', 18, 1);
  26.  
  27. SET FOREIGN_KEY_CHECKS = 1;
  28.  

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

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

2.1 单个列排序

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

需求:

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

语句:

  1. select * from user order by age;
  2.  

结果:

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

分析:

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

2.2 多个列排序

order by不仅可以对单个列进行排序,它也可以对多个列进行排序,只需要把需要排序的列依次跟在order by之后就可以了。

在测试之前,我们先往表中添加一条年龄相等的数据

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

需求:

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

语句:

  1. select * from user order by age, name;
  2.  

结果:

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

分析:

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有两种排序方式,它们分别是:

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

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

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

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

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

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

2.4 order by结合limit

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

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

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

  1. mysql> select * from user limit 1 order by age des;
  2. 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
  3.  

到此这篇关于MySQL中order by的使用详情的文章就介绍到这了,更多相关MySQL中的order by使用内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号