MySQL ORDER BY 子句完整教學:排序語法、NULL 值處理與效能最佳化

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 語句的最後。如果有其他子句(例如 WHEREGROUP 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 值的排序結果

產品名稱價格
產品ANULL
產品B1000
產品C2000

讓 NULL 值排在最後的方法

若想讓 NULL 值顯示在最後,可以使用 ISNULL() 函數:

SELECT * FROM products
ORDER BY ISNULL(price), price ASC;

5. 與 WHERE 子句的結合

WHEREORDER 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 子句,可以更有效率地進行資料排序,並改善應用程式或資料庫的效能。建議在日常專案與實務中靈活應用這些技巧。

實務應用情境

  1. 報表生成
    例如,產生銷售報表時,依銷售金額排序產品,或依地區銷售實績進行排序。
  2. 分頁功能
    在 Web 應用程式中,結合 ORDER BYLIMIT,能高效地實現分頁顯示。
  3. 資料庫清理作業
    刪除舊資料或篩選符合條件的紀錄時,使用 ORDER BY 能快速找到需要的資料。

這些應用情境在日常開發中相當常見,透過善用 ORDER BY 子句,可以大幅提升工作效率。