Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Batasi Baris yang Dikembalikan dalam SQL Server Query dengan menggunakan TOP Clause

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat prosedur tersimpan yang secara opsional akan mencari kolom?

  2. Beberapa berita bagus untuk pelanggan Edisi Standar di SQL Server 2014

  3. CONVERT() vs TRY_CONVERT di SQL Server:Apa Bedanya?

  4. t-sql pilih dapatkan semua Bulan dalam rentang tahun

  5. cara membuat data Anda horizontal