Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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のような動きをさせることが可能です。

参考)Oracle公式ドキュメント:ROWNUM疑似列

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と組み合わせて開始位置(オフセット)指定が可能

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。