1. 程式人生 > 資料庫 >【MySQL】深入理解ORDER BY的排序規則及多個欄位排序的實現

【MySQL】深入理解ORDER BY的排序規則及多個欄位排序的實現

引言

MySQL的ORDER BY語句在開發中經常用到,但你可曾想過它底層的排序規則,以及在面臨多個欄位排序的時候該如何抉擇麼?本文將帶你學習這些。

建立表並新增記錄

首先是建立表,如下:

CREATE TABLE `cps_commodity_info` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',`sku_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '商品skuId',`sku_name` varchar(100) NOT NULL DEFAULT '' COMMENT '商品名稱',`price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品價格',`is_on_top` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否置頂,0:不置頂,1:置頂',`created_date` datetime NOT NULL COMMENT '建立時間',`modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',`ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '邏輯刪除標誌,0:未刪除,2:已刪除',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='cps商品資訊';

隨後手動插入幾條資料,接下來分析會用到:

INSERT INTO `cps_commodity_info` VALUES (1,60469019380,'精裝拉麵',36.69,'2019-12-20 16:37:00','2019-12-31 16:37:05',0);
INSERT INTO `cps_commodity_info` VALUES (2,100003211179,'爆辣豆腐乾',22.66,1,'2019-12-27 16:37:58','2019-12-29 16:38:08',0);
INSERT INTO `cps_commodity_info` VALUES (3,100003255505,'清潔控油洗面奶',46.78,'2019-12-28 16:39:11','2019-12-28 16:39:19',0);
INSERT INTO `cps_commodity_info` VALUES (4,55870972945,'聖誕節平安果',16.52,'2019-12-28 16:39:57','2019-12-29 16:40:02',0);
INSERT INTO `cps_commodity_info` VALUES (5,63618008655,'無線藍芽耳機',188.88,'2020-01-01 16:40:40','2020-01-01 16:40:49',0);

單欄位排序

這裡主要針對varchar型別進行分析,數字型別就根據數字大小排序,這點沒什麼需要特別說明的。
首先列出測試語句,查詢欄位的位元組碼。

SELECT c.sku_name,hex(c.sku_name) FROM cps_commodity_info c ORDER BY c.sku_name DESC;

如下圖所示,單欄位排序是以該欄位的位元組碼進行排序的,當第一個位元組相同,則比較第二個,以此類推。
在這裡插入圖片描述

多欄位排序

假設我想按照商品價格做降序排列,語句很簡單:

SELECT * FROM cps_commodity_info c ORDER BY c.price DESC;

排序結果按照了price欄位降序排列,但是別的欄位的順序就顯得“雜亂無章”了。
在這裡插入圖片描述現在有個需求,將置頂商品放在最上面(is_on_top欄位),然後按照價格降序,怎樣實現呢?其實也很簡單:

SELECT * FROM cps_commodity_info c ORDER BY c.is_on_top DESC,c.price DESC;

如下圖,結果就是我們想要的。注意,這種排序會優先按照第一個欄位,即is_on_top,然後依次按照剩下的欄位排序。
在這裡插入圖片描述