PR

【SQL】(SELECT)LIMIT句の使い方とコツを3分でわかりやすく解説

Database

LIMIT句はSELECT文でレコードを取得する際の行数を制限するために使用されます。特に大きなテーブルからデータを取得する際に、結果をページングしたり、サンプリングしたりするのに役立ちます。

参考 商品テーブルから最初の5件の商品を取得するクエリ

SELECT product_id, product_name, price
FROM products
ORDER BY product_id
LIMIT 5;

このページではLIMIT句の利用方法を初心者向けに1からわかりやすく、サンプルコード付きで解説します。

このページで学べる内容
  • LIMIT句の使い方と構文ルール
  • LIMIT:OFFSET 開始行の位置の指定
  • LIMIT句を利用する際の注意点とコツ

プログラマー/システムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。

前提 SQLの基本構文ルール

スポンサーリンク

SQL:LIMIT句

LIMIT句は、SQLクエリの結果セットから特定の数の行を取得する際に使用されます。

例えば、最も高い給与をもらっている上位3人の従業員の結果だけ取得したい!というような場合や、指定した条件に一致する最初の1レコードのみ取得したい!というような場合に利用されます。

構文ルール

SELECT カラム名1, カラム名2, ...
FROM テーブル名
[WHERE 条件]
[ORDER BY カラム名 [ASC|DESC]]
LIMIT 取得する行数
[OFFSET 開始行の位置];
ポイント
  • LIMIT 取得する行数
    →取得したい行数を指定します。100件取得するなら「100」。
  • OFFSET 開始行の位置
    結果セットの先頭からのオフセットを指定します。オプションですが、ページング時に役立ちます。デフォルトは0。

実際にサンプルコードをお見せします。

まずは以下のようなテーブルとデータを準備します。

テーブルの作成:CREATE TABLE文

/* 
booksテーブルを作成し
book_id, title, author, publication_yearのカラムを持たせる
*/

CREATE TABLE books (
  book_id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  author VARCHAR(255) NOT NULL,
  publication_year INT
);

レコードの挿入:INSERT文

INSERT INTO books (title, author, publication_year)
VALUES
  ('Book A', 'Author 1', 2010),
  ('Book B', 'Author 2', 2015),
  ('Book C', 'Author 3', 2018),
  ('Book D', 'Author 4', 2020),
  ('Book E', 'Author 5', 2021);

SELECT * FROM books;

/* 登録結果
+---------+--------+----------+------------------+
| book_id | title  | author   | publication_year |
+---------+--------+----------+------------------+
|       1 | Book A | Author 1 |             2010 |
|       2 | Book B | Author 2 |             2015 |
|       3 | Book C | Author 3 |             2018 |
|       4 | Book D | Author 4 |             2020 |
|       5 | Book E | Author 5 |             2021 |
+---------+--------+----------+------------------+
*/

では、booksテーブルから最初の3冊の本を取得してみます。

SELECT book_id, title, author, publication_year
FROM books
ORDER BY book_id
LIMIT 3;

/* 結果 最初の3レコードのみ取得される
+---------+--------+----------+------------------+
| book_id | title  | author   | publication_year |
+---------+--------+----------+------------------+
|       1 | Book A | Author 1 |             2010 |
|       2 | Book B | Author 2 |             2015 |
|       3 | Book C | Author 3 |             2018 |
+---------+--------+----------+------------------+
*/

ご覧のように、"book_id" の順にLIMIT句で指定した3件のレコードが取得できました。

同様に、booksテーブルから最新の出版年の2冊の本を取得したい場合は以下のように記述します。

SELECT book_id, title, author, publication_year
FROM books
ORDER BY publication_year DESC
LIMIT 2;

/* 結果 出版年の降順で2件取得される
+---------+--------+----------+------------------+
| book_id | title  | author   | publication_year |
+---------+--------+----------+------------------+
|       5 | Book E | Author 5 |             2021 |
|       4 | Book D | Author 4 |             2020 |
+---------+--------+----------+------------------+
*/

LIMIT句で指定した数だけレコードが取得されることがお分かりいただけたかと思います。

ちなみに、初心者のうちはORDER BY句の利用が漏れてしまうケースが散見されるので要注意です!

参考 ORDER BY句

ORDER BY句の重要性

ORDER BY句を使用しない場合、データベースは特定の順序で結果を返さないため、結果の順序は不確定です。

具体的には、データベースが内部で使用しているストレージやインデックスの構造に依存して、結果が返されます。このため、特定の順序で結果を取得したい場合は、ORDER BY句を使用して並び替えを指定することが重要です。

