ORDER BY 排序與 LIMIT 分頁
ORDER BY — 排序結果
比喻:ORDER BY 就像整理書架 📚
你從圖書館找到了一堆書(查詢結果), 但它們亂七八糟的——ORDER BY 幫你按作者、書名或出版日期排好。
升冪排序(預設)
SELECT Name, Age
FROM Students
ORDER BY Age; -- ← 按年齡從小到大排
逐行解析:
SELECT Name, Age -- 要看名字和年齡
FROM Students -- 從學生表
ORDER BY Age; -- 按 Age 排序,預設是 ASC(升冪 = 小到大)
結果:
Name | Age
------+-----
小明 | 20
小美 | 21
小華 | 22
降冪排序(DESC)
SELECT Name, Age
FROM Students
ORDER BY Age DESC; -- ← DESC = Descending = 從大到小
Name | Age
------+-----
小華 | 22 ← 最大的在最上面
小美 | 21
小明 | 20
多欄排序
SELECT Name, Age, Score
FROM Students
ORDER BY Age ASC, -- ← 先按年齡升冪
Score DESC; -- ← 年齡相同時,按分數降冪
逐行解析:
ORDER BY Age ASC -- 第一排序條件:年齡小到大
Score DESC -- 第二排序條件:同齡時分數高到低
-- 就像先按姓氏排,再按名字排
LIMIT — 只取前 N 筆
-- PostgreSQL / MySQL
SELECT * FROM Students
ORDER BY Age
LIMIT 5; -- ← 只取前 5 筆
-- SQL Server
SELECT TOP 5 * FROM Students
ORDER BY Age; -- ← SQL Server 用 TOP 而不是 LIMIT
逐行解析:
SELECT * FROM Students -- 查所有學生
ORDER BY Age -- 按年齡排序
LIMIT 5; -- 但只回傳前 5 筆
-- 常用於「排行榜前 10 名」等場景
OFFSET — 跳過前 N 筆(分頁)
-- 第 1 頁(每頁 10 筆)
SELECT * FROM Students
ORDER BY Id
LIMIT 10 OFFSET 0; -- ← 跳過 0 筆,取 10 筆
-- 第 2 頁
SELECT * FROM Students
ORDER BY Id
LIMIT 10 OFFSET 10; -- ← 跳過前 10 筆,取接下來 10 筆
-- 第 3 頁
SELECT * FROM Students
ORDER BY Id
LIMIT 10 OFFSET 20; -- ← 跳過前 20 筆
逐行解析:
LIMIT 10 OFFSET 10 -- LIMIT = 一次取幾筆(每頁筆數)
-- OFFSET = 跳過幾筆(前面的頁數 × 每頁筆數)
-- 公式:OFFSET = (頁碼 - 1) × 每頁筆數
實用範例
-- 找出年紀最大的 3 位學生
SELECT Name, Age
FROM Students
ORDER BY Age DESC -- 年齡由大到小
LIMIT 3; -- 只取前 3 筆
-- 找出分數最高的學生(只要第 1 名)
SELECT Name, Score
FROM Students
ORDER BY Score DESC
LIMIT 1; -- 只取冠軍
-- 找出第 2~4 名(跳過第 1 名)
SELECT Name, Score
FROM Students
ORDER BY Score DESC
LIMIT 3 OFFSET 1; -- 跳過 1 筆,取 3 筆
小結
| 語法 | 用途 |
|---|---|
ORDER BY col |
升冪排序(小到大) |
ORDER BY col DESC |
降冪排序(大到小) |
ORDER BY col1, col2 |
多欄排序 |
LIMIT n |
只取前 n 筆 |
OFFSET n |
跳過前 n 筆 |
LIMIT + OFFSET |
分頁查詢 |