CodeGym /課程 /SQL SELF /多欄位排序:排序順序與優先權

多欄位排序:排序順序與優先權

SQL SELF
等級 6, 課堂 2
開放

想像一下,你現在在搞一個超大的學生資料庫。只用姓氏排序已經不錯了,但如果有一堆同姓的學生怎麼辦?這時候你就可以加上名字來排序,讓結果更清楚。再舉個例子:你想把訂單先依日期、再依總金額排序。這時候,多欄位排序就超好用啦~

多欄位排序可以讓你: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 裡欄位順序很重要:會先依第一個欄位排,再依第二個(如果第一個一樣)。

2
任務
SQL SELF, 等級 6, 課堂 2
上鎖
依年齡和名字排序學生
依年齡和名字排序學生
2
任務
SQL SELF, 等級 6, 課堂 2
上鎖
根據日期和客戶ID排序訂單
根據日期和客戶ID排序訂單
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION