> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL の LIMIT

> LIMIT と OFFSET で MySQL の結果の一部だけを返す方法、この句の 2 つの形式、そして ORDER BY のない LIMIT が任意の行を返す理由。

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`LIMIT` はクエリが返す行数に上限を設けます。大きなテーブルの先頭を見るときに
使うものであり、結果をページ送りする仕組みの土台でもあります。

始める前に `mysql -u root -p sakila` でクライアントを開いてください。

## LIMIT の仕組み

```sql theme={null}
SELECT COLUMN_LIST
FROM TABLE_NAME
ORDER BY SORT_COLUMN
LIMIT ROW_COUNT OFFSET SKIP_COUNT;
```

`ROW_COUNT` を欲しい行数に、`SKIP_COUNT` を先に読み飛ばす行数に置き換えます。
`LIMIT` は `ORDER BY` の後、最後に置きます。`OFFSET` の部分は省略可能です。

## 例

### 最初の数行

```sql theme={null}
SELECT title FROM film ORDER BY title LIMIT 5;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
| ACE GOLDFINGER   |
| ADAPTATION HOLES |
| AFFAIR PREJUDICE |
| AFRICAN EGG      |
+------------------+
5 rows in set (0.00 sec)
```

結果全体が 5 行なので、末尾の罫線と件数は切り詰めではなく本当の終わりです。

### 先にいくつか読み飛ばす

```sql theme={null}
SELECT title FROM film ORDER BY title LIMIT 5 OFFSET 10;
```

```text theme={null}
+-----------------+
| title           |
+-----------------+
| ALAMO VIDEOTAPE |
| ALASKA PHANTOM  |
| ALI FOREVER     |
| ALICE FANTASIA  |
| ALIEN CENTER    |
+-----------------+
5 rows in set (0.00 sec)
```

ソートされたリストの 11 行目から 15 行目です。

### 数値 2 つの形式

MySQL はオフセットと件数を、オフセットを先にしたカンマ区切りの組としても
受け付けます。意味はまったく同じです。

```sql theme={null}
SELECT title FROM film ORDER BY title LIMIT 10, 5;
```

```text theme={null}
+-----------------+
| title           |
+-----------------+
| ALAMO VIDEOTAPE |
| ALASKA PHANTOM  |
| ALI FOREVER     |
| ALICE FANTASIA  |
| ALIEN CENTER    |
+-----------------+
5 rows in set (0.00 sec)
```

例 2 と同じ 5 タイトルです。2 つの数値は 2 つの形式の間で逆の順序に
なり、これが 1 つずれの混乱の確実な原因になるので、このチュートリアルでは
`LIMIT ROW_COUNT OFFSET SKIP_COUNT` と書きます。

## ORDER BY のない LIMIT は任意の行を求める

`ORDER BY` を外してもクエリは実行されます。

```sql theme={null}
SELECT title FROM film LIMIT 5;
```

```text theme={null}
+------------------+
| title            |
+------------------+
| ACADEMY DINOSAUR |
| ACE GOLDFINGER   |
| ADAPTATION HOLES |
| AFFAIR PREJUDICE |
| AFRICAN EGG      |
+------------------+
5 rows in set (0.00 sec)
```

これはソートしたクエリが返したのと同じ 5 タイトルであり、それがこれを
危険にしています。文の中の何も、その順序を求めていません。サーバーにクエリを
どう実行したかを尋ねると、なぜその順で返ってきたかを教えてくれます。

```sql theme={null}
EXPLAIN SELECT title FROM film LIMIT 5;
```

```text theme={null}
+----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key       | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | film  | NULL       | index | NULL          | idx_title | 514     | NULL | 1000 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
```

この `1 warning` は追いかけるべきものではありません。`EXPLAIN` と
`EXPLAIN FORMAT=JSON` は `Note 1003` を付けます。これはオプティマイザが
書き換えた後のクエリを保持しており、`SHOW WARNINGS` がそれを表示します。

`key` 列には `idx_title` とあります。これは `title` のインデックスで、既に
その列をソートされた順に保持しているので、インデックスを読むのが最も安く
答える方法です。行がソートされて届いたのは、その選択の副作用です。その
インデックスを削除する、選択リストに別の列を加える、サーバーにもっと多くの
データを与える、のいずれかをすれば、クエリを何も変えなくてもその選択は変わり
えます。

`LIMIT` は、`ORDER BY` がどの行かを指定しない限り「任意の行」を意味します。

## まとめ

* 返ってくる行数に上限を設けるには `LIMIT` を使います。
* 行を取る前に読み飛ばすには `OFFSET` を加えます。
* カンマ形式は数値の順序が逆になるので、`LIMIT ROW_COUNT OFFSET SKIP_COUNT` のほうを選びます。
* `LIMIT` には毎回 `ORDER BY` を組み合わせてください。さもなければ任意の行を求めたことになります。

## 関連項目

* [ORDER BY](https://villagesql.com/docs/ja/tutorial/order-by.md) — LIMIT がどの行を取るかを決める
* [MySQL のページネーション](https://villagesql.com/docs/ja/guides/pagination.md) — OFFSET が遅くなる理由と、代わりに使うもの
* [MySQL の EXPLAIN の読み方](https://villagesql.com/docs/ja/guides/reading-explain.md) — そのプラン行の残りの意味


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.