MySQL LIMIT 用法与实例
本文介绍了在 MySQL 中如何使用 LIMIT
子句限定查询返回的行数。
在 MySQL 中,我们使用 LIMIT
子句来限定 SELECT
语句返回的行的数量。
MySQL LIMIT 语法
该 LIMIT
子句可用于限制 SELECT
语句返回的行数。 LIMIT
接受一个或两个非负数正数作为参数。 LIMIT
子句的语法如下:
LIMIT [offset,] row_count;
或者
LIMIT row_count OFFSET offset;
说明:
- 上述两种语法的结果是等效的,只是写法略有不同。
offset
指定要返回的第一行的偏移量。偏移量是相对于未使用LIMIT
语句时的原始结果集而言的。offset
可理解为在原始结果集的基础上跳过的行数。row_count
执行要返回的最大行数。offset
是可选的。当未指定offset
时,默认的值offset
为0
。LIMIT
一般位于SELECT
语句的最后。
例如:
-
LIMIT 5
最多返回 5 个记录行,等效于
LIMIT 0 5
-
LIMIT 2 5
在原始结果集中,跳过 2 个记录行,并从 第 3 个记录行开始,最多返回 5 个记录行。
LIMIT 和 ORDER BY 子句
在 SELECT
语句中, LIMIT
子句经常和 ORDER BY
子句结合使用。比如在下面的场景中:
- ERP 中显示销售额最高的 5 个销售员
- 网站上的点击率最高的 10 个文章
- 论坛中一个月内最活跃的 10 个会员
- 博客网站的文章分页列表
在这些场景中,我们都需要先按照某个规则排序,然后使用取出指定数量的记录行。
下面是一个结合了 LIMIT
子句和 ORDER BY
子句的 SQL 语句样例:
SELECT
select_expression, ...
FROM
table_name
ORDER BY
sort_expression, ...
LIMIT [offset,] row_count;
在此 SELECT
语句中, MySQL 会先按照 ORDER BY
指定的规则对排序结果集,再返回 LIMIT
子句指定的行数返回结果集。
MySQL LIMIT 实例
在以下实例中,我们使用 Sakila 示例数据库中的 film
表进行演示。
查询片长最长的 10 部影片
以下 SQL 语句返回 film
表中等级为 G 的片长最长的 10 部影片。
SELECT
film_id, title, length
FROM
film
WHERE
rating = 'G'
ORDER BY length DESC
LIMIT 10;
+---------+--------------------+--------+
| film_id | title | length |
+---------+--------------------+--------+
| 212 | DARN FORRESTER | 185 |
| 182 | CONTROL ANTHEM | 185 |
| 609 | MUSCLE BRIGHT | 185 |
| 597 | MOONWALKER FOOL | 184 |
| 128 | CATCH AMISTAD | 183 |
| 996 | YOUNG LANGUAGE | 183 |
| 50 | BAKED CLEOPATRA | 182 |
| 467 | INTRIGUE WORST | 181 |
| 510 | LAWLESS VISION | 181 |
| 612 | MUSSOLINI SPOILERS | 180 |
+---------+--------------------+--------+
查询片长最短的 10 部影片
以下 SQL 语句返回 film
表中等级为 G
的片长最短的 10 部影片。
SELECT
film_id, title, length
FROM
film
WHERE
rating = 'G'
ORDER BY length
LIMIT 10;
+---------+---------------------+--------+
| film_id | title | length |
+---------+---------------------+--------+
| 247 | DOWNHILL ENOUGH | 47 |
| 237 | DIVORCE SHINING | 47 |
| 2 | ACE GOLDFINGER | 48 |
| 575 | MIDSUMMER GROUNDHOG | 48 |
| 430 | HOOK CHARIOTS | 49 |
| 83 | BLUES INSTINCT | 50 |
| 292 | EXCITEMENT EVE | 51 |
| 402 | HARPER DYING | 52 |
| 794 | SIDE ARK | 52 |
| 542 | LUST LOCK | 52 |
+---------+---------------------+--------+
使用 LIMIT 子句进行分页
LIMIT 的一个很重要的应用就是分页查询。对于一些大型的数据表来说,分页查询能很好的减少数据库的消耗和提高用户体验。
film
表中共有 1000 行数据,这个我们可以通过以下的 COUNT(*)
查询得知。
mysql> SELECT COUNT(*) FROM film;
+----------+
| COUNT(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
如果没有分页查询,所有数据都显示在页面上,会引入以下的问题:
- 增加数据库的性能消耗
- 传输过程中的数据量增加
- 用户的体验不好,太多的数据对让用户眼花缭乱。
如果我们引入分页,每页显示 10 行数据,那么 1000 行数据需要 100 (1000 / 10
) 页就能显示完全。
查询第一个页只需限制最多行数为 10 行数据即可,整个 SQL 如下:
SELECT film_id, title FROM film LIMIT 10;
+---------+------------------+
| film_id | title |
+---------+------------------+
| 1 | ACADEMY DINOSAUR |
| 2 | ACE GOLDFINGER |
| 3 | ADAPTATION HOLES |
| 4 | AFFAIR PREJUDICE |
| 5 | AFRICAN EGG |
| 6 | AGENT TRUMAN |
| 7 | AIRPLANE SIERRA |
| 8 | AIRPORT POLLOCK |
| 9 | ALABAMA DEVIL |
| 10 | ALADDIN CALENDAR |
+---------+------------------+
要查询第二页需要先跳过第一页的 10 行数据并限制最多行数为 10 行数据,整个 SQL 如下:
SELECT film_id, title FROM film LIMIT 10, 10;
+---------+------------------+
| film_id | title |
+---------+------------------+
| 1 | ACADEMY DINOSAUR |
| 2 | ACE GOLDFINGER |
| 3 | ADAPTATION HOLES |
| 4 | AFFAIR PREJUDICE |
| 5 | AFRICAN EGG |
| 6 | AGENT TRUMAN |
| 7 | AIRPLANE SIERRA |
| 8 | AIRPORT POLLOCK |
| 9 | ALABAMA DEVIL |
| 10 | ALADDIN CALENDAR |
+---------+------------------+
同样,最后一页的 SQL 语句如下:
SELECT film_id, title FROM film LIMIT 990, 10;
结论
本文介绍了在 MySQL 中如何使用 LIMIT
子句限定查询返回的行数。 LIMIT
子句的用法要点如下:
LIMIT
子句限定查询返回的行数。LIMIT [offset,] row_count;
和LIMIT row_count OFFSET offset;
是等效的。offset
指定需要跳过的行数。当offset
为0
时,可以省略。row_count
指定返回的最大行数。当row_count
为0
时,返回结果集为空。LIMIT
子句经常用于分页查询。LIMIT
子句经常结合ORDER BY
查询排名列表。