SQLのlimitの構文、OracleやSQL Serverでの代替方法、MySQLやPostgerSQLでの構文についてまとめています。
SQL limitの構文
limitは抽出件数を指定するSQLです。以下の例では、employees(社員)テーブルを上位から10件抽出しています。
以下は、MySQLで実行した例です。limitは標準SQLではないため、DBMSによっては使用できません。
mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQL limitを使ったページング、ランダム抽出、速度改善をおこなう
各DBMSのlimitの構文
Oracleでは、limit句が使えない
Oracleにはlimit句がありません。ROWNUMを使って、limitのような動きをさせることが可能です。
SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY last_name;
上記の例では、ROWNUM<11という条件で、検索結果の上位10件を抽出しています。ただし、意図しないソート順となるため、実際にはサブクエリとの組み合わせが必要になるでしょう。
以下のように、order byでソートしていしたクエリをサブクエリにして、ROWNUM条件で抽出件数を指定します。
SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11;
SQL Serverののlimit構文
SQL Serverにはlimitがありません。
指定した件数のみ抽出するにはTOPを使用します。
-- Select the first 10 employees hired most recently. SELECT TOP(10)JobTitle, HireDate FROM HumanResources.Employee ORDER BY HireDate DESC; GO
TOPは件数指定のほか、パーセント指定での制限も可能。変数を指定することもできます。
参考)TOP (Transact-SQL) – SQL Server | Microsoft Docs
また、上位からの件数ではなく、11件目~20件目などページング目的で途中のデータを抽出するには、ROW_NUMER()やOVERを使って工夫する必要があります。
参考)SQLServerでLIMIT句を利用する – Qiita
【関連記事】
▶SQL overは、分析関数 ビッグデータの集計区間を制限しレスポンスを上げる
MySQLのlimit構文
MySQLでは、引数1つのときは抽出件数を、引数2つのときはオフセット(開始位置)と抽出件数を指定可能です。
limit 5では上位5件抽出、limit 3,5では、3件目からスタートして5件抽出という指定になります。
mysql> select * from employees limit 5; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | +--------+------------+------------+-----------+--------+------------+ 5 rows in set (0.00 sec) mysql> select * from employees limit 3,5; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | +--------+------------+------------+-----------+--------+------------+ 5 rows in set (0.00 sec)
参考)MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.2.1.19 LIMIT クエリーの最適化
【関連記事】
▶MySQLのlimitのサンプルコード集 offset指定や効率的な件数取得方法は?
PostgreSQLのlimit構文
SELECT select_list FROM table_expression [LIMIT { number | ALL }] [OFFSET number]
postgreSQLでは、limit指定と組み合わせ可能なOFFSETを使用して、開始位置を指定します。OFFSET 0は、OFFSETを省略した場合と同じ意味になります。また、LIMIT ALL指定は、LIMITを省略したときと同じ意味になります。
まとめ
- limitは抽出件数を制限するSQL
- OracleやSQL Serverにはlimitがないが、別の方法で代替可能
- MySQLやPostgreSQLでは、limitと組み合わせて開始位置(オフセット)指定が可能