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| id | FirstName | LastName | Age |
|---|---|---|---|
| 1 | Peter | Griffin | 35 |
| 2 | Glenn | Quagmire | 33 |
-- 年齡由小到大
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;
-- 最新 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 ASC | INDEX (a) | 是 |
ORDER BY a DESC | INDEX (a DESC) (8.0+) 或 INDEX (a) | 是 (8.0+ 降序索引) |
ORDER BY a ASC, b DESC | INDEX (a ASC, b DESC) | 是 (8.0+) |
WHERE x=1 ORDER BY a | INDEX (x, a) | 是 |
WHERE x=1 ORDER BY a, b | INDEX (x, a, b) | 是 |
WHERE x>1 ORDER BY a | INDEX (x, a) | 否(range 斷點) |
Extra: Using filesort → 需優化Extra: Using index / 無 filesort → 最佳WHERE b=1 ORDER BY a 無法用 INDEX(a,b)。Using index。ORDER BY RAND() 全表掃描+臨時表+filesort,嚴禁大表使用。<?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 效能調優的必修課。