CodeGym /課程 /SQL SELF /資料排序 (ORDER BY):升冪與降冪排序 (ASC, DESC)

資料排序 (ORDER BY):升冪與降冪排序 (ASC, DESC)

SQL SELF
等級 2 , 課堂 3
開放

你在玩資料庫的時候,常常會想要讓資料有個順序。比如說:

  • 「給我看前 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 查詢的一半成功。繼續下一個主題吧!😉

2
任務
SQL SELF, 等級 2, 課堂 3
上鎖
依年齡升序排序
依年齡升序排序
2
任務
SQL SELF, 等級 2, 課堂 3
上鎖
依價格遞減排序
依價格遞減排序
1
問卷/小測驗
SQL入門,等級 2,課堂 3
未開放
SQL入門
SQL入門
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION