SQLServerにテーブルを作成してデータを取得する際に、取得する行数を指定したい場合があります。
例えば、上位3位までのデータ(レコード)が欲しいので、先頭の3行のみに限定して取得する場合などです。
そこで今回は、SQLServerでデータを取得(SELECT)する際に、行数を指定してデータを取得する方法について紹介します。
目次
使用するテーブル
本記事では、データを取得するサンプルのテーブルとして、以下のテーブルを使用します。
テーブル定義
テーブル名は「学生成績」とします。
テーブルには、学生番号、氏名、得点の3つの列を作成します。
列名 | データ型 | 主キー |
---|---|---|
学生番号 | int | 〇 |
氏名 | nvarchar(50) | |
得点 | int |
テーブルのCREATE文
テーブルを作成するSQLは次のようになります。
1 2 3 4 5 6 |
CREATE TABLE [学生成績] ( [学生番号] int PRIMARY KEY, [氏名] nvarchar(50), [得点] int ); |
テーブルにレコードを挿入するINSERT文
テーブルにレコードを挿入するSQLは次のようになります。
1 2 3 4 5 6 7 8 |
INSERT INTO [学生成績] ([学生番号], [氏名], [得点]) VALUES (1, '山田 太郎', 90), (2, '佐藤 花子', 75), (3, '田中 一郎', 82), (4, '鈴木 次郎', 77), (5, '中村 さくら', 88); |
上記の学生成績テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。
指定した行数に限定する方法
SQLでSELECTステートメントを実行する際に取得する行数(レコード数)を限定する方法には
- TOP句を使用する
- SET ROWCOUNTステートメントを使用する
の2つがあります。
指定した行数または割合(パーセント)に制限するTOP句
TOP句を使用すると、行数を指定してデータを取得することができます。
TOP句の構文
TOP句で行数を指定する場合は「TOP」の後に「(]を記述し、続けて行数を記述し、その後に「)」します。
1 |
TOP(行数) |
「()」の部分は引数となるので、スペースに置き換えることもできます。
1 |
TOP 行数 |
(TOPと行数の間に半角スペースが入っています。)
SELECTステートメントでは「SELECT」の後に「取得する列(の名前)」を指定しますが、TOP句は「SELECT」と「取得する列(の名前)」の間に記述します。
例えば、学生成績テーブルから学生番号と氏名を取得する場合は
1 |
SELECT [学生番号], [氏名] FROM [学生氏名] |
というSQLになります。
TOP句は「SELECT」と「 [学生番号], [氏名] 」の間に記述することになりますので以下のようになります。
1 |
SELECT TOP(行数) [学生番号], [氏名] FROM [学生氏名] |
TOP句は、通常ORDER BY句と合わせて使用されます。
ORDER BY句で並び順を指定し、その並び替えられた行の先頭のN件を取得します。
(Nは行数を表す数値)
TOP句の使用例
以下に学生成績テーブルから学生番号の昇順に3行のレコードを取得する例を示します。
1 2 3 4 5 6 7 8 |
SELECT TOP(3) [学生番号], [氏名], [得点] FROM [学生成績] ORDER BY [学生番号]; |
または
1 2 3 4 5 6 7 8 |
SELECT TOP 3 [学生番号], [氏名], [得点] FROM [学生成績] ORDER BY [学生番号]; |
上記のSQLを実行すると、山田 太郎(学生番号が1)と佐藤 花子(学生番号が2)と田中 一郎(学生番号が3)の3件のレコードが取得されます。
学生番号 | 氏名 | 得点 | |
---|---|---|---|
1 | 1 | 山田 太郎 | 90 |
2 | 2 | 佐藤 花子 | 75 |
3 | 3 | 田中 一郎 | 82 |
TOP句では行数の他に、割合(パーセンテージ)を指定することもできます。
例えば、先頭から半分を取得する場合では「50%」、上位1割を取得する場合なら「10%」と指定します。
以下に例として、学生成績テーブルから得点が高い学生を40%取得する例を示します。
1 2 3 4 5 6 7 8 |
SELECT TOP(40)PERCENT [学生番号], [氏名], [得点] FROM [学生成績] ORDER BY [得点] DESC; |
または
1 2 3 4 5 6 7 8 |
SELECT TOP 40 PERCENT [学生番号], [氏名], [得点] FROM [学生成績] ORDER BY [得点] DESC; |
上記の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」と記述した後に半角スペース、タブ、改行などの空白文字を記述し、その後に行数を指定します。
1 |
SET ROWCOUNT 行数; |
SET ROWCOUNTステートメントは、SELECTステートメントを実行する前に実行します。
SET ROWCOUNTステートメントの使用例
以下に学生成績テーブルから得点が低い者から3行のレコードを取得する例を示します。
1 2 3 4 5 6 7 8 9 |
SET ROWCOUNT 3; SELECT [学生番号], [氏名], [得点] FROM [学生成績] ORDER BY [得点]; |
上記のSQLを実行すると、得点の低い順に佐藤 花子(75点)、鈴木 次郎(77点)、田中 一郎(82点)の3件のレコードが取得されます。
学生番号 | 氏名 | 得点 | |
---|---|---|---|
1 | 2 | 佐藤 花子 | 75 |
2 | 4 | 鈴木 次郎 | 77 |
3 | 3 | 田中 一郎 | 82 |
SET ROWCOUNTステートメント 補足
SET ROWCOUNTステートメントでは、行数に「0」を指定することで設定した行数をクリア(初期化)することができます。
1 |
SET ROWCOUNT 0; |