想像一下,你現在在搞一個超大的學生資料庫。只用姓氏排序已經不錯了,但如果有一堆同姓的學生怎麼辦?這時候你就可以加上名字來排序,讓結果更清楚。再舉個例子:你想把訂單先依日期、再依總金額排序。這時候,多欄位排序就超好用啦~
多欄位排序可以讓你:1. 用明確的順序整理資料;2. 控制排序優先權(先依一個欄位,再依另一個);3. 讓資料顯示更有條理、更好找。
多欄位排序語法
要依多個欄位排序,就用你熟的 ORDER BY,但這次可以用逗號列出好幾個欄位。PostgreSQL 會先依第一個欄位排,如果一樣再看第二個,以此類推。
語法長這樣:
SELECT 欄位們
FROM 資料表
ORDER BY 欄位1 排序1, 欄位2 排序2, ... ;
說明:
欄位1、欄位2... 就是你想排序的欄位。排序1、排序2... 是排序方向(ASC升冪、DESC降冪)。- 這個參數可以不用寫,預設就是
ASC。
範例 1:學生先依姓氏、再依名字排序
假設有個 students 表,裡面有學生資料:
| id | first_name | last_name | age |
|---|---|---|---|
| 1 | Anna | Lin | 20 |
| 2 | Victor | Lin | 22 |
| 3 | Maria | Kim | 21 |
| 4 | Otto | Lin | 23 |
| 5 | Anna | Kim | 20 |
我們的目標是先依姓氏 (last_name),再依名字 (first_name) 排序。
SELECT id, first_name, last_name, age
FROM students
ORDER BY last_name ASC, first_name ASC;
結果:
| id | first_name | last_name | age |
|---|---|---|---|
| 5 | Anna | Kim | 20 |
| 3 | Maria | Kim | 21 |
| 1 | Anna | Lin | 20 |
| 4 | Otto | Lin | 23 |
| 2 | Victor | Lin | 22 |
你看,資料先依姓氏(Kim、再來 Lin)排好,再依名字(Anna、Maria 等等)。這超方便,找人或排名冊都很好用。
範例 2:訂單依日期、金額排序
假設有個 orders 表,裡面有訂單資料:
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 1 | 101 | 2025-10-01 | 500 |
| 2 | 102 | 2025-10-03 | 200 |
| 3 | 103 | 2025-10-02 | 300 |
| 4 | 104 | 2025-10-01 | 100 |
| 5 | 101 | 2025-10-03 | 600 |
我們想要先依 order_date 排,再依 total 金額降冪排序。
SQL 查詢:
SELECT order_id, customer_id, order_date, total
FROM orders
ORDER BY order_date ASC, total DESC;
結果:
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 1 | 101 | 2025-10-01 | 500 |
| 4 | 104 | 2025-10-01 | 100 |
| 3 | 103 | 2025-10-02 | 300 |
| 5 | 101 | 2025-10-03 | 600 |
| 2 | 102 | 2025-10-03 | 200 |
你看,同一天的訂單也會依金額排序。
排序時處理 NULL:NULLS FIRST 跟 NULLS LAST
SQL 裡有個特別的值叫 NULL,意思是「沒有值」。詳細怎麼用我們之後會講,不過現在先來看排序時怎麼處理它。
當你排序有 NULL 的欄位時,PostgreSQL 會決定 要把空值放前面還是後面。
預設情況:
ORDER BY ... ASC:NULL會 排在最後(NULLS LAST)ORDER BY ... DESC:NULL會 排在最前面(NULLS FIRST)
有時這樣不方便,你可以用 NULLS FIRST 或 NULLS LAST 來自己決定。
語法:
ORDER BY 欄位 ASC NULLS FIRST
ORDER BY 欄位 DESC NULLS LAST
範例:依成績排序,NULL 代表「還沒打分數」
SELECT student_id, grade
FROM grades
ORDER BY grade DESC NULLS LAST;
這樣你會先看到分數高的,再來低的,最後才是還沒分數(NULL)的學生。
範例:反過來,先顯示沒分數的學生
假設 grades 表裡有些學生還沒拿到分數(NULL):
| student_id | grade |
|---|---|
| 101 | NULL |
| 102 | 85 |
| 103 | NULL |
| 104 | 92 |
| 105 | 76 |
我們想要先顯示 沒分數 的學生,再依分數升冪排其他人。
SELECT student_id, grade
FROM grades
ORDER BY grade ASC NULLS FIRST;
結果:
| student_id | grade |
|---|---|
| 101 | NULL |
| 103 | NULL |
| 105 | 76 |
| 102 | 85 |
| 104 | 92 |
NULLS FIRST 搭配 ORDER BY grade ASC,就能保證 NULL 會在最前面,後面才是有分數的學生。
一些小細節跟常見錯誤
新手常常忘記每個欄位都可以指定排序方向。如果你沒寫,PostgreSQL 會預設用 ASC。還有,ORDER BY 裡欄位順序很重要:會先依第一個欄位排,再依第二個(如果第一個一樣)。
GO TO FULL VERSION