概要:このチュートリアルでは、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標準ではありません。