【MySQL】深入理解ORDER BY的排序規則及多個欄位排序的實現
阿新 • • 發佈:2020-01-22
引言
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,然後依次按照剩下的欄位排序。