SQL Limit子句


本教學我們將演示如何使用SQL LIMIT子句來限制SELECT語句返回的行數。

1. SQL LIMIT子句簡介

要檢索查詢返回的行的一部分,請使用LIMITOFFSET子句。 以下說明了這些子句的語法:

SELECT 
    column_list
FROM
    table1
ORDER BY column_list
LIMIT row_count OFFSET offset;

在這個語法中,

  • row_count確定將返回的行數。
  • OFFSET子句在開始返回行之前跳過偏移行。 OFFSET子句是可選的。 如果同時使用LIMITOFFSET子句,OFFSET會在LIMIT約束行數之前先跳過偏移行。

在使用LIMIT子句時,使用ORDER BY子句確保返回的行按指定順序非常重要。

並非所有資料庫系統都支援LIMIT子句,因此,LIMIT子句僅在某些資料庫系統中可用,例如MySQLPostgreSQLSQLite,Sybase SQL Anywhere和HSQLDB。

1. SQL LIMIT子句範例

我們將使用範例資料庫中的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

要跳過兩行並獲取接下來的五行,請使用LIMITOFFSET子句,如以下語句所示。

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;

2. 使用SQL LIMIT獲取具有最高或最低值的前N行

可以使用LIMIT子句獲取具有最高或最低值的前N行。 例如,以下宣告獲得薪資最高的前五名員工。

SELECT 
    employee_id, first_name, last_name, salary
FROM
    employees
ORDER BY salary DESC
LIMIT 5;

執行上面範例程式碼,得到以下結果 -

首先,ORDER BY子句按工資按降序對員工進行排序,然後LIMIT子句限制從查詢返回的五行。

為了獲得薪資最低的前五名員工,可以按升序對員工進行排序。

3. 獲取具有第N個最高值的行

假設必須得到公司薪水第二高的員工。請使用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 LIMITOFFSET子句,這些子句用於限制查詢返回的行數。