【MySQL】深入理解ORDER BY的排序规则及多个字段排序的实现

引言

MySQL的ORDER BY语句在开发中经常用到,笔者突发奇想,ORDER BY底层的排序规则究竟是什么,以及在面临多个字段排序的时候该如何处理呢?本篇将带着这两个问题做一个简单的探索。

创建表并添加记录

首先是创建表,如下:

CREATE TABLE `cps_commodity_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品skuId',
  `sku_name` varchar(100) NOT NULL DEFAULT '' COMMENT '商品名称',
  `price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品价格',
  `is_on_top` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否置顶,0:不置顶,1:置顶',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='cps商品信息';

随后手动插入几条数据,接下来分析会用到:

INSERT INTO `cps_commodity_info` VALUES (1, 60469019380, '精装拉面', 36.69, 0, '2019-12-20 16:37:00', '2019-12-31 16:37:05', 0);
INSERT INTO `cps_commodity_info` VALUES (2, 100003211179, '爆辣豆腐干', 22.66, 1, '2019-12-27 16:37:58', '2019-12-29 16:38:08', 0);
INSERT INTO `cps_commodity_info` VALUES (3, 100003255505, '清洁控油洗面奶', 46.78, 0, '2019-12-28 16:39:11', '2019-12-28 16:39:19', 0);
INSERT INTO `cps_commodity_info` VALUES (4, 55870972945, '圣诞节平安果', 16.52, 0, '2019-12-28 16:39:57', '2019-12-29 16:40:02', 0);
INSERT INTO `cps_commodity_info` VALUES (5, 63618008655, '无线蓝牙耳机', 188.88, 1, '2020-01-01 16:40:40', '2020-01-01 16:40:49', 0);

单字段排序

这里主要针对varchar类型进行分析,数字类型就根据数字大小排序,这点没什么需要特别说明的。
首先列出测试语句,查询字段的字节码。

SELECT c.sku_name, hex(c.sku_name) FROM cps_commodity_info c ORDER BY c.sku_name DESC;

如下图所示,单字段排序是以该字段的字节码进行排序的,当第一个字节相同,则比较第二个,以此类推。
在这里插入图片描述

多字段排序

假设现在有个需求,我想将置顶商品放在最上面(is_on_top字段),然后按照价格降序,怎样实现呢?其实也很简单:

SELECT * FROM cps_commodity_info c ORDER BY c.is_on_top DESC,c.price DESC;

如下图,结果就是我们想要的。注意,这种排序会优先按照第一个字段,即is_on_top,然后依次按照剩下的字段排序。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MySQLorder by语句可以用于对查询结果集进行排序,常常需要使用多个字段来进行排序。在多字段排序时,遵循以下规则: 1. 排序字段的顺序按照order by语句中的先后顺序进行,先根据第一个排序字段排序,如果有相同的值,则根据第二个排序字段排序,以此类推。 2. 对于数字类型的字段排序是根据数值大小进行的。对于文本类型的字段排序则根据字面的字符顺序进行,即按照字典顺序排序。 3. 对于字符串类型的字段,如果希望进行不区分大小写的排序,则可以使用lower或upper函数进行转换,例如:order by lower(name)。 4. 可以在排序规则中指定升序(asc)或降序(desc),默认是升序。如果需要使用降序排序,则需要在字段后加上desc。 5. 如果存在NULL值,排序结果可能不稳定。可以使用order by字段1,字段2,coalesce(字段3,0)来指定NULL值排序规则。 总之,MySQLorder by语句可以很灵活地进行多字段排序,并且可以指定不同字段排序规则,需要根据实际情况进行灵活运用。 ### 回答2: 在MySQL中,ORDER BY多字段排序规则分为以下三种: 1. 升序排序(ASC):使用ASC来排序,将会按照指定的字段按照从小到大的顺序进行排列。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `age` ASC, `name` ASC; ``` 2. 降序排序(DESC):使用DESC来排序,将会按照指定的字段按照从大到小的顺序进行排列。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `age` DESC, `name` DESC; ``` 3. 混合排序:在使用多个字段进行排序时,有时需要将一个字段按照升序排序,另一个字段按照降序排序。这时需要使用升序排序和降序排序的组合。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `age` ASC, `name` DESC; ``` 在混合排序中,将按照`age`字段进行升序排序,如果`age`相同则按照`name`字段进行降序排序。 需要注意的是,当使用多个字段进行排序时,排序字段的顺序将会影响结果。例如: ```mysql SELECT * FROM `mysql_demo` ORDER BY `name` ASC, `age` DESC; ``` 在这个例子中,首先将按照`name`进行升序排序,如果`name`相同则按照`age`进行降序排序。如果将`name`和`age`的顺序颠倒,则会按照`age`进行降序排序,如果`age`相同则按照`name`进行升序排序。因此,在使用多个字段进行排序时,需要根据实际需求确定排序字段的顺序。 ### 回答3: 在 MySQL 中,ORDER BY 子句用于指定排序规则。对于多字段排序,可以使用多个排序字段来定义排序规则。一般来说,多字段排序是根据所需的字段中的第一个字段进行排序,并且在第一个字段具有相同值的记录中,使用第二个字段进行排序,以此类推。 例如,假设有一个包含以下字段的表: id | name | age | gender 如果我们想按照年龄和性别来对记录进行排序,我们可以使用以下SQL语句: SELECT * FROM table_name ORDER BY age DESC, gender ASC; 在上面的SQL语句中,我们首先根据年龄字段进行降序排序,这意味着年龄最大的记录将会排在前面。如果某些记录拥有相同的年龄值,则这些记录将按照性别字段进行升序排序,这意味着男性记录将排在女性记录之前。 此外,还可以使用 ORDER BY 子句中的一个特殊关键字,即 NULLS FIRST 或 NULLS LAST,来控制空值的排序。例如,我们可以使用以下 SQL 语句来将空值排在最前面: SELECT * FROM table_name ORDER BY age DESC NULLS FIRST; 总之,在 MySQL 中,ORDER BY 子句可用于根据一个或多个字段对记录排序。多字段排序时,第一个排序字段是最重要的,随后的字段是副要素,可以用来细化排序规则。同时,还可以使用 NULLS FIRST 或 NULLS LAST 来控制空值在排序中的位置。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值