MySQL中Order By多字段排序规则代码示例

说在前面

突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧。

MySql order by 单字段

建一测试表如下:

CREATE TABLE `a` (
 `code` varchar(255) DEFAULT NULL,
 `name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT into a values('中一', '我');
INSERT into a values('中二', '你');
INSERT into a values('高一', '我是');
INSERT into a values('高二', '我们');
INSERT into a values('高二', '我的');

测试语句如下:

-- hex(): 获取16进制字节码
select name, hex(name) from a order by name desc

结果如下:

name hex(name)
我的 E68891E79A84
我是 E68891E698AF
我们 E68891E4BBAC
E68891
E4BDA0

很明显,MySQL中的排序,是以字节码进行排序的,当第一个字相同的时候,比较第二个字的字节码, 一次类推

MySql order by 多字段

有比较,才有想法,有比较才有进步,因此我们先把单字段的降序排序结果列出来,然后在看看两个字段的降序排序气矿,我们就可以从中分析出其中道理来。

-- 按照name进行降序排序
select * from a order by name desc;
-- 按照code进行降序排序
select * from a order by code desc; 

左边是order by name desc, 右边是order by code desc的结果

code name
高二 我的
高一 我是
高二 我们
中一
中二
code name
高二 我们
高二 我的
高一 我是
中二
中一

结果很明显:单一字段排序的时候,其他字段出现的顺序是自然排序的。

下面我们看看多字段的排序

-- 按照code, name进行降序排序
select * from a order by code, name desc; 
code name
中一
中二
高一 我是
高二 我的
高二 我们

结果如下:首先谢谢qq_27837327和MjayTang 的,本人在这里一次测试, 原文说这个sql排序无效的说法是错误的。实际上说order by code,name desc等同于order by code asc, name desc

经测试发现,select * from a order by code and name desc 排序效果依然无效。

我们在看看下面的语句

-- 按照code, name进行降序排序
select * from a order by code desc, name desc;
-- 该语句的效果等同于下面的语句, 其中1、2分别对应的是code、name
select code, name from a order by 1 desc, 2 desc;
code name
高二 我的
高二 我们
高一 我是
中二
中一

对比code,name的单个字段降序排序,我们可以发现, 使用 order by code desc, name desc的时候,MySQL会先以code进行降序排序,在code进行降序排序该基础上,再使用name进行降序排序。

另外我们还可以使用contat函数把多个字段拼接起来,在进行排序。但是要保证字段不能为null。下面我们来看一下concat的sql语句和结果。

select * from a order by concat(code,name) desc
code name
高二 我的
高二 我们
高一 我是
中二
中一

很明显,在这个测试例子上来看, order by concat(code, name) desc的效果等同于 order by code desc, name desc

总结

以上就是本文的全部内容,希望对大家有所帮助。欢迎参阅:几个比较重要的MySQL变量、MySQL主库binlog(master-log)与从库relay-log关系代码详解、MySQL prepare原理详解等,有什么问题可以随时留言,欢迎大家交流讨论。

(0)

相关推荐

  • Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别.. ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SELECT * FROM table WHERE txt = 'a' 那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以. utf8_general_

  • MySQL表排序规则不同错误问题分析

    MySQL多表join时报错如下:[Err]1267 – Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '= 就是说两个表的排序规则(COLLATION)不同,无法完成比较.COLLATION是用在排序,大小比较上,一个字符集有一个或多种COLLATION,并且以_ci(大小写不敏感)._cs(大小写敏感)或_bin(二进制)结束.在做比较时,应该确

  • MySQL中Order By多字段排序规则代码示例

    说在前面 突发奇想,想了解一下mysql order by排序是以什么规则进行的? 好了,话不多说,直接进入正题吧. MySql order by 单字段 建一测试表如下: CREATE TABLE `a` ( `code` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT into a values('中一', '我'); INSERT

  • 详解MySQL中Order By排序和filesort排序的原理及实现

    目录 1.Order By原理 2.filesort排序算法 3.优化排序 1.Order By原理 MySQL的Order By操作用于排序,并且会有多种不同的排序算法,他们的性能都是不一样的. 假设有一个表,建表的sql如下: CREATE TABLE `obtest` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `a` VARCHAR ( 100 ) NOT NULL, `b` VARCHAR ( 100 ) NOT NULL, `c` VARCHAR (

  • MySQL中order by排序语句的原理解析

    order by 是怎么工作的? 表定义 CREATE TABLE `t1` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`)) ENGINE=InnoDB; SQL语句可以这样写: se

  • PHP与MYSQL中UTF8编码的中文排序实例

    本文实例讲述了PHP与MYSQL中UTF8编码的中文排序方法,分享给大家供大家参考.具体实现方法如下: 一般来说,中文共有三种排序方式: 1.根据拼音排序: 2.根据笔画排序: 3.根据偏旁排序. 系统的默认排序方式为拼音排序了,这个也是我们常用的,下面介绍的就是按拼音排序了 1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. 复制代码 代码如下: f

  • 深入解析mysql中order by与group by的顺序问题

    mysql 中order by 与group by的顺序是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效.要查出group by中最大的或最小的某一字段使用 max或min函数.例:select sum(click_num) as totalnum,max(update_time) as update_time,

  • MySQL中order by的执行过程

    目录 一 .测试数据 二. 全字段排序 三.rowid 排序 四.全字段排序 与 rowid 排序 比较 前言: 在开发过程中,一定会经常碰到需要根据指定的字段排序来显示结果的需求.还是以前文的订单表为例,假设查询“张三”的所有订单,并且按照订单价格排序返回前 1000 个订单号以及价格. 一 .测试数据 测试的这个订单表my_order的结构是这样的: CREATE TABLE `my_order` ( `id` int(11) NOT NULL AUTO_INCREMENT, `oid` v

  • MySQL中order by的使用详情

    目录 1.简介 2.正文 2.1 单个列排序 2.2 多个列排序 2.3 排序的方式 2.4 order by结合limit 1.简介 在使用select语句时可以结合order by对查询的数据进行排序.如果不使用order by默认情况下MySQL返回的数据集,与它在底层表中的顺序相同,可能与你添加数据到表中的顺序一致,也可能不一致(在你对表进行修改.删除等操作时MySQL会对内存进行整理,此时数据的顺序会发生改变)因此如果我们希望得到的数据是有顺序的,就应该明确排序方式. 2.正文 首先准

  • Mysql中批量替换某个字段的部分数据(推荐)

    MYSQL中批量替换某个字段的部分数据,具体介绍如下所示: 1.修改字段里的所有含有指定字符串的文字 UPDATE 表A SET 字段B = replace(字段B, 'aaa', 'bbb') example: update table set url= replace(url, 'aaa', 'bbb') [将url字段中的aaa批量更改为bbb] update table set url= REPLACE (url,'3','1.png') where 条件; 2.常规条件修改: upda

  • Mysql中使用count加条件统计的实现示例

    目录 前言 测试环境 准备工作 条件统计 总结 前言 最近发现在处理Mysql问题时,count()函数频繁上镜,常常出现在分组统计的情景下,但是有时候并不是使用group by分好组就可以直接统计了,比如说一个常见的需求,统计每个班级男生所占的比例,这种情况一般会按照班级分组,但是分组内不但要统计班级的人数,还要统计男生的人数,也就是说统计是有条件的,之前确实没有考虑过怎样实心,后来查询了资料,总结在这里,方便日后查找使用. Mysql中count()函数的一般用法是统计字段非空的记录数,所以

  • MySQL中 LBCC 和 MVCC 的理解及常见问题示例

    目录 1. 事务 2. MVCC初探 3. LBCC & MVCC 总结 1. 事务 介绍MVCC之前,先介绍下事务:事务是为了保证数据库中数据的完整性和一致性. 事务的4个基本要素: 原子性(Atomicity):要么同时成功,要么同时失败.(通过undo log回滚日志实现) 一致性(Consistency):一方扣款 xxx 元,另一方收款 xxx 元,符合事物发展的正常逻辑(通过lock锁实现) 隔离性(Isolation):此时有多个类似 扣款/收款 事件同时发生,每个事件之间是相互独

随机推荐