服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL中order by的使用详情

MySQL中order by的使用详情

2021-12-06 19:20李子捌 Mysql

在使用select语句时可以结合order by对查询的数据进行排序。如果不使用order by默认情况下MySQL返回的数据集,与它在底层表中的顺序相同,可能与你添加数据到表中的顺序一致,也可能不一致,如果希望得到的数据有顺序,就该明确排序方

MySQL中order by的使用详情

1、简介

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

2、正文

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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对单个列进行排序。

需求:

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

语句:

?
1
select * from user order by age;

结果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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之后就可以了。

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

?
1
2
mysql> insert into user (name, age, sex) values ('李子柒', 18, 1);
query ok, 1 row affected (0.01 sec)

需求:

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

语句:

?
1
select * from user order by age, name;

结果:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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进行降序,就应该两个列都指明降序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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列进行默认升序排序。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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岁了,比较老了,属于年龄最大的人之一。

?
1
2
3
4
5
6
7
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会抛出异常信息。

?
1
2
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使用内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7029480635093745701

延伸 · 阅读

精彩推荐
  • Mysqlmysql表优化、分析、检查和修复的方法详解

    mysql表优化、分析、检查和修复的方法详解

    这篇文章主要介绍了mysql表优化、分析、检查和修复的方法,结合实例形式较为详细的分析了MySQL表进行优化,分析与修复等操作的各种常见命令与使用技巧...

    MYSQL教程网2212020-06-05
  • MysqlCentOS 安装redis和MySQL

    CentOS 安装redis和MySQL

    这篇文章主要介绍了CentOS 安装redis和MySQL的相关资料,需要的朋友可以参考下...

    温而新2592020-11-29
  • Mysql初学者从源码理解MySQL死锁问题

    初学者从源码理解MySQL死锁问题

    这篇文章主要讲的是如何通过调试 MySQL 源码,知道一条 SQL 真正会拿哪些锁,不再抓虾,瞎猜或者何登成大神没写过的场景就不知道如何处理了,下面小编...

    挖坑的张师傅3162020-09-28
  • Mysqlmysql 8.0.14 安装配置方法图文教程

    mysql 8.0.14 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.14 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    随意的马蒂洛克5692020-09-12
  • Mysqlmysql修改数据库编码(数据库字符集)和表的字符编码的方法

    mysql修改数据库编码(数据库字符集)和表的字符编码的方法

    Mysql数据库是一个开源的数据库,应用非常广泛。以下是修改mysql数据库的字符编码的操作过程和将表的字符编码转换成utf-8的方法,需要的朋友可以参考下...

    MYSQL教程网6432020-03-22
  • MysqlMySQL可视化工具Navicat的连接方法

    MySQL可视化工具Navicat的连接方法

    今天小编就为大家分享一篇关于MySQL可视化工具Navicat的连接方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    回忆不说话4112019-06-19
  • MysqlMySQL 实现树的遍历详解及简单实现示例

    MySQL 实现树的遍历详解及简单实现示例

    这篇文章主要介绍了MySQL 实现树的遍历详解及简单实现示例的相关资料,这里提供了示例代码及测试结果,需要的朋友可以参考下...

    MYSQL教程网4502020-07-09
  • Mysqlmysql 5.7.14 安装配置简单教程

    mysql 5.7.14 安装配置简单教程

    这篇文章主要为大家分享了mysql 5.7.14安装配置方法图文教程,一看就会的mysql 5.7.14安装教程,感兴趣的朋友可以参考一下...

    goingforward4202020-06-19