iT邦幫忙

2023 iThome 鐵人賽

0

如果資料表中有許多資料,則我們無法很快找到某個欄位值的最高或最低幾筆。此外,當我們只需要排序結果中的前幾筆資料,那麼將資料通通查詢回來,是耗費效能的舉動,也會佔用不少記憶體。

本文將說明如何針對查詢結果,進行排序與分頁。

此篇亦轉載到個人部落格


一、測試資料

首先認識一下員工資料表的設計。

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)


今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教/images/emoticon/emoticon41.gif


上一篇
【MySQL】資料的增刪改查與條件撰寫
下一篇
【MySQL】在資料表之間做關聯查詢與外鍵約束
系列文
救救我啊我救我!CRUD 工程師的惡補日記50
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言