MySQL LIMIT子句

时间:2019-11-20 08:52:04  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用MySQL LIMIT子句来约束查询返回的行数。

MySQL LIMIT子句简介

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

下面说明了带有两个参数的LIMIT子句语法:

SELECT 
    select_list
FROM
    table_name
LIMIT [offset,] row_count;

使用以下语法:

  • 偏移量指定要返回的第一行的偏移量。
    第一行的偏移量是0,而不是1。

  • row_count指定要返回的最大行数。

下图说明了LIMIT子句:

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

因此,这两个子句是等效的:

LIMIT row_count;

LIMIT 0 , row_count;

除上述语法外,MySQL还提供了以下替代LIMIT子句以与PostgreSQL兼容。

LIMIT row_count OFFSET offset

LIMIT和ORDER BY子句

不带ORDER BY子句的SELECT语句以未指定的顺序返回行。
这意味着行可以按任何顺序排列。
当您将LIMIT子句应用于此无序结果集时,您将不知道查询将返回哪些行。

例如,您可能想获得第五到第十行,但是以什么顺序获得第五到第十行?除非您指定ORDER BY子句,否则行的顺序是未知的。

因此,优良作法是始终将LIMIT子句与ORDER BY子句一起使用,以唯一的顺序约束结果行。

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

下图说明了SELECT语句中LIMIT子句的评估顺序:

MySQL LIMIT示例

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

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

该语句使用LIMIT子句来获得信用度最高的前五名客户:

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

在此示例中:

  • 首先,ORDER BY子句按信用等级从高到低对客户进行排序。

  • 然后,LIMIT子句返回前5行。

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

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

在此示例中:

  • 首先,ORDER BY子句按信用等级从低到高对客户进行排序。

  • 然后,LIMIT子句返回前5行。

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

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

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

2)使用MySQL LIMIT进行分页

在应用程序上显示数据时,通常需要将行划分为页面,其中每个页面包含一定数量的行,例如5、10或20。

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

此查询使用COUNT(*)聚合函数从客户表中获取总行数:

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;

此查询使用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个最大值或最小值,请使用以下LIMIT子句:

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;

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

SELECT 
    customerName, 
    creditLimit
FROM
    customers
ORDER BY 
    creditLimit DESC;

从输出中可以清楚地看到,结果是正确的。

请注意,当没有两个客户具有相同的信用额度时,此技术有效。
为了获得更准确的结果,您应该使用DENSE_RANK()窗口函数。

在本教程中,您学习了如何使用MySQL LIMIT子句来约束SELECT语句返回的行数。