Computer365120 views
中学英語808712 views
雑学1472593 views
小学理科717236 views
高校倫理1433119 views
りんご192546 views
LaTeX957300 views
いろは2986023 views
中学数学621382 views
世界の国560595 views
Help
Tools

English

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 件を取得します。ページネーション(ページ送り)でよく使われます。

ページLIMITOFFSET
1ページ目100
2ページ目1010
3ページ目1020

省略記法

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 のパフォーマンスには気をつけておきましょう。