詳解MySQL中Order By多字段排序規則

想了解一下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 Order by 語句優化代碼詳解

MySQL Order by 語句優化代碼詳解

MySQL Order by 語句優化代碼詳解

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享