MySql Order By 多个字段 排序规则

  分类:

目录(?)[+]

说在前面

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

MySql order by 单字段

建一测试表如下:

[sql]  view plain  copy
  1. CREATE TABLE `a` (  
  2.   `code` varchar(255) DEFAULT NULL,  
  3.   `namevarchar(255) DEFAULT NULL  
  4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
[sql]  view plain  copy
  1. INSERT into a values('中一''我');  
  2. INSERT into a values('中二''你');  
  3. INSERT into a values('高一''我是');  
  4. INSERT into a values('高二''我们');  
  5. INSERT into a values('高二''我的');  

测试语句如下:

[sql]  view plain  copy
  1. -- hex(): 获取16进制字节码  
  2. select name, hex(namefrom a order by name desc  

结果如下:

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

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

MySql order by 多字段

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

[sql]  view plain  copy
  1. -- 按照name进行降序排序  
  2. select * from a order by name desc;  
  3. -- 按照code进行降序排序  
  4. select * from a order by code desc;  

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

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

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

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

[sql]  view plain  copy
  1. -- 按照code, name进行降序排序  
  2. select * from a order by code, name desc;  
code name
中一
中二
高一 我是
高二 我的
高二 我们

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

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

我们在看看下面的语句

[sql]  view plain  copy
  1. -- 按照code, name进行降序排序  
  2. select * from a order by code descname desc;  
  3. -- 该语句的效果等同于下面的语句, 其中1、2分别对应的是code、name  
  4. 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语句和结果。

[sql]  view plain  copy
  1. select * from a order by concat(code,namedesc  
code name
高二 我的
高二 我们
高一 我是
中二
中一

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值