首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL ORDER BY 完整用法指南:單欄、多欄、自定義排序與效能優化

     編輯:MySQL 資料庫相關知識

ORDER BY 是 SQL 排序核心子句,支援單欄、多欄、表達式、自定義邏輯排序。本文以實例說明各種用法與效能考量。

基礎語法

SELECT * FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC] ...
  • ASC:遞增(預設),由小到大
  • DESC:遞減,由大到小

實戰範例

建表與測試資料:

CREATE TABLE mysql_order_by_test (
    uid INT(10) NOT NULL AUTO_INCREMENT,
    name CHAR(80) NOT NULL,
    sex TINYINT(1) NOT NULL,
    KEY uid (uid)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4;

INSERT INTO mysql_order_by_test (uid, name, sex) VALUES 
(1, '張三', 1),
(2, '李四', 2),
(3, '王二麻子', 1);

單欄排序

-- uid 遞增
SELECT * FROM mysql_order_by_test ORDER BY uid ASC;
-- 結果: 1張三, 2李四, 3王二麻子

-- uid 遞減
SELECT * FROM mysql_order_by_test ORDER BY uid DESC;
-- 結果: 3王二麻子, 2李四, 1張三

多欄排序

-- 先按 sex 遞增,同 sex 內按 uid 遞減
SELECT * FROM mysql_order_by_test ORDER BY sex ASC, uid DESC;

進階用法

場景語法範例
表達式排序ORDER BY (price * quantity) DESC
函數結果排序ORDER BY LENGTH(name) ASC
自定義順序ORDER BY FIELD(status, 'pending', 'paid', 'shipped', 'cancelled')
NULL 值排序控制ORDER BY col IS NULL, col ASC (NULL 排最後)
隨機排序ORDER BY RAND() (大表慎用)
按條件排序ORDER BY CASE WHEN type='vip' THEN 1 ELSE 2 END, created_at

效能優化關鍵點

  1. 索引覆蓋:ORDER BY 欄位若有索引且符合最左前綴,可避免 filesort
  2. 避免 SELECT *:只查詢所需欄位,減少排序緩衝區壓力
  3. LIMIT 配合:ORDER BY uid LIMIT 10 可使用優先隊列優化
  4. 排序緩衝區:sort_buffer_size 過小導致磁碟臨時表,調大可改善
  5. EXPLAIN 檢查:出現 Using filesort 表示需優化

常見陷阱

  • 字串欄位數字排序錯誤:'10' < '2' → 需 ORDER BY CAST(col AS UNSIGNED)
  • 不同字符集排序規則衝突 → 統一 COLLATE
  • 大表 ORDER BY RAND() 極慢 → 改用應用層隨機或主鍵範圍抽樣

善用 ORDER BY 進階技巧,能在業務邏輯層面實現靈活排序,同時透過索引設計獲得最佳查詢效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved