SQL ORDER BY:查詢結果排序指南

Published February 25, 2025 by 徐培鈞
資料庫

在 SQL 查詢中,獲取資料後的顯示順序對於數據分析和報表生成至關重要。

例如:

  • 你希望按照價格從高到低顯示產品列表 📊
  • 你需要按照訂單時間排序來找出最近的交易 🛒
  • 你想根據學生的成績從高到低排名 🏆

在這些情境中,SQL 提供了一個強大的關鍵字:ORDER BY

它允許我們根據特定欄位對查詢結果進行排序,並支援升序(ASC)降序(DESC)

本篇文章將深入介紹 **SQL ORDER BY 的基本語法、進階用法,以及如何與 LIMITCASENULLS 等條件結合使用,讓你的查詢更具靈活性。🚀


ORDER BY 的基本語法

ORDER BY 用於對 SQL 查詢結果進行排序,基本語法如下:

SELECT column1, column2, ...
FROM table_name
ORDER BY column_name [ASC | DESC];
  • ASC(Ascending):升序(預設值),從小到大排序。
  • DESC(Descending):降序,從大到小排序。

單一欄位排序

按價格升序排列

假設我們有一張 Products 表:

ProductNameLaptop
Price1200
ProductNameMouse
Price30
ProductNameKeyboard
Price80
ProductNameMonitor
Price300

如果我們想按照價格從低到高排序

SELECT ProductID, ProductName, Price
FROM Products
ORDER BY Price ASC;

🔹 結果:

ProductNameMouse
Price30
ProductNameKeyboard
Price80
ProductNameMonitor
Price300
ProductNameLaptop
Price1200

💡 ASC 是 SQL 的預設排序方式,即使不寫 ASC,結果仍會從小到大排列。

按價格降序排列

如果我們想按照價格從高到低排序

SELECT ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC;

🔹 結果:

ProductNameLaptop
Price1200
ProductNameMonitor
Price300
ProductNameKeyboard
Price80
ProductNameMouse
Price30

多欄位排序

有時,我們需要根據多個條件來排序,例如:

  • 先按照類別(Category)升序
  • 再按照價格(Price)降序

按類別與價格排序

假設我們有 Products 表:

ProductNameLaptop
CategoryElectronics
Price1200
ProductNameMouse
CategoryAccessories
Price30
ProductNameKeyboard
CategoryAccessories
Price80
ProductNameMonitor
CategoryElectronics
Price300

我們想讓 Category 先升序排列,再讓 Price 依降序排列:

SELECT ProductID, ProductName, Category, Price
FROM Products
ORDER BY Category ASC, Price DESC;

🔹 結果:

ProductNameKeyboard
CategoryAccessories
Price80
ProductNameMouse
CategoryAccessories
Price30
ProductNameLaptop
CategoryElectronics
Price1200
ProductNameMonitor
CategoryElectronics
Price300

💡 排序順序解釋:

  1. 先按照 Category 升序(AccessoriesElectronics)。
  2. Category 相同,則按照 Price 降序排列(8030)。

ORDER BYLIMIT 搭配

當數據量很大時,我們通常只需要取得前幾筆結果,可以使用 LIMIT 限制回傳的筆數。

查詢價格最高的 3 種產品

SELECT ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC
LIMIT 3;

🔹 結果:

ProductNameLaptop
Price1200
ProductNameMonitor
Price300
ProductNameKeyboard
Price80

📌 LIMIT 在 MySQL、PostgreSQL、SQLite 可用,SQL Server 則使用 TOP

SELECT TOP 3 ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC;

ORDER BYNULL 值的處理

在 SQL 中,NULL 代表未知值,當我們排序時,NULL 可能會排在最前面或最後面(依不同資料庫而異)。

處理 NULL 值的排序

假設我們有 Employees 表:

NameAlice
Salary50000
NameBob
SalaryNULL
NameCharlie
Salary60000
NameDavid
Salary40000

如果我們按照 Salary 升序排序:

SELECT EmployeeID, Name, Salary
FROM Employees
ORDER BY Salary ASC;

🔹 結果(不同資料庫可能行為不同):

NameBob
SalaryNULL
NameDavid
Salary40000
NameAlice
Salary50000
NameCharlie
Salary60000

💡 解決方法:強制 NULL 排在最後

SELECT EmployeeID, Name, Salary
FROM Employees
ORDER BY Salary ASC NULLS LAST;

在 MySQL 中,則可以使用 IS NULL 搭配 CASE 處理:

SELECT EmployeeID, Name, Salary
FROM Employees
ORDER BY (Salary IS NULL), Salary ASC;

ORDER BY 搭配 CASE 進行自訂排序

有時我們希望按照特定條件進行排序,例如:

  • VIP 客戶應該排在最前面
  • 特定類別的產品應該優先顯示

範例 6:讓 VIP 客戶排在最前面

SELECT CustomerID, Name, Membership
FROM Customers
ORDER BY 
    CASE 
        WHEN Membership = 'VIP' THEN 1
        WHEN Membership = 'Regular' THEN 2
        ELSE 3
    END;

📌 CASE 會將 VIP 客戶設為 1,讓它們排在最前面!


結語

  • ORDER BY 可用來對查詢結果進行升序(ASC)或降序(DESC)排序
  • 可以同時對多個欄位排序
  • 搭配 LIMIT 來獲取前 N 筆結果
  • 使用 NULLS LAST 來調整 NULL 的排序位置
  • 結合 CASE 來進行自訂排序

這些技巧能夠幫助你更靈活地管理 SQL 查詢結果,希望這篇文章能夠幫助你掌握 ORDER BY 的應用!🚀