Skip to main content

MySQL限制

MySQL限制条款简介

在SELECT语句中使用LIMIT子句来限制要返回的行数。LIMIT子句接受一个或两个参数。两个参数的值必须为零或正整数。

下面用两个参数说明了LIMIT子句语法:

SELECT 
select_list
FROM
table_name
LIMIT [offset,] row_count;

在这种语法中:

下图说明了限制条款:

当您使用带有一个参数的LIMIT子句时,MySQL将使用这个参数来确定从结果集的第一行返回的最大行数。

因此,这两个条款是等效的:

LIMIT row_count;

LIMIT 0 , row_count;

除了上述语法之外,MySQL还提供了以下可选的LIMIT子句语法:

LIMIT row_count OFFSET offset

限制和顺序条款

默认情况下,SELECT语句以未指定的顺序返回行。在SELECT语句中添加LIMIT子句时,返回的行是不可预测的。

因此,为了确保LIMIT子句返回预期的输出,您应该始终将其与ORDER BY子句一起使用,如下所示:

SELECT 
select_list
FROM
table_name
ORDER BY
sort_expression
LIMIT offset, row_count;

下图说明了SELECT语句中LIMIT子句的求值顺序:

MySQL限制子句示例

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

1) 使用MySQL LIMIT获取最高或最低行

本声明使用限制条款获得信用最高的前五名客户:

SELECT 
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit DESC
LIMIT 5;

mysql limit get highest values

在本例中:

类似地,本例使用LIMIT子句查找五位信用最低的客户:

SELECT 
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY creditLimit
LIMIT 5;

mysql limit get lowest values

在本例中:

因为有5个以上的客户信用为零,所以上面的查询结果可能会导致不一致的结果。

要解决此问题,需要在ORDER BY子句中添加更多列,以按唯一顺序约束行:

SELECT 
customerNumber,
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit,
customerNumber
LIMIT 5;

2) 使用MySQL LIMIT子句进行分页

在屏幕上显示数据时,通常需要将行划分为多个页面,每个页面包含的行数有限,比如10或20行。

要计算页数,可以将总行数除以每页的行数。要获取特定页面的行,可以使用LIMIT子句。

此查询使用COUNT(*)aggregate函数从customers表中获取总行数:

SELECT 
COUNT(*)
FROM
customers;
+----------+
| COUNT(*) |
+----------+
| 122 |
+----------+
1 row in set (0.00 sec)

假设每页有10行;要显示122位客户,您需要13页。最后13页只包含两行。

此查询使用LIMIT子句获取第1页的行,其中包含按客户名称排序的前10个客户:

SELECT 
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10;

MySQL LIMIT for pagination example

此查询使用LIMIT子句获取第二页中包含第11–20行的行:

SELECT 
customerNumber,
customerName
FROM
customers
ORDER BY customerName
LIMIT 10, 10;

在本例中,子句LIMIT 10,10为第11–20行返回10行。

3) 使用MySQL LIMIT获取第n个最高或最低值

要获得第n个最高或最低值,请使用以下限制子句:

SELECT select_list
FROM table_name
ORDER BY sort_expression
LIMIT n-1, 1;

子句LIMIT n-1,1返回从第n行开始的1行。

例如,以下内容将查找信用等级第二高的客户:

SELECT 
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC
LIMIT 1,1;

MySQL LIMIT find nth highest row example

让我们再检查一下结果。此查询返回按信用从高到低排序的所有客户:

SELECT 
customerName,
creditLimit
FROM
customers
ORDER BY
creditLimit DESC;

从输出中可以清楚地看到,结果与预期一样正确。

请注意,当没有两个客户拥有相同的信用额度时,这种技术就起作用了。为了得到更准确的结果,应该使用稠密的_RANK()窗口函数。

MySQL限制和独立子句

如果将LIMIT子句与DISTINCT子句一起使用,MySQL在找到LIMIT子句中指定的唯一行数时会立即停止搜索。

该示例使用带有DISTINCT子句的LIMIT子句返回customers表中的前五个唯一状态:

SELECT DISTINCT
state
FROM
customers
WHERE
state IS NOT NULL
LIMIT 5;

MySQL DISTINCT with LIMIT clause

总结