摘要:在本教程中,您将学习如何使用 MySQL LIMIT
子句来限制查询返回的行数。
MySQL LIMIT简介
条款
LIMIT
子句在SELECT
语句中使用来限制要返回的行数。 LIMIT
子句接受一个或两个参数。两个参数的值必须为零或正整数。
下面说明了带有两个参数的LIMIT
子句语法:
SELECT
select_list
FROM
table_name
LIMIT [offset,] row_count;
Code language: SQL (Structured Query Language) (sql)
在这个语法中:
offset
指定要返回的第一行的偏移量。第一行的offset
是 0,而不是 1。-
row_count
指定要返回的最大行数。
下图说明了LIMIT
子句:

当您使用带有一个参数的LIMIT
子句时,MySQL 将使用该参数来确定从结果集的第一行返回的最大行数。
因此,这两个子句是等价的:
LIMIT row_count;
Code language: SQL (Structured Query Language) (sql)
和
LIMIT 0 , row_count;
除了上述语法之外,MySQL 还提供以下替代LIMIT
子句语法:
LIMIT row_count OFFSET offset
Code language: SQL (Structured Query Language) (sql)
LIMIT 和 ORDER BY 子句
默认情况下, SELECT
语句以未指定的顺序返回行。当您将LIMIT
子句添加到SELECT
语句时,返回的行是不可预测的。
因此,为了确保LIMIT
子句返回预期的输出,您应该始终将其与ORDER BY
子句一起使用,如下所示:
SELECT
select_list
FROM
table_name
ORDER BY
sort_expression
LIMIT offset, row_count;
Code language: SQL (Structured Query Language) (sql)
下图说明了SELECT
语句中LIMIT
子句的计算顺序:

MySQL LIMIT 子句示例
我们将使用示例数据库中的customers
表进行演示。

1)使用MySQL LIMIT获取最高或最低行
该语句使用LIMIT
子句来获取信用最高的前 5 位客户:
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit DESC
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)

在这个例子中:
- 首先,
ORDER BY
子句按积分从高到低对客户进行排序。 - 然后,
LIMIT
子句返回前 5 行。
同样,此示例使用LIMIT
子句查找信用最低的五个客户:
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)

在这个例子中:
- 首先,
ORDER BY
子句按积分从低到高对客户进行排序。 - 然后,
LIMIT
子句返回前 5 行。
由于积分为零的客户数量超过5个,因此上述查询结果可能会导致结果不一致。
要解决此问题,您需要向ORDER BY
子句添加更多列以按唯一顺序约束行:
SELECT
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit,
customerNumber
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)

2)使用MySQL LIMIT子句进行分页
当您在屏幕上显示数据时,您通常希望将行分成页面,其中每个页面包含有限数量的行,例如 10 或 20。
要计算页数,请将总行数除以每页的行数。要获取特定页的行,可以使用LIMIT
子句。
此查询使用COUNT(*)
聚合函数从customers
表中获取总行数:
SELECT
COUNT(*)
FROM
customers;
Code language: SQL (Structured Query Language) (sql)
+----------+
| COUNT(*) |
+----------+
| 122 |
+----------+
1 row in set (0.00 sec)
Code language: JavaScript (javascript)
假设每页有10行;要显示 122 个客户,您需要 13 个页面。最后第 13 页仅包含两行。
此查询使用LIMIT
子句获取第 1 页的行,其中包含按客户名称排序的前 10 个客户:
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10;
Code language: SQL (Structured Query Language) (sql)

此查询使用LIMIT
子句获取第二页中包含第 11 – 20 行的行:
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10, 10;
Code language: SQL (Structured Query Language) (sql)

在此示例中,子句LIMIT 10, 10
返回第 11 – 20 行的 10 行。
3)使用MySQL LIMIT获取第n个最高或最低值
要获取第 n个最高或最低值,请使用以下LIMIT
子句:
SELECT select_list
FROM table_name
ORDER BY sort_expression
LIMIT n-1, 1;
Code language: SQL (Structured Query Language) (sql)
子句LIMIT n-1, 1
返回从第n
行开始的1
行。
例如,以下命令查找信用第二高的客户:
SELECT
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC
LIMIT 1,1;
Code language: SQL (Structured Query Language) (sql)

让我们仔细检查一下结果。此查询返回按信用从高到低排序的所有客户:
SELECT
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC;
Code language: SQL (Structured Query Language) (sql)

从输出中可以清楚地看到,结果符合预期。
请注意,当没有两个客户具有相同的信用额度时,此技术才有效。为了获得更准确的结果,您应该使用DENSE_RANK()
窗口函数。
MySQL LIMIT 和 DISTINCT 子句
如果将LIMIT
子句与DISTINCT
子句一起使用,则当 MySQL 发现LIMIT
子句中指定的唯一行数时,它会立即停止搜索。
该示例使用LIMIT
子句和DISTINCT
子句返回customers
表中的前五个唯一状态:
SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)

概括
- 使用 MySQL
LIMIT
子句来限制SELECT
语句返回的行数。