如果資料表中有許多資料,則我們無法很快找到某個欄位值的最高或最低幾筆。此外,當我們只需要排序結果中的前幾筆資料,那麼將資料通通查詢回來,是耗費效能的舉動,也會佔用不少記憶體。
本文將說明如何針對查詢結果,進行排序與分頁。
此篇亦轉載到個人部落格。
首先認識一下員工資料表的設計。
CREATE TABLE `employee` (
`emp_id` INT AUTO_INCREMENT,
`name` NVARCHAR(50),
`on_board_date` DATE,
`salary` INT,
PRIMARY KEY(`emp_id`)
);
而以下是測試資料。
INSERT INTO `employee`(`name`, `on_board_date`, `salary`)
VALUES
("Vincent", "2018-01-01", 32000),
("Ivy", "2020-01-01", 38000),
("Roger", "2019-01-01", 41000),
("Dora", "2021-01-01", 38000);
以下指令是根據到職日遞增排序。
SELECT *
FROM `employee`
ORDER BY `on_board_date` ASC;
可使用 ORDER BY
語法來排序。而 ASC
代表遞增,遞減為 DESC
。若未提供排序方向,則預設為遞增。
以下指令是根據薪水遞減排序。
SELECT *
FROM `employee`
ORDER BY `salary` DESC;
我們也可透過多個欄位來排序。以下指令是先依據薪水遞減排序,薪水相同者,再依照名字遞增。
SELECT *
FROM `employee`
ORDER BY `salary` DESC, `name` ASC;
值得一提的是,依據文字欄位排序時,MySQL 是不分英文大小寫的。
資料經過排序後,便會有所謂的第 1 筆、第 2 筆、第 7 筆等順序。分頁就是幫助我們取得像第 1 ~ 5 筆、第 6 ~ 10 筆、第 13 ~ 15 筆這種不同區段的資料。
在程式開發的領域中,分頁有兩種操作方式。
第一種是「每頁有 m 筆,我要取第 n 頁」。假設全部有 23 筆資料,且我們事先規定每頁有 5 筆。那麼取第 1 頁會得到第 1 ~ 5 筆,取第 5 頁會得到第 21 ~ 23 筆。
第二種是「先跳過 m 筆,再取接下來的 n 筆」。MySQL 的語法是採用這種概念。
以下指令是取得薪水最高的 3 位員工。會使用 LIMIT
語法。
SELECT *
FROM `employee`
ORDER BY `salary` DESC
LIMIT 3;
以下指令是根據到職日遞增排序。定義每頁有 3 筆資料,當我們要取第 2 頁,那就是取第 4 ~ 6 筆。
SELECT *
FROM `employee`
ORDER BY `on_board_date` ASC
LIMIT 3, 3;
此處 LIMIT
的參數值有兩個,第一個是跳過的資料數量,第二個是取得的數量。
然而這樣的可讀性不太好,因此也能改用以下的寫法。
SELECT *
FROM `employee`
ORDER BY `on_board_date` ASC
LIMIT 3 OFFSET 3;
使用 OFFSET
語法,可以跳過前面幾筆資料,再用 LIMIT
取得接下來的幾筆。
前面筆者提到分頁有兩種操作方式,它們之間是可以換算的。
假設頁數叫做 page
、每頁的資料數量叫做 size
,則 offset = size * (page - 1)
。
今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教