SQL Serverでは、TOP
を使用できます クエリ結果セットから返される行を制限する句。この句は、LIMIT
と同様の機能を提供します MySQLの場合、およびROWNUM
Oracleでは、これらのそれぞれの動作方法に違いがあります。
以下は、TOP
の使用例です。 SQLServerの結果セットを制限する句。
例1-基本的な使用法
TOP
の基本的な例を次に示します。 作品:
SELECT TOP(3) * FROM Albums;
結果:
+-----------+-----------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-----------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | +-----------+-----------------------+---------------+------------+-----------+
この場合、結果を3行に制限しました。
もう一度クエリを実行しましょう。ただし、今回はTOP
を使用しません。 条項:
SELECT * FROM Albums;
結果:
+-----------+--------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+--------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | | 6 | Epicloud | 2012-09-18 | 5 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | | 9 | Killers | 1981-02-02 | 1 | 1 | | 10 | No Prayer for the Dying | 1990-10-01 | 1 | 1 | | 11 | No Sound Without Silence | 2014-09-12 | 9 | 4 | | 12 | Big Swing Face | 1967-06-01 | 4 | 2 | | 13 | Blue Night | 2000-11-01 | 12 | 4 | | 14 | Eternity | 2008-10-27 | 12 | 4 | | 15 | Scandinavia | 2012-06-11 | 12 | 4 | | 16 | Long Lost Suitcase | 2015-10-09 | 7 | 4 | | 17 | Praise and Blame | 2010-06-26 | 7 | 4 | | 18 | Along Came Jones | 1965-05-21 | 7 | 4 | | 19 | All Night Wrong | 2002-05-05 | 3 | 2 | | 20 | The Sixteen Men of Tain | 2000-03-20 | 3 | 2 | | 21 | Yo Wassup | 2019-03-12 | 9 | 3 | | 22 | Busted | 1901-05-11 | 9 | 3 | +-----------+--------------------------+---------------+------------+-----------+
したがって、最初のクエリがより大きなセットから最初の3つだけを返したことがわかります。
例2–ORDERBY句の使用
Microsoftは、常にORDER BY
を使用することがベストプラクティスであると述べています TOP
を使用する場合 句。これは、TOP
の影響を受ける行を予測可能に示す唯一の方法だからです。 。
したがって、最初の例を次のように書き直すことができます。
SELECT TOP(3) * FROM Albums ORDER BY AlbumId;
結果:
+-----------+-----------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-----------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | +-----------+-----------------------+---------------+------------+-----------+
順序が結果にどのように影響するかを理解することが重要です。そうしないと、予期しない結果になる可能性があります。
同じクエリをもう一度使用して、別の列で並べ替えるとどうなりますか。
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
結果:
+-----------+-------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | +-----------+-------------------+---------------+------------+-----------+
順番に挿入、削除、更新
ただし、TOP
を使用することもできます。 INSERT
の句 、UPDATE
、MERGE
、およびDELETE
ステートメントでは、ORDER BY
を直接指定することはできません これらのステートメントの句。ただし、sub-selectステートメントを使用して、意味のある時系列で行を挿入、削除、または変更できます。
例3–WITHTIES引数の使用
オプションのWITH TIES
を使用できます 制限された結果セットの最後の場所に関連するすべての行を返す引数。これは、ORDER BY
を使用する場合にのみ適用されます(使用のみ可能です)。 条項。
ORDER BY
の場合 句を使用すると、WITH TIES
を使用して、2つ以上の行が最後の場所に結合されます。 、それらすべてが返されます。これにより、実際に指定したよりも多くの行が返される可能性があります。
これは例で簡単に説明できます。
SELECT TOP(3) WITH TIES * FROM Albums ORDER BY ArtistId;
結果:
+-----------+-------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | | 9 | Killers | 1981-02-02 | 1 | 1 | | 10 | No Prayer for the Dying | 1990-10-01 | 1 | 1 | +-----------+-------------------------+---------------+------------+-----------+
ここでは、上位3行のみを返すように指定していますが、実際には5行が返されます。これは、同じArtistIdを使用する行が5つあるため、行3〜5がすべて最後の場所に関連付けられているためです。この場合、私はWITH TIES
を使用します それらすべてを返すために。
WITH TIES
を削除した場合 、3行のみが返されます:
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
結果:
+-----------+-------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 7 | Somewhere in Time | 1986-09-29 | 1 | 1 | | 8 | Piece of Mind | 1983-05-16 | 1 | 1 | +-----------+-------------------+---------------+------------+-----------+
WITH TIES
に注意してください 引数はSELECT
でのみ指定できます ステートメント、およびORDER BY
を使用する場合のみ 句。また、レコードを結ぶために返される順序は任意です。
例4–パーセンテージの使用
設定された行数の代わりにパーセンテージ値を指定するオプションもあります。これを行うには、PERCENT
を使用します 引数。
例:
SELECT TOP(10) PERCENT * FROM Albums ORDER BY AlbumId;
結果:
+-----------+-----------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+-----------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | +-----------+-----------------------+---------------+------------+-----------+
小数値は次の整数値に切り上げられることに注意してください。この場合、22行の10パーセントは2.2ですが、切り上げられたため、3行になります。
したがって、パーセンテージを2倍にしても、必ずしも行数が2倍になるとは限りません。
SELECT TOP(20) PERCENT * FROM Albums ORDER BY AlbumId;
結果:
+-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
この場合、22の20パーセントは4.4です。繰り返しになりますが、切り上げられ、5行になります。
例5–括弧の削除
TOP
を使用する場合、括弧を削除することができます ただし、この条項はお勧めしません。
いずれにせよ、前の例から括弧を削除する例を次に示します。
SELECT TOP 20 PERCENT * FROM Albums ORDER BY AlbumId;
結果:
+-----------+------------------------+---------------+------------+-----------+ | AlbumId | AlbumName | ReleaseDate | ArtistId | GenreId | |-----------+------------------------+---------------+------------+-----------| | 1 | Powerslave | 1984-09-03 | 1 | 1 | | 2 | Powerage | 1978-05-05 | 2 | 1 | | 3 | Singing Down the Lane | 1956-01-01 | 6 | 3 | | 4 | Ziltoid the Omniscient | 2007-05-21 | 5 | 1 | | 5 | Casualties of Cool | 2014-05-14 | 5 | 1 | +-----------+------------------------+---------------+------------+-----------+
INSERT
で必要な使用法との一貫性を提供するため、常に括弧を使用することをお勧めします。 、UPDATE
、MERGE
、およびDELETE
ステートメント。
下位互換性の理由から、括弧はオプションです。