按以下方式排序 MySQL:ASC 和 DESC 查询示例

⚡ 智能摘要

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

  • 🔠 默认行为: 当既未指定 ASC 也未指定 DESC 时,ORDER BY 会按升序排序,因此在大多数语句中 ASC 是可选的。
  • ⬆️ ASC关键词: ASC 将数字从小到大排列,字符串从 A 到 Z 排列,日期从最早到最新排列。
  • ⬇️ 描述关键词: DESC 反转了该顺序,这符合最近的付款历史记录和出生日期递减的列表。
  • 🧮 多列排序: 列顺序很重要。ORDER BY gender, date_of_birth DESC 会先按性别升序排序,然后按每个组内的日期降序排序。
  • 🔎 条款组合: WHERE 筛选行,GROUP BY 聚合行,ORDER BY 对结果进行排序,LIMIT 修剪结果。
  • ⚙️ 性能因素: 在已排序的列上建立索引允许 MySQL 避免对大型表执行文件排序操作。

按以下方式排序 MySQL

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) 两种排序方向。下表比较了它们在最常用数据类型上的排序效果。

DESC 和 ASC 关键字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 进行测试,我们得到了如下所示的结果。

MySQL 按降序排列查询结果

按升序排序(ASC)

同样的查询语句,按升序排列,只是交换了关键字。

SELECT * FROM members ORDER BY date_of_birth ASC;

MySQL 按升序排序查询结果

注意: 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 数据库进行测试,得到以下结果。

MySQL 按两列排序示例

默认情况下,性别列按升序排列,而出生日期列则显式地按降序排列。每个方向关键字仅适用于其后面的列。

如何将 ORDER BY 与 WHERE、LIMIT 和 GROUP BY 结合使用

在实际生产查询中,ORDER BY 很少是唯一的子句。 MySQL 它总是按照固定的顺序评估子句,了解这个顺序就能解释为什么结果看起来是这样的。

  1. 读取表中的行。
  2. NeoCity 丢弃不符合条件的行。
  3. 通过...分组 将剩余的行折叠成组,然后 HAVING 筛选这些组。
  4. ORDER BY 序列化剩余的行。
  5. 极限 从已排序的列表中截取指定数量的行。

因为 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 可以按索引顺序读取行,完全跳过排序。如果没有索引,大型表会强制进行内存或磁盘文件排序,这通常是报表查询速度变慢的原因。

常见问题

可以。如果没有在排序列上建立索引, MySQL 对整个结果集执行文件排序。添加一个与 ORDER BY 列和方向匹配的索引,可以让服务器按顺序读取行,从而跳过该步骤。

通常不会。默认排序规则(例如 utf8mb4_0900_ai_ci)不区分大小写,因此“apple”和“Apple”会一起排序。而二进制排序规则或 _cs 排序规则,或者使用 ORDER BY BINARY column_name 语句,则会区分大小写,大写字母排在前面。

是的。ORDER BY RAND() 会打乱结果集的顺序,这对于随机选择电影或成员非常有用。它会在排序前对每一行进行评分,因此最好与 LIMIT 一起使用,并且避免在非常大的表中使用它。

是的。诸如此类的工具中内置了人工智能助手。 MySQL 工作台 将纯语言请求转换为带有 ORDER BY 子句的 SELECT 语句。务必检查生成的排序列和排序方向,因为人工智能无法预知报表所需的排序方式。

部分如此。人工智能驱动的顾问会读取慢查询日志,并建议创建索引来消除文件排序操作。但这些建议仍然需要人工审核,因为每个额外的索引都会降低对同一张表的插入和更新速度。

总结一下这篇文章: