Di SQL Server, Anda dapat menggunakan TOP
klausa untuk membatasi baris yang dikembalikan dari kumpulan hasil kueri. Klausa ini menyediakan fungsionalitas yang mirip dengan LIMIT
di MySQL, dan ROWNUM
di Oracle, meskipun ada perbedaan dalam cara kerja masing-masing.
Di bawah ini adalah contoh penggunaan TOP
klausa untuk membatasi hasil yang ditetapkan di SQL Server.
Contoh 1 – Penggunaan Dasar
Berikut adalah contoh dasar bagaimana TOP
bekerja:
SELECT TOP(3) * FROM Albums;
Hasil:
+-----------+-----------------------+---------------+------------+-----------+ | 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 | +-----------+-----------------------+---------------+------------+-----------+
Dalam hal ini saya membatasi hasil hanya tiga baris.
Mari kita jalankan kueri lagi, tetapi kali ini tanpa TOP
klausa:
SELECT * FROM Albums;
Hasil:
+-----------+--------------------------+---------------+------------+-----------+ | 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 | +-----------+--------------------------+---------------+------------+-----------+
Jadi kita dapat melihat bahwa kueri pertama hanya mengembalikan tiga yang pertama dari kumpulan yang lebih besar.
Contoh 2 – Menggunakan Klausa ORDER BY
Microsoft menyatakan bahwa praktik terbaik adalah selalu menggunakan ORDER BY
saat menggunakan TOP
ayat. Ini karena, ini adalah satu-satunya cara untuk memprediksi baris mana yang terpengaruh oleh TOP
.
Oleh karena itu, kita dapat menulis ulang contoh pertama sebagai berikut:
SELECT TOP(3) * FROM Albums ORDER BY AlbumId;
Hasil:
+-----------+-----------------------+---------------+------------+-----------+ | 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 | +-----------+-----------------------+---------------+------------+-----------+
Penting untuk memahami bagaimana pemesanan memengaruhi hasil. Jika tidak, Anda bisa berakhir dengan hasil yang tidak terduga.
Inilah yang terjadi jika saya menggunakan kueri yang sama lagi, tetapi memesan dengan kolom yang berbeda:
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
Hasil:
+-----------+-------------------+---------------+------------+-----------+ | 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 | +-----------+-------------------+---------------+------------+-----------+
Menyisipkan, Menghapus, &Memperbarui Secara Berurutan
Perhatikan bahwa, meskipun Anda dapat menggunakan TOP
klausa dalam INSERT
, UPDATE
, MERGE
, dan DELETE
pernyataan, Anda tidak dapat langsung menentukan ORDER BY
klausa dalam pernyataan-pernyataan tersebut. Namun, Anda dapat menggunakan pernyataan sub-pilihan untuk menyisipkan, menghapus, atau mengubah baris dalam urutan kronologis yang bermakna.
Contoh 3 – Menggunakan Argumen WITH TIES
Anda dapat menggunakan WITH TIES
opsional argumen untuk mengembalikan semua baris yang mengikat untuk tempat terakhir dalam kumpulan hasil terbatas. Ini hanya berlaku (dan hanya dapat digunakan) saat menggunakan ORDER BY
klausa.
Jika ORDER BY
klausa menyebabkan dua atau lebih baris terikat untuk tempat terakhir, menggunakan WITH TIES
, akan menyebabkan semuanya dikembalikan. Ini dapat menyebabkan lebih banyak baris ditampilkan daripada yang sebenarnya Anda tentukan.
Ini lebih mudah dijelaskan dengan sebuah contoh.
SELECT TOP(3) WITH TIES * FROM Albums ORDER BY ArtistId;
Hasil:
+-----------+-------------------------+---------------+------------+-----------+ | 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 | +-----------+-------------------------+---------------+------------+-----------+
Di sini, saya menetapkan bahwa hanya 3 baris teratas yang harus dikembalikan, tetapi 5 benar-benar dikembalikan. Ini karena ada 5 baris yang menggunakan ArtistId yang sama, jadi baris 3 – 5 semuanya sama untuk tempat terakhir. Dalam hal ini saya menggunakan WITH TIES
untuk mengembalikan mereka semua.
Jika saya menghapus WITH TIES
, hanya 3 baris yang dikembalikan:
SELECT TOP(3) * FROM Albums ORDER BY ArtistId;
Hasil:
+-----------+-------------------+---------------+------------+-----------+ | 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 | +-----------+-------------------+---------------+------------+-----------+
Perhatikan bahwa WITH TIES
argumen hanya dapat ditentukan dalam SELECT
pernyataan, dan hanya jika mereka menggunakan ORDER BY
ayat. Selain itu, urutan pengembalian catatan pengikatan bersifat arbitrer.
Contoh 4 – Menggunakan Persentase
Anda juga memiliki opsi untuk menentukan nilai persentase alih-alih sejumlah baris yang ditentukan. Untuk melakukannya, gunakan PERCENT
argumen.
Contoh:
SELECT TOP(10) PERCENT * FROM Albums ORDER BY AlbumId;
Hasil:
+-----------+-----------------------+---------------+------------+-----------+ | 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 | +-----------+-----------------------+---------------+------------+-----------+
Perhatikan bahwa nilai pecahan dibulatkan ke atas ke nilai bilangan bulat berikutnya. Dalam hal ini, 10 persen dari 22 baris adalah 2,2, tetapi karena dibulatkan ke atas, kita mendapatkan 3 baris.
Jadi menggandakan persentase, tidak serta merta menghasilkan dua kali lipat jumlah baris:
SELECT TOP(20) PERCENT * FROM Albums ORDER BY AlbumId;
Hasil:
+-----------+------------------------+---------------+------------+-----------+ | 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 | +-----------+------------------------+---------------+------------+-----------+
Dalam hal ini, 20 persen dari 22 adalah 4,4. Sekali lagi, dibulatkan, dan kita mendapatkan 5 baris.
Contoh 5 – Menghapus Tanda Kurung
Dimungkinkan untuk menghapus tanda kurung saat menggunakan TOP
klausa, bagaimanapun, itu tidak disarankan.
Apa pun itu, berikut adalah contoh penghapusan tanda kurung dari contoh sebelumnya:
SELECT TOP 20 PERCENT * FROM Albums ORDER BY AlbumId;
Hasil:
+-----------+------------------------+---------------+------------+-----------+ | 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 | +-----------+------------------------+---------------+------------+-----------+
Microsoft menganjurkan agar Anda selalu menggunakan tanda kurung, karena memberikan konsistensi dengan penggunaan yang diperlukan di INSERT
, UPDATE
, MERGE
, dan DELETE
pernyataan.
Tanda kurung adalah opsional untuk alasan kompatibilitas mundur.