【SQL】LIMIT句の書き方と使い方の基本
この記事では、SQLで取得するデータ件数を制限するLIMIT句の基本を解説します。先頭の数件だけを取得する簡単な使い方から、ORDER BY句と組み合わせたランキング作成、OFFSET句を使ったページ送り機能の実装方法まで、サンプルコードを交えて初心者にもわかりやすく学びます。
開発環境
- OS: Windows10
- DatabaseGUI: TablePlus
- MySQL: 8.0.42
LIMIT句とは
LIMIT句は、SELECT文で取得するデータの件数を制限するためのSQL句です。
データベースに保存されているデータが非常に多い場合、SELECT * FROM テーブル名; のように全てのデータを取得しようとすると、システムの動作が遅くなる原因となります。
LIMIT句を使うことで、取得する行数を指定できるため、大量のデータの中から必要な分だけを効率的に取得できます。
主な利用シーン
LIMIT句は、主に以下のような場面で役立ちます。
- データの中身を確認したいとき: テーブルにどのようなデータが入っているか、とりあえず先頭の数件だけを見て確認したい場合に使用します。
- ランキングを作成したいとき:
ORDER BY句でデータを並べ替えた後、上位10名やトップ5の商品だけを表示する、といった場合に使用します。 - ページネーションを実装するとき: Webサイトの検索結果や一覧画面で、1ページに20件ずつ表示するような「ページネーション機能」を実装する際に、表示するデータの範囲を指定するために使用します。
基本的な使い方
SELECT文の最後に LIMIT と取得したい件数を指定します。
1-- usersテーブルから、データを5件だけ取得します。 2SELECT * FROM users LIMIT 5;
ORDER BY句との組み合わせ
ORDER BY句と組み合わせることで、特定の順序で並べ替えた結果から、上位または下位のデータを取得できます。
1-- usersテーブルのデータをscoreが高い順(降順)に並べ替え、上位3件だけを取得します。 2SELECT * FROM users ORDER BY score DESC LIMIT 3;
OFFSETとの組み合わせ(表示開始位置の指定)
OFFSETを組み合わせることで、取得を開始する行の位置を指定できます。これは主にページネーション機能で使われます。「最初のN件を読み飛ばして、そこからM件取得する」という処理が可能です。
OFFSETで指定する数値は、何件目から始めるかではなく、「何件読み飛ばすか」を意味します(0から数え始めます)。
1-- usersテーブルの最初の10件を読み飛ばし、そこから5件取得します(11件目から15件目を取得)。 2-- Webページの「3ページ目」のような表示に使われます(1ページ5件表示の場合)。 3SELECT * FROM users LIMIT 5 OFFSET 10;
LIMIT句の基本構文
LIMIT句は、データベースから取得するデータの行数を制限するために使用します。例えば、大量のデータの中から最初の5件だけを取得したい、といった場合に使います。
ORDER BY句と組み合わせることで、特定の順序で並べ替えた後の上位N件のデータを取得できます。
1SELECT 2 カラム名, 3 カラム名, 4 ... 5FROM 6 テーブル名 7ORDER BY 8 カラム名 [ASC|DESC] 9LIMIT 10 表示件数;
-
SELECT カラム名, ... 取得したいデータの列を指定します。
-
FROM テーブル名 どのテーブルからデータを取得するかを指定します。
-
ORDER BY カラム名 [ASC|DESC] 取得するデータをどの列を基準に並べ替えるかを指定します。
ASCは昇順(小さい順)、DESCは降順(大きい順)です。この句はLIMIT句の前に記述する必要があります。 -
LIMIT 表示件数 取得するデータの最大件数を数値で指定します。例えば
LIMIT 5と指定すると、最大で5行のデータが返されます。
LIMIT句のOFFSET付き構文
LIMIT句にOFFSETを組み合わせることで、検索結果の途中から指定した件数のデータを取得できます。これは、Webサイトのページ送り機能(ページネーション)などを実装する際によく利用される構文です。
LIMITには取得したいデータの件数を指定し、OFFSETには先頭から何件のデータを読み飛ばす(スキップする)かを指定します。
注意点として、OFFSETは0から数え始めます。そのため、先頭のレコードから取得したい場合はOFFSET 0と指定します。例えば、1ページに10件表示するシステムの3ページ目のデータを取得したい場合は、先頭から20件(10件 × 2ページ分)をスキップする必要があるのでOFFSET 20となります。
また、OFFSETを正しく使うためにはORDER BY句で並び順を明確に指定することが不可欠です。ORDER BYがないと、どのような順序でデータがスキップされるかが保証されず、毎回異なる結果が返ってくる可能性があるためです。
1-- OFFSET付き構文(スキップ+取得) 2-- OFFSETは0スタートなので、1件目から表示するなら OFFSET 0 3SELECT 4 カラム名, 5 カラム名, 6 ... 7FROM 8 テーブル名 9ORDER BY 10 カラム名 [ASC|DESC] 11LIMIT 12 取得件数 13OFFSET 14 スキップ件数;
サンプルコード
SQLを使用してデータベースからデータを取得する際、取得する行数を制御する方法は非常に重要です。ここでは、LIMIT句やOFFSET句を使った基本的なデータ取得のサンプルを紹介します。
sql/chapter08/01.sql
データベースから取得するデータの件数を制限したい場合にLIMIT句を使用します。
1-- 先頭3件のデータを取得する 2SELECT 3 * 4FROM 5 students 6ORDER BY 7 id 8LIMIT 9 3;
このSQL文は、studentsテーブルからデータを取得する例です。
まずORDER BY idでidの昇順にデータを並び替えます。その並び替えた結果に対してLIMIT 3を指定することで、先頭から3件のデータだけを取得できます。
sql/chapter08/02.sql
特定の条件ではなく、無作為にデータを取得したい場合があります。その際にはORDER BY RAND()とLIMITを組み合わせます。
1-- ランダムに1人の学生を取得する 2SELECT 3 * 4FROM 5 students 6ORDER BY 7 RAND() 8LIMIT 9 1;
RAND()はランダムな値を生成する関数です。ORDER BY RAND()とすることで、テーブルの行をランダムな順序に並び替えることができます。その上でLIMIT 1を指定することにより、ランダムに並び替えられた結果の先頭の1件、つまりテーブル全体からランダムに1件のデータを取得することが可能になります。
sql/chapter08/03.sql
Webアプリケーションのページネーション機能(例:検索結果の1ページ目、2ページ目など)を実装する際、データの取得開始位置を指定する必要があります。この場合にOFFSET句が役立ちます。
1-- 3件スキップして次の3件のデータを取得する 2SELECT 3 * 4FROM 5 students 6ORDER BY 7 id 8LIMIT 9 3 10OFFSET 11 3;
OFFSET句は、指定した数値の分だけ先頭から行をスキップ(無視)する機能を持っています。
この例では、まずORDER BY idでデータを並び替えた後、OFFSET 3によって先頭の3件をスキップします。その後、LIMIT 3によって、スキップした位置から続く3件のデータを取得します。結果として、4番目、5番目、6番目のデータが取得されます。
おわりに
今回は、SQLで取得するデータの件数を制限するLIMIT句の基本を学びました。ORDER BY句と組み合わせれば、スコア上位のようなランキングデータを簡単に作成できます。さらにOFFSET句を使えば、Webサイトでよく見かけるページ送り機能も実装可能です。LIMIT句は大量のデータから必要な情報だけを効率的に取得するための重要な機能なので、ぜひマスターしてください。