MySQL中order by的使用详情


Posted in MySQL onNovember 17, 2021

 

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

ASC -> 升序排序(默认排序方式)
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 相关文章推荐
MySQL索引篇之千万级数据实战测试
Apr 05 MySQL
多表查询、事务、DCL
Apr 05 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
关于MySQL中的 like操作符详情
Nov 17 #MySQL
MySQL窗口函数的具体使用
MySQL中varchar和char类型的区别
Nov 17 #MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 #MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 #MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 #MySQL
SQL 聚合、分组和排序
Nov 11 #MySQL
You might like
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
php 禁止页面缓存输出
2009/01/07 PHP
发款php蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
用js怎么把&字符换成"&amp:"
2006/10/19 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
jQuery库与其他JS库冲突的解决办法
2010/02/07 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
Angularjs通过指令监听ng-repeat渲染完成后执行脚本的方法
2016/12/31 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
python 实现查找文件并输出满足某一条件的数据项方法
2019/06/12 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
先进集体获奖感言
2014/02/13 职场文书
2014年防汛工作总结
2014/12/08 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
车辆挂靠协议书
2016/03/23 职场文书