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 |
ORDER BY 欄位若有索引且符合最左前綴,可避免 filesortORDER BY uid LIMIT 10 可使用優先隊列優化sort_buffer_size 過小導致磁碟臨時表,調大可改善Using filesort 表示需優化'10' < '2' → 需 ORDER BY CAST(col AS UNSIGNED)COLLATEORDER BY RAND() 極慢 → 改用應用層隨機或主鍵範圍抽樣善用 ORDER BY 進階技巧,能在業務邏輯層面實現靈活排序,同時透過索引設計獲得最佳查詢效能。