メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
LIMIT はクエリが返す行数に上限を設けます。大きなテーブルの先頭を見るときに 使うものであり、結果をページ送りする仕組みの土台でもあります。 始める前に mysql -u root -p sakila でクライアントを開いてください。

LIMIT の仕組み

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

例

  1. 最初の数行

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

  1. 先にいくつか読み飛ばす

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

  1. 数値 2 つの形式

MySQL はオフセットと件数を、オフセットを先にしたカンマ区切りの組としても 受け付けます。意味はまったく同じです。
例 2 と同じ 5 タイトルです。2 つの数値は 2 つの形式の間で逆の順序に なり、これが 1 つずれの混乱の確実な原因になるので、このチュートリアルでは LIMIT ROW_COUNT OFFSET SKIP_COUNT と書きます。

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

ORDER BY を外してもクエリは実行されます。
これはソートしたクエリが返したのと同じ 5 タイトルであり、それがこれを 危険にしています。文の中の何も、その順序を求めていません。サーバーにクエリを どう実行したかを尋ねると、なぜその順で返ってきたかを教えてくれます。
この 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 を組み合わせてください。さもなければ任意の行を求めたことになります。

関連項目