有人說第二名是第一個失敗者。那麼,誰需要一個 SQL 陳述式來找出誰在成功者之下?令人驚訝的是有很多人。實際上,此類查詢的正式術語是「欄的第 n 個最高的值」。這是因為用於選取第二高值的技術也可以套用於任何值。在今天的文章中,我們將學習如何將 ORDER BY DESC 和 LIMIT 子句結合使用,以從資料表中取得第二高的值以及其他值。
傳統模型資料庫簡介
classicmodels 資料庫是一個 MySQL 範例資料庫,可幫助你快速有效地學習 SQL。classicmodels 資料庫代表傳統汽車擴展模型的零售商。它包含一般業務資料,例如客戶、產品、銷售訂單、銷售訂單明細項目等。
以下是 Navicat Premium 中 payments 資料表的內容:

我們將組成一個從該資料表中選取第二高付款的查詢。
關於 LIMIT 陳述式
LIMIT 子句可以加入 SELECT 陳述式中,以限制傳返的列數。LIMIT 子句可以接受一個或兩零或正整數的參數。
以下是語法:
SELECT select_list FROM table_name LIMIT [offset,] row_count;
- offset 指定要傳回的第一列的位移。第一列的位移是 0,而不是 1。
- row_count 指定要傳回的最大列數目。
選取第二高的付款
知道了關於 LIMIT 子句的知識之後,我們現在可以構造以下的 SELECT 陳述式以取得第二高的值:
SELECT * FROM yourTableName ORDER BY DESC yourColumnName LIMIT 1,1;
這是從 payments 資料表中選取第二高 amount 的對應陳述式:

驗證結果
在 Navicat 中,我們可以將滑鼠指標停留在欄標題上然後按一下內容功能表箭頭來根據任何欄排序資料表或檢視。然後,我們可以從清單中選擇排序順序:

如果我們參考下圖中已突顯的列,就可以確認結果是正確的。

選取第 N 個最高的付款
我們可以使用相同的陳述式取得其他金額。例如,你可以使用以下陳述式傳回欄的第四高值:
SELECT * FROM yourTableName ORDER BY DESC yourColumnName LIMIT 3,1;
實際上,我們可以將這種陳述式用於任何排名:
SELECT * FROM yourTableName ORDER BY DESC yourColumnName LIMIT desiredRank - 1, 1;
這是取得第十高付款金額的查詢:

總結
在今天的文章中,我們學習了如何結合使用 ORDER BY DESC 和 LIMIT 子句從資料表中取得第 N 個最高值。在下一篇文章中,我們將使用 TOP 陳述式完成相同的工作。
如果你對 Navicat Premium 感興趣,可以免費試用 14 天!