按以下方式排序 MySQL:ASC 和 DESC 查询示例
⚡ 智能摘要
按以下方式排序 MySQL 使用 ASC 和 DESC 关键字按升序或降序对查询结果集进行排序。以下各节将解释语法、单列和多列排序、NULL 值放置以及针对 myflixdb 示例数据库执行的示例。

ORDER BY 是什么 MySQL?
MySQL ORDER BY 是 SELECT 查询语句中的一个子句,用于按顺序对数据进行排序。 MySQL ORDER BY 子句可以按升序或降序对查询结果集进行排序,可以按一列排序,也可以同时按多列排序。
单独使用 SELECT 命令时,数据行会按照存储引擎读取的顺序返回,但这并非保证顺序。排序就是按照指定的顺序重新排列这些数据行。它可以对数值、字符串和日期等数据类型执行。
MySQL ORDER BY 语法
在查看示例之前,了解该子句在完整的 SELECT 语句中的位置会有所帮助。
SELECT statement... [WHERE condition | GROUP BY `field_name(s)` HAVING condition] ORDER BY `field_name(s)` [ASC | DESC];
点击这里
- “选择语句......“ 这是常规的 select 查询。
- “ | ” 代表了不同的选择。
- “[WHERE condition | GROUP BY `field_name(s)` HAVING condition]” 是用于筛选查询结果集的可选条件。
- “按顺序” 对查询结果集进行排序。
- “[ASC | DESC]” 是用于按升序或降序对结果集进行排序的关键字。请注意: ASC 是默认值。
什么是 DESC 和 ASC 关键字?
ORDER BY 子句接受升序 (ASC) 和降序 (DESC) 两种排序方向。下表比较了它们在最常用数据类型上的排序效果。
ASC 是升序的缩写 |
MySQL DESC 是 descending 的缩写 |
|---|---|
| 用于对查询结果按从上到下的顺序进行排序。 | 它用于按从下到上的顺序对查询结果进行排序。 |
| 处理日期数据类型时,最早的日期显示在列表顶部。 | 处理日期数据类型时,最新日期会显示在列表顶部。 |
| 使用数字数据类型时,最低值显示在列表顶部。 | 处理数值数据类型时,查询结果集中的最大值会显示在顶部。 |
| 当使用字符串数据类型时,查询结果集按从字母 A 开始到字母 Z 的顺序排序。 | 使用字符串数据类型时,查询结果集按从字母 Z 开头到字母 A 的顺序排序。 |
SQL DESC 和 ASC 关键字都与 SELECT 语句一起使用。 MySQL ORDER BY 子句。
DESC 和 ASC 语法
SQL DESC 排序关键字具有以下基本语法。
SELECT {fieldName(s) | *} FROM tableName(s) [WHERE condition] ORDER BY fieldname(s) ASC | DESC [LIMIT N];
点击这里
- 从表名称中选择 {字段名称 | *} 是包含要从中获取结果集的字段和表的语句。
- [WHERE 条件] 是可选的,但可以用来根据给定的条件过滤数据。
- 按字段名排序 此项为必填项,用于指定排序所依据的字段。 MySQL DESC 关键字指定排序方式为降序。
- [限制 N] 是可选的,但可以用来限制从查询结果集中返回的行数。
为什么要在文中使用 DESC 和 ASC? MySQL?
了解语法只是成功的一半。ORDER BY 子句存在的意义在于,数据库易于生成的结果集,对人来说未必易于阅读。
假设您需要打印一位影碟库会员的付款记录,以便前台快速解答疑问。更合理的做法是按时间降序排列付款记录,从最近的付款开始,一直到最早的付款。在这种情况下,SQL 中的 DESC 关键字就派上了用场,因为它可以按付款日期对列表进行排序。
假设市场部想要一份按类别排列的电影列表,以便会员在租借前查看图书馆的馆藏。将类别名称和电影名称按升序排列,可以让会员像查阅索引一样快速查找信息。ASC 关键字正是用于此目的。
简而言之,ORDER BY 子句会将原始结果集转换为报表。您选择的关键字取决于读者提出的问题: 最近发生了什么 需要 DESC,而 我在哪里可以找到这个物品 呼吁ASC。
MySQL 按示例排序
以下所有示例均基于 myflixdb 示例数据库运行。首先是未排序的成员表,该表将按默认顺序返回。
SELECT * FROM members;
在以下位置执行上述脚本 MySQL 使用 Workbench 对 myflixdb 进行测试,我们得到了如下所示的结果。
| 会员号码 | 全名 | 性别 | 出生日期 | 实际地址 | 邮政地址 | 联系电话 | 电子邮件 |
|---|---|---|---|---|---|---|---|
| 1 | 珍妮特琼斯 | (女) | 21-07-1980 | 第一街 4 号地块 | 私人包 | 0759 253 542 | janetjones@yagoo.cm |
| 2 | 珍妮特·史密斯·琼斯 | (女) | 23-06-1980 | 梅尔罗斯 123 | 无 | 无 | jj@fstreet.com |
| 3 | 罗伯特·菲尔 | (男) | 12-07-1989 | 第三街 3 | 无 | 12345 | rm@tstreet.com |
| 4 | 格洛丽亚·威廉姆斯 | (女) | 14-02-1984 | 第二街 2 | 无 | 无 | 无 |
| 5 | 伦纳德·霍夫施塔特 | (男) | 无 | 桂园 | 无 | 845738767 | 无 |
| 6 | 谢尔顿·库珀 | (男) | 无 | 桂园 | 无 | 976736763 | 无 |
| 7 | 拉杰什·库斯拉帕利 | (男) | 无 | 桂园 | 无 | 938867763 | 无 |
| 8 | 莱斯利·温克尔 | (男) | 14-02-1984 | 桂园 | 无 | 987636553 | 无 |
| 9 | 霍华德·沃洛维茨 | (男) | 24-08-1981 | 南方公园 | PO Box 4563 | 987786553 | 无 |
使用 DESC 按降序排序
假设市场部希望按出生日期降序排列成员信息,以便团队及时发送生日祝福。以下查询生成了该列表。
SELECT * FROM members ORDER BY date_of_birth DESC;
在以下位置执行上述脚本 MySQL 使用 Workbench 对 myflixdb 进行测试,我们得到了如下所示的结果。
按升序排序(ASC)
同样的查询语句,按升序排列,只是交换了关键字。
SELECT * FROM members ORDER BY date_of_birth ASC;
注意: NULL 表示没有值,这与零或空字符串不同。请注意两张截图中 NULL 日期是如何分组在一起的: MySQL 将 NULL 值视为低于任何其他值,因此 NULL 行在 ASC 下排在最前面,在 DESC 下排在最后。
如何在多列中排序 MySQL
单列排序可以回答简单的问题。报表通常需要二级排序,而 ORDER BY 子句正是为了实现这一目的而接受以逗号分隔的字段列表。
请考虑以下 SQL 排序脚本,该脚本列出所有成员记录,而没有任何明确的指令。
SELECT * FROM `members`;
执行上述脚本将得到如下所示的结果。
| 会员号码 | 全名 | 性别 | 出生日期 | 实际地址 | 邮政地址 | 联系电话 | 电子邮件 |
|---|---|---|---|---|---|---|---|
| 1 | 珍妮特琼斯 | (女) | 21-07-1980 | 第一街 4 号地块 | 私人包 | 0759 253 542 | janetjones@yagoo.cm |
| 2 | 珍妮特·史密斯·琼斯 | (女) | 23-06-1980 | 梅尔罗斯 123 | 无 | 无 | jj@fstreet.com |
| 3 | 罗伯特·菲尔 | (男) | 12-07-1989 | 第三街 3 | 无 | 12345 | rm@tstreet.com |
| 4 | 格洛丽亚·威廉姆斯 | (女) | 14-02-1984 | 第二街 2 | 无 | 无 | 无 |
| 5 | 伦纳德·霍夫施塔特 | (男) | 无 | 桂园 | 无 | 845738767 | 无 |
| 6 | 谢尔顿·库珀 | (男) | 无 | 桂园 | 无 | 976736763 | 无 |
| 7 | 拉杰什·库斯拉帕利 | (男) | 无 | 桂园 | 无 | 938867763 | 无 |
| 8 | 莱斯利·温克尔 | (男) | 14-02-1984 | 桂园 | 无 | 987636553 | 无 |
| 9 | 霍华德·沃洛维茨 | (男) | 24-08-1981 | 南方公园 | PO Box 4563 | 987786553 | 无 |
按默认顺序对单列进行排序
假设我们想要一个列表,该列表根据性别字段对查询结果集进行排序。下面的脚本无需指定排序方向即可实现此目的。
SELECT * FROM `members` ORDER BY `gender`;
| 会员号码 | 全名 | 性别 | 出生日期 | 实际地址 | 邮政地址 | 联系电话 | 电子邮件 |
|---|---|---|---|---|---|---|---|
| 1 | 珍妮特琼斯 | (女) | 21-07-1980 | 第一街 4 号地块 | 私人包 | 0759 253 542 | janetjones@yagoo.cm |
| 2 | 珍妮特·史密斯·琼斯 | (女) | 23-06-1980 | 梅尔罗斯 123 | 无 | 无 | jj@fstreet.com |
| 4 | 格洛丽亚·威廉姆斯 | (女) | 14-02-1984 | 第二街 2 | 无 | 无 | 无 |
| 3 | 罗伯特·菲尔 | (男) | 12-07-1989 | 第三街 3 | 无 | 12345 | rm@tstreet.com |
| 5 | 伦纳德·霍夫施塔特 | (男) | 无 | 桂园 | 无 | 845738767 | 无 |
| 6 | 谢尔顿·库珀 | (男) | 无 | 桂园 | 无 | 976736763 | 无 |
| 7 | 拉杰什·库斯拉帕利 | (男) | 无 | 桂园 | 无 | 938867763 | 无 |
| 8 | 莱斯利·温克尔 | (男) | 14-02-1984 | 桂园 | 无 | 987636553 | 无 |
| 9 | 霍华德·沃洛维茨 | (男) | 24-08-1981 | 南方公园 | PO Box 4563 | 987786553 | 无 |
首先显示“女性”成员,然后显示“男性”成员。这是因为当使用 ORDER BY 子句而未指定 ASC 或 ASC 时,顺序会发生变化。 MySQL DESC 关键词, MySQL 默认情况下,按升序对查询结果集进行排序。
对两列数据沿相反方向排序
现在让我们来看一个例子,它执行以下操作: 使用两列排序第一列是 排序 in 升序 默认情况下,第二列是 排序 in 降序.
SELECT * FROM `members` ORDER BY `gender`, `date_of_birth` DESC;
在以下位置执行上述脚本 MySQL 使用 Workbench 对 myflixdb 数据库进行测试,得到以下结果。
默认情况下,性别列按升序排列,而出生日期列则显式地按降序排列。每个方向关键字仅适用于其后面的列。
如何将 ORDER BY 与 WHERE、LIMIT 和 GROUP BY 结合使用
在实际生产查询中,ORDER BY 很少是唯一的子句。 MySQL 它总是按照固定的顺序评估子句,了解这个顺序就能解释为什么结果看起来是这样的。
- 从 读取表中的行。
- NeoCity 丢弃不符合条件的行。
- 通过...分组 将剩余的行折叠成组,然后 HAVING 筛选这些组。
- ORDER BY 序列化剩余的行。
- 极限 从已排序的列表中截取指定数量的行。
因为 ORDER BY 语句在 WHERE 和 GROUP BY 语句之后、LIMIT 语句之前执行,所以像“伍德克雷斯特最年轻的五名成员”这样的查询可以用一条语句表达。
SELECT full_names, date_of_birth FROM members WHERE physical_address = 'Woodcrest' ORDER BY date_of_birth DESC LIMIT 5;
分组结果也遵循同样的排序规则。聚合值由……产生 聚合函数 例如,可以对 COUNT 进行排序,因此最繁忙的类别会显示在报告的顶部。
SELECT gender, COUNT(*) AS members_count FROM members GROUP BY gender ORDER BY members_count DESC;
提示: ORDER BY 子句可以按列别名、表达式甚至列位置(例如 ORDER BY 3)排序。按位置排序比较脆弱,因为在 SELECT 列表中插入新列会悄悄地更改排序键。建议为列命名。
有一点性能方面的考量值得记住。当排序列带有索引时, MySQL 可以按索引顺序读取行,完全跳过排序。如果没有索引,大型表会强制进行内存或磁盘文件排序,这通常是报表查询速度变慢的原因。

ASC 是升序的缩写
MySQL DESC 是 descending 的缩写

