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

MySQL ORDER BY 子句完整語法與實戰範例:ASC/DESC、多欄位、索引優化

     編輯:MySQL 資料庫相關知識

基本語法

SELECT column_list
FROM table_name
[WHERE condition]
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
  • ASC(預設):遞增(1→9, a→z, 日期舊→新)
  • DESC:遞減(9→1, z→a, 日期新→舊)
  • 大小寫不敏感:ORDER BY = order by

實戰範例

資料準備

idFirstNameLastNameAge
1PeterGriffin35
2GlennQuagmire33

單欄位排序

-- 年齡由小到大
SELECT * FROM person ORDER BY Age ASC;
-- 結果:Glenn(33), Peter(35)

-- 年齡由大到小
SELECT * FROM person ORDER BY Age DESC;
-- 結果:Peter(35), Glenn(33)

多欄位排序

規則:先按第一欄排序;第一欄值相同時,再按第二欄排序,以此類推。

-- 部門升序,部門內薪資降序
SELECT dept, name, salary
FROM employees
ORDER BY dept ASC, salary DESC;

搭配 LIMIT 分頁

-- 最新 10 筆訂單
SELECT * FROM orders ORDER BY created_at DESC LIMIT 10;

-- 第 3 頁(每頁 20 筆)
SELECT * FROM products ORDER BY price ASC LIMIT 20 OFFSET 40;

索引優化關鍵

核心原則:ORDER BY 欄位順序、方向與索引定義完全一致時,可避免 filesort,直接按索引順序輸出。

最佳實踐

查詢 ORDER BY建議索引是否避免 filesort
ORDER BY a ASCINDEX (a)是
ORDER BY a DESCINDEX (a DESC) (8.0+) 或 INDEX (a)是 (8.0+ 降序索引)
ORDER BY a ASC, b DESCINDEX (a ASC, b DESC)是 (8.0+)
WHERE x=1 ORDER BY aINDEX (x, a)是
WHERE x=1 ORDER BY a, bINDEX (x, a, b)是
WHERE x>1 ORDER BY aINDEX (x, a)否(range 斷點)

EXPLAIN 判斷依據

  • Extra: Using filesort → 需優化
  • Extra: Using index / 無 filesort → 最佳

常見陷阱

  • 混合 ASC/DESC 導致 filesort:MySQL 5.7 不支援降序索引,混合方向會 filesort。升級 8.0 解決。
  • WHERE 與 ORDER BY 欄位不符:WHERE b=1 ORDER BY a 無法用 INDEX(a,b)。
  • SELECT * 殺死覆蓋索引:只查索引欄位才能 Using index。
  • RAND() 排序:ORDER BY RAND() 全表掃描+臨時表+filesort,嚴禁大表使用。

PHP 完整範例

<?php
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$stmt = $pdo->query("SELECT FirstName, LastName, Age FROM person ORDER BY Age ASC");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "{$row['FirstName']} {$row['LastName']} {$row['Age']}<br>";
}
?>

掌握 ORDER BY 與索引的協作關係,是 SQL 效能調優的必修課。

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