你在玩資料庫的時候,常常會想要讓資料有個順序。比如說:
- 「給我看前 10 個最貴的產品。」
- 「哪些訂單是最新的?」
- 「學生年齡從最小開始排?」
想要把資料排好很正常啦:就算你是超強工程師,面對一堆亂七八糟的資料也會很煩。所以 SQL 給我們一個工具,讓你可以把查詢結果的資料列排好順序——就是 ORDER BY 這個操作。
用 ORDER BY 排序的基本功
ORDER BY 就像魔法棒一樣,讓你可以決定查詢結果的資料列順序。如果你沒用它,資料會用「隨機」順序回來(這不是資料庫壞掉,只是沒保證順序而已)。
來看一下 ORDER BY 的語法:
SELECT 欄位1, 欄位2
FROM 資料表
ORDER BY 欄位1 DESC;
欄位1:你想要排序的欄位名稱。ASC:升冪排序(這是預設值,可以不用寫)。DESC:降冪排序。
範例
假設我們有一個 students 資料表:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
我們來把學生依年齡升冪排序:
SELECT name, age
FROM students
ORDER BY age ASC;
結果:
| name | age |
|---|---|
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
如果把排序方向改成降冪:
SELECT name, age
FROM students
ORDER BY age DESC;
結果會變這樣:
| name | age |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
多欄位排序
有時候只用一個欄位排序不夠。想像一下,如果有好幾個學生年齡一樣,你可能還想再根據名字來排一下。
多欄位排序這樣寫:
SELECT 欄位1, 欄位2
FROM 資料表
ORDER BY 欄位1 DESC, 欄位2 ASC;
來看這個例子:
| id | name | age |
|---|---|---|
| 1 | Alex | 22 |
| 2 | Maria | 19 |
| 3 | Otto | 21 |
| 4 | Anna | 19 |
查詢:
SELECT name, age
FROM students
ORDER BY age ASC, name ASC;
結果:
| name | age |
|---|---|
| Anna | 19 |
| Maria | 19 |
| Otto | 21 |
| Alex | 22 |
這裡先依年齡升冪排,然後同年齡的再依名字字母順序排。
用別名排序
如果你有用欄位別名(alias),也可以直接用別名來排序。
SELECT name AS "名字", age AS "年齡"
FROM students
ORDER BY "年齡" DESC;
結果:
| 名字 | 年齡 |
|---|---|
| Alex | 22 |
| Otto | 21 |
| Maria | 19 |
為什麼這很重要?因為以前不支援這樣寫,對計算欄位排序會很麻煩。
用計算欄位排序
SQL 允許你直接在查詢裡做計算,然後根據計算結果來排序。
範例 1. 超簡單計算
SELECT name, age, age * 2 AS doubled_age
FROM students
ORDER BY doubled_age DESC;
結果:
| name | age | doubled_age |
|---|---|---|
| Alex | 22 | 44 |
| Otto | 21 | 42 |
| Maria | 19 | 38 |
範例 2. 用函數 假設我們有一個 products 資料表,裡面存產品價格:
| product_name | price |
|---|---|
| 商品 A | 100 |
| 商品 B | 200 |
| 商品 C | 150 |
現在我們要根據打九折後的四捨五入價格來排序。ROUND 函數會把數字四捨五入到你要的小數位數。
SELECT product_name, price, ROUND(price * 0.9, 1) AS discounted_price
FROM products
ORDER BY discounted_price ASC;
結果會長這樣:
| product_name | price | discounted_price |
|---|---|---|
| 商品 A | 100 | 90 |
| 商品 C | 150 | 135 |
| 商品 B | 200 | 180 |
排序的實戰應用
排序在這些場景超重要:
- 做報表,比如每月前 10 名銷售排行。
- 給 UI 顯示資料,比如訂單列表要依日期排。
- 做分析用的清單,比如依優先級分群。
用 ORDER BY 會遇到的常見錯誤
錯誤隨時會出現,這裡有幾個要注意的點:
- 如果你想排序的欄位不存在,會報錯:
column "not_a_column" does not exist。 - 如果你用在計算欄位的別名排序,有時候會搞混,特別是別名在外層才定義。
- 如果你忘記寫排序方向,PostgreSQL 會預設用
ASC。這不是 bug,但有時候結果會跟你想的不一樣。
現在你已經知道怎麼用 ORDER BY 在 PostgreSQL 控制排序啦。記住,資料排好就是寫出高效 SQL 查詢的一半成功。繼續下一個主題吧!😉
GO TO FULL VERSION