MySQL LIMIT

摘要在本教程中,您将学习如何使用 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 offsetCode 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)

试试看

mysql limit get highest values

在这个例子中:

  • 首先, ORDER BY子句按积分从高到低对客户进行排序。
  • 然后, LIMIT子句返回前 5 行。

同样,此示例使用LIMIT子句查找信用最低的五个客户:

SELECT 
    customerNumber, 
    customerName, 
    creditLimit
FROM
    customers
ORDER BY creditLimit
LIMIT 5;Code language: SQL (Structured Query Language) (sql)

试试看

mysql limit get lowest values

在这个例子中:

  • 首先, 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)

试试看

MySQL LIMIT 分页示例

此查询使用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)

试试看

MySQL LIMIT 查找第 n 个最高行示例

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

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 DISTINCT with LIMIT clause

概括

  • 使用 MySQL LIMIT子句来限制SELECT语句返回的行数。
本教程有帮助吗?