在 SQL 查詢中,獲取資料後的顯示順序對於數據分析和報表生成至關重要。
例如:
- 你希望按照價格從高到低顯示產品列表 📊
- 你需要按照訂單時間排序來找出最近的交易 🛒
- 你想根據學生的成績從高到低排名 🏆
在這些情境中,SQL 提供了一個強大的關鍵字:ORDER BY。
它允許我們根據特定欄位對查詢結果進行排序,並支援升序(ASC) 和 降序(DESC)。
本篇文章將深入介紹 **SQL ORDER BY 的基本語法、進階用法,以及如何與 LIMIT、CASE、NULLS 等條件結合使用,讓你的查詢更具靈活性。🚀
ORDER BY 的基本語法
ORDER BY 用於對 SQL 查詢結果進行排序,基本語法如下:
SELECT column1, column2, ...
FROM table_name
ORDER BY column_name [ASC | DESC];
ASC(Ascending):升序(預設值),從小到大排序。DESC(Descending):降序,從大到小排序。
單一欄位排序
按價格升序排列
假設我們有一張 Products 表:
| ProductID | ProductName | Price |
|---|---|---|
| 1 | Laptop | 1200 |
| 2 | Mouse | 30 |
| 3 | Keyboard | 80 |
| 4 | Monitor | 300 |
如果我們想按照價格從低到高排序:
SELECT ProductID, ProductName, Price
FROM Products
ORDER BY Price ASC;
🔹 結果:
| ProductID | ProductName | Price |
|---|---|---|
| 2 | Mouse | 30 |
| 3 | Keyboard | 80 |
| 4 | Monitor | 300 |
| 1 | Laptop | 1200 |
💡 ASC 是 SQL 的預設排序方式,即使不寫 ASC,結果仍會從小到大排列。
按價格降序排列
如果我們想按照價格從高到低排序:
SELECT ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC;
🔹 結果:
| ProductID | ProductName | Price |
|---|---|---|
| 1 | Laptop | 1200 |
| 4 | Monitor | 300 |
| 3 | Keyboard | 80 |
| 2 | Mouse | 30 |
多欄位排序
有時,我們需要根據多個條件來排序,例如:
- 先按照類別(Category)升序
- 再按照價格(Price)降序
按類別與價格排序
假設我們有 Products 表:
| ProductID | ProductName | Category | Price |
|---|---|---|---|
| 1 | Laptop | Electronics | 1200 |
| 2 | Mouse | Accessories | 30 |
| 3 | Keyboard | Accessories | 80 |
| 4 | Monitor | Electronics | 300 |
我們想讓 Category 先升序排列,再讓 Price 依降序排列:
SELECT ProductID, ProductName, Category, Price
FROM Products
ORDER BY Category ASC, Price DESC;
🔹 結果:
| ProductID | ProductName | Category | Price |
|---|---|---|---|
| 3 | Keyboard | Accessories | 80 |
| 2 | Mouse | Accessories | 30 |
| 1 | Laptop | Electronics | 1200 |
| 4 | Monitor | Electronics | 300 |
💡 排序順序解釋:
- 先按照
Category升序(Accessories→Electronics)。 - 若
Category相同,則按照Price降序排列(80→30)。
ORDER BY 與 LIMIT 搭配
當數據量很大時,我們通常只需要取得前幾筆結果,可以使用 LIMIT 限制回傳的筆數。
查詢價格最高的 3 種產品
SELECT ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC
LIMIT 3;
🔹 結果:
| ProductID | ProductName | Price |
|---|---|---|
| 1 | Laptop | 1200 |
| 4 | Monitor | 300 |
| 3 | Keyboard | 80 |
📌 LIMIT 在 MySQL、PostgreSQL、SQLite 可用,SQL Server 則使用 TOP:
SELECT TOP 3 ProductID, ProductName, Price
FROM Products
ORDER BY Price DESC;
ORDER BY 與 NULL 值的處理
在 SQL 中,NULL 代表未知值,當我們排序時,NULL 可能會排在最前面或最後面(依不同資料庫而異)。
處理 NULL 值的排序
假設我們有 Employees 表:
| EmployeeID | Name | Salary |
|---|---|---|
| 1 | Alice | 50000 |
| 2 | Bob | NULL |
| 3 | Charlie | 60000 |
| 4 | David | 40000 |
如果我們按照 Salary 升序排序:
SELECT EmployeeID, Name, Salary
FROM Employees
ORDER BY Salary ASC;
🔹 結果(不同資料庫可能行為不同):
| EmployeeID | Name | Salary |
|---|---|---|
| 2 | Bob | NULL |
| 4 | David | 40000 |
| 1 | Alice | 50000 |
| 3 | Charlie | 60000 |
💡 解決方法:強制 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 的應用!🚀