LIMIT句はSELECT文でレコードを取得する際の行数を制限するために使用されます。特に大きなテーブルからデータを取得する際に、結果をページングしたり、サンプリングしたりするのに役立ちます。
参考 商品テーブルから最初の5件の商品を取得するクエリ
SELECT product_id, product_name, price FROM products ORDER BY product_id LIMIT 5;
このページではLIMIT句の利用方法を初心者向けに1からわかりやすく、サンプルコード付きで解説します。
プログラマー/システムエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
前提 SQLの基本構文ルール
SQL:LIMIT句
LIMIT句は、SQLクエリの結果セットから特定の数の行を取得する際に使用されます。
例えば、最も高い給与をもらっている上位3人の従業員の結果だけ取得したい!というような場合や、指定した条件に一致する最初の1レコードのみ取得したい!というような場合に利用されます。
構文ルール
SELECT カラム名1, カラム名2, ... FROM テーブル名 [WHERE 条件] [ORDER BY カラム名 [ASC|DESC]] LIMIT 取得する行数 [OFFSET 開始行の位置];
実際にサンプルコードをお見せします。
まずは以下のようなテーブルとデータを準備します。
テーブルの作成: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句
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句を効果的に利用しましょう!
SQLを1から学習したい方は
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。