MySQL LIMIT子句
简介:在本教程中,您将学习如何使用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语句返回的行数。