取得する行数(レコード数)を指定してデータをSELECTする TOP ROWCOUNT [SQLServer]

SQLServerにテーブルを作成してデータを取得する際に、取得する行数を指定したい場合があります。

例えば、上位3位までのデータ(レコード)が欲しいので、先頭の3行のみに限定して取得する場合などです。

そこで今回は、SQLServerでデータを取得(SELECT)する際に、行数を指定してデータを取得する方法について紹介します。

使用するテーブル

本記事では、データを取得するサンプルのテーブルとして、以下のテーブルを使用します。

テーブル定義

テーブル名は「学生成績」とします。
テーブルには、学生番号、氏名、得点の3つの列を作成します。

列名 データ型 主キー
学生番号 int
氏名 nvarchar(50)
得点 int

テーブルのCREATE文

テーブルを作成するSQLは次のようになります。

テーブルにレコードを挿入するINSERT文

テーブルにレコードを挿入するSQLは次のようになります。

上記の学生成績テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...

指定した行数に限定する方法

SQLでSELECTステートメントを実行する際に取得する行数(レコード数)を限定する方法には

  1. TOP句を使用する
  2. SET ROWCOUNTステートメントを使用する

の2つがあります。

指定した行数または割合(パーセント)に制限するTOP句

TOP句を使用すると、行数を指定してデータを取得することができます。

TOP句の構文

TOP句で行数を指定する場合は「TOP」の後に「(]を記述し、続けて行数を記述し、その後に「)」します。

「()」の部分は引数となるので、スペースに置き換えることもできます。

(TOPと行数の間に半角スペースが入っています。)

SELECTステートメントでは「SELECT」の後に「取得する列(の名前)」を指定しますが、TOP句は「SELECT」と「取得する列(の名前)」の間に記述します。

例えば、学生成績テーブルから学生番号と氏名を取得する場合は

というSQLになります。
TOP句は「SELECT」と「 [学生番号], [氏名] 」の間に記述することになりますので以下のようになります。

TOP句は、通常ORDER BY句と合わせて使用されます。
ORDER BY句で並び順を指定し、その並び替えられた行の先頭のN件を取得します。
(Nは行数を表す数値)

TOP句の使用例

以下に学生成績テーブルから学生番号の昇順に3行のレコードを取得する例を示します。

または

上記のSQLを実行すると、山田 太郎(学生番号が1)と佐藤 花子(学生番号が2)と田中 一郎(学生番号が3)の3件のレコードが取得されます。

学生番号 氏名 得点
1 1 山田 太郎 90
2 2 佐藤 花子 75
3 3 田中 一郎 82

TOP句では行数の他に、割合(パーセンテージ)を指定することもできます。
例えば、先頭から半分を取得する場合では「50%」、上位1割を取得する場合なら「10%」と指定します。

以下に例として、学生成績テーブルから得点が高い学生を40%取得する例を示します。

または

上記のSQLを実行すると、上位40%にあたる山田 太郎(90点)と中村 さくら(88点)の2件のレコードが取得されます。

学生番号 氏名 得点
1 1 山田 太郎 90
2 5 中村 さくら 88

TOP句 補足

TOP句では、INSERT、UPDATE、MERGE、DELETE ステートメントによって影響を受ける行数を指定することもできます。

行数をセットするSET ROWCOUNTステートメント

SET ROWCOUNTステートメントを使用すると、SELECTステートメントで取得するレコードの行数を設定することができます。

SET ROWCOUNTステートメントの構文

SET ROWCOUNTステートメントでは、「SET ROWCOUNT」と記述した後に半角スペース、タブ、改行などの空白文字を記述し、その後に行数を指定します。

SET ROWCOUNTステートメントは、SELECTステートメントを実行する前に実行します。

SET ROWCOUNTステートメントの使用例

以下に学生成績テーブルから得点が低い者から3行のレコードを取得する例を示します。

上記のSQLを実行すると、得点の低い順に佐藤 花子(75点)、鈴木 次郎(77点)、田中 一郎(82点)の3件のレコードが取得されます。

学生番号 氏名 得点
1 2 佐藤 花子 75
2 4 鈴木 次郎 77
3 3 田中 一郎 82

SET ROWCOUNTステートメント 補足

SET ROWCOUNTステートメントでは、行数に「0」を指定することで設定した行数をクリア(初期化)することができます。