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
相關文章
- 快排實現仿order by多欄位排序排序
- PHP陣列多個欄位分別排序PHP陣列排序
- Spring MVC @SortDefault多欄位排序SpringMVC排序
- 【MySQL】批次修改排序規則MySql排序
- mysql sql同一個欄位多個行轉成一個欄位查詢MySql
- 記錄一下mysql多欄位排序遇到的一個好玩的現象MySql排序
- MySQL Order BY 排序過程MySql排序
- mySql刪除多個表 刪除多個欄位的SQLMySql
- mysql5.6生成排序欄位MySql排序
- C# 實現list=list.OrderBy(q=>q.欄位名).ToList(); 按多個欄位排序C#排序
- vxe-table grid 使用服務端排序、多欄位排序服務端排序
- 將多個JSON欄位對映到單個Java欄位JSONJava
- MySQL order by 排序結果不正確MySql排序
- 逆向工程通過某個欄位排序排序
- Java stream sorted使用 Comparator 進行多欄位排序Java排序
- 請教一下 多欄位值如何排序?排序
- 使用正規表示式對數字字串欄位排序字串排序
- ElasticSearch多欄位權重排序居然可以這麼玩Elasticsearch排序
- mysql多表多欄位查詢並去重MySql
- eslint-plugin-import 規則之 Import / OrderEsLintPluginImport
- MySQL distinct 和 order by 排序混淆的替代方案MySql排序
- MYSQL order by排序與索引關係總結MySql排序索引
- 二維陣列根據某個欄位排序陣列排序
- 哇,ElasticSearch多欄位權重排序居然可以這麼玩Elasticsearch排序
- 關於mysql字符集及排序規則設定MySql排序
- MySQL 更新同一個表不同欄位MySql
- MySQL多列欄位去重的案例實踐MySql
- MySQL簡單實現多欄位模糊查詢MySql
- MySQL資料庫查詢多個欄位值全部相同的記錄MySql資料庫
- PHP 二維陣列, 按某一個欄位排序PHP陣列排序
- MySQL按指定順序排序(order by field的使用)MySql排序
- MYSQL order by排序導致效率低小優化MySql排序優化
- 怎麼給模型中的欄位增加自動完成規則模型
- SQL字元型欄位按數字型欄位排序實現方法SQL字元排序
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- MySQL 更新一個表裡的欄位等於另一個表某欄位的值MySql
- mysql基礎 依據一個欄位查詢另外一個欄位存在不同的值MySql
- [提問交流]模型管理中的欄位【驗證規則】和【自動完成規則】怎麼用?模型
- mysql如何判斷是否存在某個欄位MySql