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 时,默认的值 offset0
  • 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 指定需要跳过的行数。当 offset0 时,可以省略。
  • row_count 指定返回的最大行数。当 row_count0 时,返回结果集为空。
  • LIMIT 子句经常用于分页查询。
  • LIMIT 子句经常结合 ORDER BY 查询排名列表。