LIMIT で取得件数を制限する
SELECT 文で取得する行数を制限するには LIMIT を使います。大量のデータがあるテーブルから一部だけ取得したいときに便利です。
基本構文
SELECT カラム名 FROM テーブル名 LIMIT 件数;たとえば users テーブルから最初の 10 件だけ取得するには、こう書きます。
SELECT * FROM users LIMIT 10;ORDER BY と組み合わせる
LIMIT は ORDER BY とセットで使うことが多いです。
-- 年齢が高い順に上位5人
SELECT * FROM users ORDER BY age DESC LIMIT 5;ORDER BY なしで LIMIT を使うと、どの行が返ってくるかは保証されません。意図した結果を得るには、ORDER BY で順序を決めてから LIMIT をかけるのが基本です。
OFFSET で開始位置をずらす
OFFSET を使うと、先頭から何件スキップするかを指定できます。
SELECT * FROM users LIMIT 10 OFFSET 20;この例では、21 件目から 30 件目までの 10 件を取得します。ページネーション(ページ送り)でよく使われます。
| ページ | LIMIT | OFFSET |
|---|---|---|
| 1ページ目 | 10 | 0 |
| 2ページ目 | 10 | 10 |
| 3ページ目 | 10 | 20 |
省略記法
OFFSET は LIMIT の後ろにカンマで書くこともできます。
-- LIMIT 件数 OFFSET スキップ数
SELECT * FROM users LIMIT 10 OFFSET 20;
-- LIMIT スキップ数, 件数(カンマ記法)
SELECT * FROM users LIMIT 20, 10;カンマ記法は順番が「スキップ数, 件数」なので、ちょっと紛らわしいです。OFFSET を明示するほうが読みやすいかもしれません。
大きな OFFSET の注意点
OFFSET が大きくなると、パフォーマンスが悪化することがあります。
-- 100万件目から10件取得(遅い可能性あり)
SELECT * FROM users LIMIT 10 OFFSET 1000000;MySQL は OFFSET の位置まで内部的にスキャンする必要があるためです。大量データのページネーションでは、WHERE で絞り込むなど別のアプローチを検討したほうがよい場合もあります。
小さな OFFSET
問題なく高速
大きな OFFSET
スキャン量が増えて遅くなる可能性
LIMIT はデータ量を絞り込むシンプルな方法ですが、ORDER BY との組み合わせと OFFSET のパフォーマンスには気をつけておきましょう。











