MySQL Oracle SQLSever

【SQL】SELECT文で何件目から何件目まで指定して検索する(MySQL、Oracle、SQLServer)

前回の「【SQL】SELECT文で取得件数を指定して検索する(MySQL、Oracle、SQLServer)」という記事を来ました。

引き続き、今回ははSELECT文を使って「何件目から何件目まで」のように表の間をデータを取得する方法をご紹介します。

何件目から何件目までのデータを検索する

サンプルデータ

検索対象のサンプルとして以下のテーブルを使います。

テーブル名:SAMPLE_TABLE

ID NAME AGE MAIL
1 太郎 39 taro@sample.com
2 次郎 27 jiro@sample.com
3 三郎 13 sub@sample.com
4 絵美 30 emi@sample.com
5 美香 20 mika@sample.com
6 香奈子 10 kana@sample.com

MySQL

MySQLの場合、取得件数の指定には「LIMIT 先頭番号(0始まり), 取得する件数」を使います。

-- 2件目から4件目までのデータを取得する
SELECT * FROM SAMPLE_TABLE LIMIT 1, 3;
ID NAME AGE MAIL
2 次郎 27 jiro@sample.com
3 三郎 13 sub@sample.com
4 絵美 30 emi@sample.com

Oracle

Oracleの場合は間のデータを取ることが難しいです。

無理くり実装すると、まず対象テーブルのカラムに対して「rownum」で連番の番号(num)を振り、その番号に対して「2件目から4件目」の条件を指定します。

-- 2件目から4件目までのデータを取得する
SELECT * FROM 
 (SELECT  
    rownum num
    , SAMPLE_TABLE.* 
  FROM 
    SAMPLE_TABLE) main 
WHERE 
  main.num >= 2 
  AND main.num <= 4;
ID NAME AGE MAIL
2 次郎 27 jiro@sample.com
3 三郎 13 sub@sample.com
4 絵美 30 emi@sample.com

SQLServer

SQLServerもOracle同様、最初に表の連番の番号を振って件数を指定します。

連番には「ROW_NUMBER()」を使います。

-- 2件目から4件目までのデータを取得する
SELECT * FROM 
  (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) num, SAMPLE_TABLE.* FROM SAMPLE_TABLE) main 
WHERE main.num >= 2 AND main.num <= 4;

-- または以下の書き方でもOK

SELECT * FROM 
  (SELECT TOP 4 ROW_NUMBER() OVER(ORDER BY ID ASC) num, SAMPLE_TABLE.* FROM SAMPLE_TABLE) main 
WHERE main.num >= 2 ;
ID NAME AGE MAIL
2 次郎 27 jiro@sample.com
3 三郎 13 sub@sample.com
4 絵美 30 emi@sample.com

-MySQL, Oracle, SQLSever