例えば、以下のようなSQLを実行すると、booksテーブルからランダムな3冊の本が取得されます。

-- 取得される結果はランダム
SELECT book_id, title, author, publication_year
FROM books
LIMIT 3;

LIMIT句:OFFSETの使い方

OFFSETとは、SQLクエリにおいて結果セットから特定の開始位置(オフセット)からレコードを取得するために使用されるキーワードです。

主にページングやデータの部分的な抽出などの用途で利用されます。OFFSETは、LIMIT句と一緒に使用して、取得するレコードの範囲を制限する際に用いるのが一般的です。

-- 11行目から20行目までのデータを取得
SELECT * FROM employees
LIMIT 10 OFFSET 10;

オフセットという概念に慣れていない方は、開始位置の数字に注意しましょう。

11行目から取得したい場合は、10を。3行目から取得したい場合は、2を指定します。

先ほどのテーブルからOFFSETを利用してデータを取得してみます。

1:最初の3冊の本を取得するクエリ

SELECT book_id, title, author, publication_year
FROM books
ORDER BY book_id
LIMIT 3 OFFSET 0; -- 最初の3冊を取得するため、OFFSETは0

/* 結果
+---------+--------+----------+------------------+
| book_id | title  | author   | publication_year |
+---------+--------+----------+------------------+
|       1 | Book A | Author 1 |             2010 |
|       2 | Book B | Author 2 |             2015 |
|       3 | Book C | Author 3 |             2018 |
+---------+--------+----------+------------------+
*/

2:4番目の本を取得するクエリ

SELECT book_id, title, author, publication_year
FROM books
ORDER BY book_id
LIMIT 1 OFFSET 3; -- 4番目の本を取得するため、OFFSETは3

/* 結果
+---------+--------+----------+------------------+
| book_id | title  | author   | publication_year |
+---------+--------+----------+------------------+
|       4 | Book D | Author 4 |             2020 |
+---------+--------+----------+------------------+
*/

SQL:LIMIT句の注意点

いろいろ便利なLIMIT句ですが、以下の点に注意が必要です。

LIMIT句の注意点
  • パフォーマンス
    大規模なテーブルに対してLIMIT句を使用する場合、特にOFFSETが大きい場合、パフォーマンスが低下する可能性があります。データベースがOFFSET分のレコードをスキップして結果セットを取得するため、オフセットが大きいほど処理時間がかかることがあります。
  • 結果の順序
    LIMIT句を使用する場合、結果の順序が重要であることが多いため、ORDER BY句を適切に使用して並び替えを指定することが重要です。ORDER BY句が指定されていない場合、結果の順序は不確定であり、予期しない結果が得られる可能性があります。
  • データベースの互換性
    LIMIT句は、標準SQLではないため、異なるデータベースシステムでの互換性がありません。例えば、Microsoft SQL ServerではLIMIT句の代わりにTOP句やOFFSET/FETCH NEXT句を使用する必要があります。Oracleでは、ROWNUMやFETCH FIRST句を使用します。データベースシステムによっては、LIMIT句に相当する機能が異なるため、使用するシステムに応じて適切な構文を選択することが重要です。

これらの注意点に留意し、必要に応じて適切な最適化や対策を行いながら、LIMIT句を効果的に利用しましょう!

SQL:LIMIT句のまとめ
  • 範囲指定: LIMIT句は、クエリ結果のレコード数を制限し、特定の範囲のデータを取得するために使用されます。
  • 順序指定: LIMIT句を使用する際は、結果の順序が重要であるため、ORDER BY句と組み合わせて並び替えを指定することが一般的です。
  • データベース互換性: LIMIT句は標準SQLではなく、データベースシステムによっては異なる構文が必要になるため、使用するシステムに応じて適切な構文を選択することが重要です。
SELECT book_id, title, author, publication_year
FROM books
ORDER BY book_id
LIMIT 3 OFFSET 0; -- 最初の3冊を取得するため、OFFSETは0

/* 結果
+---------+--------+----------+------------------+
| book_id | title  | author   | publication_year |
+---------+--------+----------+------------------+
|       1 | Book A | Author 1 |             2010 |
|       2 | Book B | Author 2 |             2015 |
|       3 | Book C | Author 3 |             2018 |
+---------+--------+----------+------------------+
*/

SQLを1から学習したい方は

SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。

SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?

とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
DatabaseIT-Skills
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました