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原理詳解等,有什麼問題可以隨時留言,歡迎大家交流討論。