本教學我們將演示如何使用SQL LIMIT
子句來限制SELECT
語句返回的行數。
要檢索查詢返回的行的一部分,請使用LIMIT
和OFFSET
子句。 以下說明了這些子句的語法:
SELECT
column_list
FROM
table1
ORDER BY column_list
LIMIT row_count OFFSET offset;
在這個語法中,
row_count
確定將返回的行數。OFFSET
子句在開始返回行之前跳過偏移行。 OFFSET
子句是可選的。 如果同時使用LIMIT
和OFFSET
子句,OFFSET
會在LIMIT
約束行數之前先跳過偏移行。在使用LIMIT
子句時,使用ORDER BY
子句確保返回的行按指定順序非常重要。
並非所有資料庫系統都支援LIMIT
子句,因此,LIMIT
子句僅在某些資料庫系統中可用,例如MySQL,PostgreSQL,SQLite,Sybase SQL Anywhere和HSQLDB。
我們將使用範例資料庫中的employees
表來演示LIMIT
子句用法。
以下語句返回employees
表中按first_name
列排序的所有行。
SELECT
employee_id, first_name, last_name
FROM
employees
ORDER BY first_name;
執行上面查詢語句,得到以下結果 -
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 103 | Alexander | Lee |
| 115 | Alexander | Su |
| 114 | Avg | Su |
| 193 | Britney | Zhao |
| 104 | Bruce | Wong |
... ...
| 100 | Steven | Lee |
| 203 | Susan | Zhou |
| 106 | Valli | Chen |
| 206 | William | Wu |
+-------------+------------+-----------+
40 rows in set
如果要只返回前5
行,請使用LIMIT
子句,如以下語句。
SELECT
employee_id, first_name, last_name
FROM
employees
ORDER BY first_name
LIMIT 5;
執行上面查詢語句,得到以下結果 -
+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
| 115 | Alexander | Su |
| 103 | Alexander | Lee |
| 114 | Avg | Su |
| 193 | Britney | Zhao |
| 104 | Bruce | Wong |
+-------------+------------+-----------+
5 rows in set
要跳過兩行並獲取接下來的五行,請使用LIMIT
和OFFSET
子句,如以下語句所示。
SELECT
employee_id, first_name, last_name
FROM
employees
ORDER BY first_name
LIMIT 5 OFFSET 3;
結果如下圖所示 -
如果使用的是MySQL,則可以使用LIMIT OFFSET
子句的較短形式。
SELECT
employee_id, first_name, last_name
FROM
employees
ORDER BY first_name
LIMIT 3 , 5;
可以使用LIMIT
子句獲取具有最高或最低值的前N行。 例如,以下宣告獲得薪資最高的前五名員工。
SELECT
employee_id, first_name, last_name, salary
FROM
employees
ORDER BY salary DESC
LIMIT 5;
執行上面範例程式碼,得到以下結果 -
首先,ORDER BY子句按工資按降序對員工進行排序,然後LIMIT
子句限制從查詢返回的五行。
為了獲得薪資最低的前五名員工,可以按升序對員工進行排序。
假設必須得到公司薪水第二高的員工。請使用LIMIT OFFSET
子句,如下所示。
SELECT
employee_id, first_name, last_name, salary
FROM
employees
ORDER BY salary DESC
LIMIT 1 OFFSET 1;
ORDER BY
子句按工資降序對員工進行排序。 LIMIT 1 OFFSET 1
子句從結果集中獲取第二行。
此查詢的假設是每個員工都有不同的薪水。 如果有兩名員工擁有相同的最高薪水,那麼它將會失敗。 此外,如果有兩個或更多具有相同第二高薪的員工,則查詢只返回第一個。
要解決此問題,可以使用以下語句首先獲得第二高薪。
SELECT DISTINCT
salary
FROM
employees
ORDER BY salary DESC
LIMIT 1 , 1;
執行上面範例程式碼,得到以下結果 -
mysql> SELECT DISTINCT
salary
FROM
employees
ORDER BY salary DESC
LIMIT 1 , 1;
+--------+
| salary |
+--------+
| 17000 |
+--------+
1 row in set
並將結果傳遞給另一個查詢:
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
salary = 17000;
結果如下所示 -
如果使用子查詢,則可以將兩個查詢組合到單個查詢中,如下所示:
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
salary = (SELECT DISTINCT
salary
FROM
employees
ORDER BY salary DESC
LIMIT 1 , 1);
結果如下所示 -
在本教學中,我們向您介紹了SQL LIMIT
和OFFSET
子句,這些子句用於限制查詢返回的行數。