1. 前言
MySQL 是在網頁應用程式與資料庫管理中廣泛使用的關聯式資料庫。其中,ORDER BY
子句是用來依照特定條件整理查詢結果的重要功能。本文將詳細說明 ORDER BY
子句的基本用法、多欄位排序、NULL
值的處理,以及效能最佳化的方法。此外,為了讓讀者更直觀地理解實際的資料操作,我們會搭配具體範例與圖表來解說。
2. ORDER BY 子句的基本語法
ORDER BY
子句用於將查詢出的資料依照升冪(ASC
)或降冪(DESC
)進行排序。透過指定欄位,能讓輸出的資料更有條理、更容易閱讀。
基本語法
SELECT * FROM table_name
ORDER BY column_name ASC | DESC;
- 升冪(ASC):由小到大排序。若未特別指定
ASC
,則預設即為升冪。 - 降冪(DESC):由大到小排序。
使用範例
以下查詢會將客戶資料依照年齡升冪排序:
SELECT * FROM customers
ORDER BY age ASC;
圖1: 排序前的客戶資料
姓名 | 年齡 | 地址 |
---|---|---|
山田 | 40 | 東京 |
佐藤 | 25 | 大阪 |
鈴木 | 35 | 名古屋 |
圖2: 排序後的客戶資料
姓名 | 年齡 | 地址 |
---|---|---|
佐藤 | 25 | 大阪 |
鈴木 | 35 | 名古屋 |
山田 | 40 | 東京 |
注意事項
ORDER BY
子句必須寫在 SELECT
語句的最後。如果有其他子句(例如 WHERE
或 GROUP BY
),則需在它們之後使用。
3. 複數欄位排序
ORDER BY
子句可以同時指定多個欄位進行排序。這樣能讓資料更細緻地排列。例如,先依照第一個欄位排序,如果有相同的值,再依第二個欄位排序。
語法範例
SELECT * FROM table_name
ORDER BY column1 ASC, column2 DESC;
實例
以下查詢會先依照地址降冪,再依年齡升冪排序:
SELECT * FROM customers
ORDER BY address DESC, age ASC;
圖3: 複數欄位排序結果
姓名 | 地址 | 年齡 |
---|---|---|
山田 | 東京 | 40 |
佐藤 | 大阪 | 25 |
鈴木 | 名古屋 | 35 |
如上所示,會先依地址 (address
) 進行降冪排序,若有相同地址,再依年齡 (age
) 進行升冪排序。
4. NULL 值的處理
在 SQL 中,NULL
代表「沒有值」。在使用 ORDER BY
子句時,NULL
會被特殊處理:若為升冪 (ASC
),則 NULL
會排在最前;若為降冪 (DESC
),則會排在最後。
NULL
值排序規則
- 升冪(ASC):
NULL
值會出現在最前面。 - 降冪(DESC):
NULL
值會出現在最後面。
實例
以下查詢會將價格為 NULL
的產品排在最前面,其他依價格升冪排序:
SELECT * FROM products
ORDER BY price ASC;
圖4: 含有 NULL
值的排序結果
產品名稱 | 價格 |
---|---|
產品A | NULL |
產品B | 1000 |
產品C | 2000 |
讓 NULL 值排在最後的方法
若想讓 NULL
值顯示在最後,可以使用 ISNULL()
函數:
SELECT * FROM products
ORDER BY ISNULL(price), price ASC;
5. 與 WHERE 子句的結合
將 WHERE
與 ORDER BY
子句結合,可以先篩選符合條件的資料,再進行排序。這樣能更有效率地顯示需要的資料。
基本語法
SELECT * FROM table_name
WHERE condition
ORDER BY column_name ASC | DESC;
實例
以下查詢會選出年齡大於等於 30 歲的客戶,並依姓名升冪排序:
SELECT * FROM customers
WHERE age >= 30
ORDER BY name ASC;
此查詢範例展示了如何在過濾資料後,再應用排序。
6. 與 GROUP BY 的併用
GROUP BY
子句會將資料依特定欄位分組,並能搭配 ORDER BY
對分組後的結果排序。
實例
以下查詢會計算各地區的客戶數,並依客戶數降冪排序:
SELECT region, COUNT(*)
FROM customers
GROUP BY region
ORDER BY COUNT(*) DESC;
圖5: 分組後的排序結果
地區 | 客戶數 |
---|---|
東京 | 50 |
大阪 | 30 |
名古屋 | 20 |
7. ORDER BY 的進階應用:日期與字串排序
ORDER BY
子句也能應用在日期或字串欄位。例如,想要顯示最新資料在最前面,或依字母順序、注音順序排序時都很實用。
日期排序
SELECT * FROM orders
ORDER BY order_date DESC;
此查詢會將最新的訂單顯示在最前面。
字串排序
以下查詢會依姓名欄位的字母順序排序:
SELECT * FROM employees
ORDER BY name ASC;
8. ORDER BY 的效能最佳化
在處理大量資料排序時,效能可能會受到影響。以下介紹幾個常見的效能優化技巧。
利用索引
對排序欄位建立索引,可以加快查詢速度:
CREATE INDEX idx_column_name ON table_name(column_name);
搭配 LIMIT
使用 LIMIT
子句限制返回的筆數,可以縮短查詢時間並減少系統負擔:
SELECT * FROM customers
ORDER BY age ASC
LIMIT 10;
大量資料的處理
若需要處理大量資料,可以透過調整 MySQL 設定來提升效能。例如,增加 sort_buffer_size
的大小:
SET GLOBAL sort_buffer_size = 2M;
同時,也建議使用 EXPLAIN
來檢視查詢計劃,判斷是否還有優化空間:
EXPLAIN SELECT * FROM customers ORDER BY age ASC;
9. 總結
本文詳細介紹了 MySQL ORDER BY
子句從基礎到進階的應用。無論是升冪/降冪排序、多欄位排序,還是 NULL
值處理,ORDER BY
都是整理資料不可或缺的工具。
此外,也說明了如何進行效能優化,例如使用索引、LIMIT
子句與調整 sort_buffer_size
,這些方法能在處理大規模資料集時提升查詢效率。
熟練運用 MySQL 的 ORDER BY
子句,可以更有效率地進行資料排序,並改善應用程式或資料庫的效能。建議在日常專案與實務中靈活應用這些技巧。
實務應用情境
- 報表生成:
例如,產生銷售報表時,依銷售金額排序產品,或依地區銷售實績進行排序。 - 分頁功能:
在 Web 應用程式中,結合ORDER BY
與LIMIT
,能高效地實現分頁顯示。 - 資料庫清理作業:
刪除舊資料或篩選符合條件的紀錄時,使用ORDER BY
能快速找到需要的資料。
這些應用情境在日常開發中相當常見,透過善用 ORDER BY
子句,可以大幅提升工作效率。