概要:このチュートリアルでは、SQLのLIMIT
句を使用して、クエリから返される行数を制限する方法を学びます。
SQL LIMIT句の概要
selectステートメントによって返される行数を制限するには、LIMIT
およびOFFSET
句を使用します。
以下にLIMIT
&OFFSET
句の構文を示します。
SELECT
column_list
FROM
table1
ORDER BY column_list
LIMIT row_count OFFSET offset;
Code language: SQL (Structured Query Language) (sql)
この構文では、
LIMIT row_count
は、クエリによって返される行数(row_count
)を決定します。OFFSET offset
句は、行の返却を開始する前にoffset
行をスキップします。
OFFSET
句はオプションです。省略した場合、クエリはSELECT
句によって返される最初の行からrow_count
行を返します。
LIMIT
句を使用する場合は、結果セット内の行の順序を確実にするために、ORDER BY
句を使用することが重要です。
すべてのデータベースシステムがLIMIT
句をサポートしているわけではありません。したがって、LIMIT
句は、MySQL、PostgreSQL、SQLite、Sybase SQL Anywhere、HSQLDBなどの一部のデータベースシステムでのみ利用可能です。SQL Serverを使用する場合は、代わりにSELECT TOP
を使用できます。
SQL LIMIT句の例
LIMIT & OFFSET
句を示すために、サンプルデータベースのemployees
テーブルを使用します。

次のステートメントは、employees
テーブルのすべての行をfirst_name
列でソートして返します。
SELECT
employee_id,
first_name,
last_name
FROM
employees
ORDER BY
first_name;
Code language: SQL (Structured Query Language) (sql)

次の例では、LIMIT句を使用して、SELECT句によって返される結果セットの最初の5行を返します。
SELECT
employee_id,
first_name,
last_name
FROM
employees
ORDER BY
first_name
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)

次の例では、LIMIT
とOFFSET
の両方の句を使用して、4番目の行から始まる5行を返します。
SELECT
employee_id, first_name, last_name
FROM
employees
ORDER BY first_name
LIMIT 5 OFFSET 3;
Code language: SQL (Structured Query Language) (sql)

MySQLでは、次のようにLIMIT & OFFSET
句の短い形式を使用できます。
SELECT
employee_id,
first_name,
last_name
FROM
employees
ORDER BY
first_name
LIMIT 3 , 5;
Code language: SQL (Structured Query Language) (sql)
SQL LIMITを使用して、最大値または最小値を持つ上位N行を取得する
LIMIT
句を使用して、最大値または最小値を持つ上位N行を取得できます。たとえば、次のステートメントは、最も高い給与を持つ上位5人の従業員を取得します。
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
ORDER BY
salary DESC
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)

最初に、ORDER BY
句が従業員を給与で降順にソートし、次にLIMIT
句がクエリから返される5行を制限します。
最も低い給与を持つ上位5人の従業員を取得するには、代わりに昇順で給与で従業員をソートします。

N番目に高い値を持つ行を取得する
会社で2番目に高い給与を持つ従業員を取得する必要があるとします。そのためには、次のようにLIMIT OFFSET
句を使用します。
SELECT
employee_id,
first_name,
last_name,
salary
FROM
employees
ORDER BY
salary DESC
LIMIT 1 OFFSET 1;
Code language: SQL (Structured Query Language) (sql)
ORDER BY
句は、従業員を給与で降順にソートします。そして、LIMIT 1 OFFSET 1
句は、結果セットから2番目の行を取得します。
このクエリは、すべての従業員の給与が異なるという前提で機能します。同じ最高給与を持つ2人の従業員がいると失敗します。
また、同じ2番目に高い給与を持つ従業員が2人以上いる場合、クエリは最初の従業員のみを返します。
この問題を修正するには、次のステートメントを使用して、最初に2番目に高い給与を取得できます。
SELECT DISTINCT
salary
FROM
employees
ORDER BY salary DESC
LIMIT 1 , 1;
Code language: SQL (Structured Query Language) (sql)

そして、結果を別のクエリに渡します。
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
salary = 17000;
Code language: SQL (Structured Query Language) (sql)

サブクエリを知っている場合は、次のクエリのように両方のクエリを単一のクエリに結合できます。
SELECT
employee_id, first_name, last_name, salary
FROM
employees
WHERE
salary = (SELECT DISTINCT
salary
FROM
employees
ORDER BY salary DESC
LIMIT 1 , 1);
Code language: SQL (Structured Query Language) (sql)
概要
- クエリによって返される行数を制限するには、LIMIT&OFFSET句を使用します。
- LIMIT&OFFSETはSQL標準ではありません。