MySql Order By 多個欄位 排序規則

xlxxcc發表於2016-08-21

說在前面

突發奇想,想了解一下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_27837327MjayTang 的,本人在這裡一次測試, 原文說這個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

相關文章