TOP (Transact-SQL)
Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse di Microsoft Fabric
Membatasi baris yang dikembalikan dalam hasil kueri yang diatur ke jumlah baris atau persentase baris tertentu di SQL Server. Saat Anda menggunakan TOP dengan klausul ORDER BY, tataan hasil dibatasi pada jumlah N pertama baris yang diurutkan. Jika tidak, TOP mengembalikan jumlah baris N pertama dalam urutan yang tidak ditentukan. Gunakan klausa ini untuk menentukan jumlah baris yang dikembalikan dari pernyataan SELECT. Atau, gunakan TOP untuk menentukan baris yang terpengaruh oleh pernyataan INSERT, UPDATE, MERGE, atau DELETE.
Sintaks
Berikut ini adalah sintaks untuk SQL Server dan Azure SQL Database:
[
TOP (expression) [PERCENT]
[ WITH TIES ]
]
Berikut ini adalah sintaks untuk Azure Synapse Analytics and Analytics Platform System (PDW):
[
TOP ( expression )
[ WITH TIES ]
]
Argumen
expression
Ekspresi numerik yang menentukan jumlah baris yang akan dikembalikan. ekspresi secara implisit dikonversi ke nilai float jika Anda menentukan PERCENT. Jika tidak, ekspresi dikonversi ke bigint.
PERCENT
Menunjukkan bahwa kueri hanya mengembalikan persentase ekspresi pertama baris dari kumpulan hasil. Nilai pecahan dibulatkan ke atas ke nilai bilangan bulat berikutnya.
DENGAN IKATAN
Mengembalikan dua baris atau lebih yang mengikat untuk tempat terakhir dalam kumpulan hasil terbatas. Anda harus menggunakan argumen ini dengan klausa ORDER BY . WITH TIES dapat menyebabkan lebih banyak baris dikembalikan daripada nilai yang ditentukan dalam ekspresi. Misalnya, jika ekspresi diatur ke 5 tetapi dua baris tambahan cocok dengan nilai kolom ORDER BY di baris 5, kumpulan hasil akan berisi tujuh baris.
Anda dapat menentukan klausa TOP dengan argumen WITH TIES hanya dalam pernyataan SELECT, dan hanya jika Anda juga telah menentukan klausa ORDER BY. Urutan rekaman pengikatan yang dikembalikan bersifat arbitrer. ORDER BY tidak memengaruhi aturan ini.
Praktik Terbaik
Dalam pernyataan SELECT, selalu gunakan klausa ORDER BY dengan klausa TOP. Karena, ini adalah satu-satunya cara untuk secara terprediksi menunjukkan baris mana yang dipengaruhi oleh TOP.
Gunakan OFFSET dan FETCH dalam klausul ORDER BY alih-alih klausul TOP untuk menerapkan solusi paging kueri. Solusi halaman (yaitu, mengirim potongan atau "halaman" data ke klien) lebih mudah diterapkan menggunakan klausa OFFSET dan FETCH. Untuk informasi selengkapnya, lihat Klausul ORDER BY (Transact-SQL).
Gunakan TOP (atau OFFSET dan FETCH) alih-alih ATUR ROWCOUNT untuk membatasi jumlah baris yang dikembalikan. Metode ini lebih disukai daripada menggunakan SET ROWCOUNT karena alasan berikut:
- Sebagai bagian dari pernyataan SELECT, pengoptimal kueri dapat mempertimbangkan nilai ekspresi dalam klausa TOP atau FETCH selama pengoptimalan kueri. Karena Anda menggunakan SET ROWCOUNT di luar pernyataan yang menjalankan kueri, nilainya tidak dapat dipertimbangkan dalam rencana kueri.
Dukungan Kompatibilitas
Untuk kompatibilitas mundur, tanda kurung bersifat opsional dalam pernyataan SELECT jika ekspresi adalah konstanta bilangan bulat. Kami menyarankan agar Anda selalu menggunakan tanda kurung untuk TOP dalam pernyataan SELECT. Melakukannya memberikan konsistensi dengan penggunaan yang diperlukan dalam pernyataan INSERT, UPDATE, MERGE, dan DELETE.
Interoperabilitas
Ekspresi TOP tidak memengaruhi pernyataan yang mungkin berjalan karena pemicu. Tabel yang disisipkan dan dihapus dalam pemicu hanya mengembalikan baris yang benar-benar terpengaruh oleh pernyataan INSERT, UPDATE, MERGE, atau DELETE. Misalnya, jika INSERT TRIGGER diaktifkan sebagai hasil dari pernyataan INSERT yang menggunakan klausa TOP.
SQL Server memungkinkan pembaruan baris melalui tampilan. Karena Anda dapat menyertakan klausul TOP dalam definisi tampilan, baris tertentu mungkin hilang dari tampilan jika baris tidak lagi memenuhi persyaratan ekspresi TOP karena pembaruan.
Ketika ditentukan dalam pernyataan MERGE, klausul TOP berlaku setelah seluruh tabel sumber dan seluruh tabel target digabungkan. Dan, baris gabungan yang tidak memenuhi syarat untuk tindakan sisipkan, perbarui, atau hapus dihapus. Klausa TOP semakin mengurangi jumlah baris yang digabungkan ke nilai yang ditentukan dan tindakan sisipkan, perbarui, atau hapus berlaku untuk baris gabungan yang tersisa dengan cara yang tidak diurutkan. Artinya, tidak ada urutan di mana baris didistribusikan di antara tindakan yang ditentukan dalam klausul WHEN. Misalnya, jika menentukan TOP (10) memengaruhi 10 baris, dari baris ini, tujuh dapat diperbarui dan tiga disisipkan. Atau, satu dapat dihapus, lima diperbarui, dan empat disisipkan, dan sebagainya. Karena pernyataan MERGE melakukan pemindaian tabel penuh dari tabel sumber dan target, performa I/O dapat terpengaruh saat Anda menggunakan klausul TOP untuk memodifikasi tabel besar dengan membuat beberapa batch. Dalam skenario ini, penting untuk memastikan bahwa semua batch berturut-turut menargetkan baris baru.
Berhati-hatilah saat Anda menentukan klausa TOP dalam kueri yang berisi operator UNION, UNION ALL, EXCEPT, atau INTERSECT. Dimungkinkan untuk menulis kueri yang mengembalikan hasil yang tidak terduga karena urutan klausul TOP dan ORDER BY diproses secara logis tidak selalu intuitif ketika operator ini digunakan dalam operasi tertentu. Misalnya, mengingat tabel dan data berikut, asumsikan bahwa Anda ingin mengembalikan mobil merah paling murah dan mobil biru paling murah. Artinya, sedan merah dan van biru.
CREATE TABLE dbo.Cars(Model VARCHAR(15), Price MONEY, Color VARCHAR(10));
INSERT dbo.Cars VALUES
('sedan', 10000, 'red'), ('convertible', 15000, 'blue'),
('coupe', 20000, 'red'), ('van', 8000, 'blue');
Untuk mencapai hasil ini, Anda mungkin menulis kueri berikut.
SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
UNION ALL
SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC;
GO
Berikut ini adalah tataan hasil.
Model Color Price
------------- ---------- -------
sedan red 10000.00
convertible blue 15000.00
Hasil yang tidak terduga dikembalikan karena klausa TOP berjalan secara logis sebelum klausa ORDER BY, yang mengurutkan hasil operator (UNION ALL dalam kasus ini). Jadi, kueri sebelumnya mengembalikan satu mobil merah dan satu mobil biru dan kemudian memesan hasil dari serikat tersebut dengan harga. Contoh berikut menunjukkan metode penulisan kueri ini yang benar untuk mencapai hasil yang diinginkan.
SELECT Model, Color, Price
FROM (SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'red'
ORDER BY Price ASC) AS a
UNION ALL
SELECT Model, Color, Price
FROM (SELECT TOP(1) Model, Color, Price
FROM dbo.Cars
WHERE Color = 'blue'
ORDER BY Price ASC) AS b;
GO
Dengan menggunakan TOP dan ORDER BY dalam operasi subpilih, Anda memastikan bahwa hasil klausa ORDER BY diterapkan ke klausa TOP dan tidak mengurutkan hasil operasi UNION.
Berikut adalah hasil yang ditetapkan.
Model Color Price
------------- ---------- -------
sedan red 10000.00
van blue 8000.00
Batasan dan Pembatasan
Saat Anda menggunakan TOP dengan INSERT, UPDATE, MERGE, atau DELETE, baris yang dirujuk tidak diatur dalam urutan apa pun. Dan, Anda tidak dapat secara langsung menentukan klausul ORDER BY dalam pernyataan ini. Jika Anda perlu menggunakan TOP untuk menyisipkan, menghapus, atau memodifikasi baris dalam urutan kronologis yang bermakna, gunakan TOP dengan klausul ORDER BY yang ditentukan dalam pernyataan subpilih. Lihat bagian Contoh berikut di artikel ini.
Anda tidak dapat menggunakan TOP dalam pernyataan UPDATE dan DELETE pada tampilan yang dipartisi.
Anda tidak dapat menggabungkan TOP dengan OFFSET dan MENGAMBIL dalam ekspresi kueri yang sama (dalam cakupan kueri yang sama). Untuk informasi selengkapnya, lihat Klausul ORDER BY (Transact-SQL).
Contoh
Kategori | Elemen sintaksis unggulan |
---|---|
Sintaks dasar | ATAS * PERSEN |
Menyertakan nilai dasi | DENGAN IKATAN |
Membatasi baris yang terpengaruh oleh DELETE, INSERT, atau UPDATE | HAPUS * SISIPKAN * PERBARUI |
Sintaks dasar
Contoh di bagian ini menunjukkan fungsionalitas dasar klausul ORDER BY menggunakan sintaks minimum yang diperlukan.
J. Menggunakan TOP dengan nilai konstanta
Contoh berikut menggunakan nilai konstanta untuk menentukan jumlah karyawan yang dikembalikan dalam kumpulan hasil kueri. Dalam contoh pertama, 10 baris pertama yang tidak ditentukan dikembalikan karena klausa ORDER BY tidak digunakan. Dalam contoh kedua, klausul ORDER BY digunakan untuk mengembalikan 10 karyawan teratas yang baru saja dipekerjakan.
USE AdventureWorks2022;
GO
-- Select the first 10 random employees.
SELECT TOP(10)JobTitle, HireDate
FROM HumanResources.Employee;
GO
-- Select the first 10 employees hired most recently.
SELECT TOP(10)JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
B. Menggunakan TOP dengan variabel
Contoh berikut menggunakan variabel untuk menentukan jumlah karyawan yang dikembalikan dalam kumpulan hasil kueri.
USE AdventureWorks2022;
GO
DECLARE @p AS INT = 10;
SELECT TOP(@p)JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO
C. Menentukan persentase
Contoh berikut menggunakan PERCENT untuk menentukan jumlah karyawan yang dikembalikan dalam kumpulan hasil kueri. Ada 290 karyawan dalam HumanResources.Employee
tabel. Karena lima persen dari 290 adalah nilai pecahan, nilai dibulatkan ke atas ke bilangan bulat berikutnya.
USE AdventureWorks2022;
GO
SELECT TOP(5)PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
Menyertakan nilai dasi
J. Menggunakan WITH TIES untuk menyertakan baris yang cocok dengan nilai di baris terakhir
Contoh berikut mendapatkan persentase teratas 10
dari semua karyawan dengan gaji tertinggi dan mengembalikannya dalam urutan menurun sesuai dengan gaji mereka. Menentukan WITH TIES
memastikan bahwa karyawan dengan gaji yang sama dengan gaji terendah yang dikembalikan (baris terakhir) juga disertakan dalam tataan hasil, bahkan jika melebihi 10
persentase karyawan.
USE AdventureWorks2022;
GO
SELECT TOP(10) PERCENT WITH TIES
pp.FirstName, pp.LastName, e.JobTitle, e.Gender, r.Rate
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN HumanResources.EmployeePayHistory AS r
ON r.BusinessEntityID = e.BusinessEntityID
ORDER BY Rate DESC;
GO
Membatasi baris yang terpengaruh oleh DELETE, INSERT, atau UPDATE
J. Menggunakan TOP untuk membatasi jumlah baris yang dihapus
Saat Anda menggunakan klausa TOP (n) dengan DELETE, operasi penghapusan dilakukan pada pilihan n jumlah baris yang tidak ditentukan. Artinya, pernyataan DELETE memilih jumlah baris (n) apa pun yang memenuhi kriteria yang ditentukan dalam klausa WHERE. Contoh berikut menghapus 20
baris dari PurchaseOrderDetail
tabel yang memiliki tanggal jatuh tempo lebih awal dari 1 Juli 2002.
USE AdventureWorks2022;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Jika Anda ingin menggunakan TOP untuk menghapus baris dalam urutan kronologis yang bermakna, gunakan TOP dengan ORDER BY dalam pernyataan subpilih. Kueri berikut menghapus 10 baris PurchaseOrderDetail
tabel yang memiliki tanggal jatuh tempo paling awal. Untuk memastikan bahwa hanya 10 baris yang dihapus, kolom yang ditentukan dalam pernyataan subpilih (PurchaseOrderID
) adalah kunci utama tabel. Menggunakan kolom non-kunci dalam pernyataan subpilih dapat mengakibatkan penghapusan lebih dari 10 baris jika kolom yang ditentukan berisi nilai duplikat.
USE AdventureWorks2022;
GO
DELETE FROM Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN
(SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC);
GO
B. Menggunakan TOP untuk membatasi jumlah baris yang disisipkan
Contoh berikut membuat tabel EmployeeSales
dan menyisipkan nama dan data penjualan tahunan hingga saat ini untuk lima karyawan teratas dari tabel HumanResources.Employee
. Pernyataan INSERT memilih lima baris yang dikembalikan oleh SELECT
pernyataan yang memenuhi kriteria yang ditentukan dalam klausa WHERE. Klausa OUTPUT menampilkan baris yang disisipkan ke EmployeeSales
dalam tabel. Perhatikan bahwa klausul ORDER BY dalam pernyataan SELECT tidak digunakan untuk menentukan lima karyawan teratas.
USE AdventureWorks2022;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( EmployeeID NVARCHAR(11) NOT NULL,
LastName NVARCHAR(20) NOT NULL,
FirstName NVARCHAR(20) NOT NULL,
YearlySales MONEY NOT NULL
);
GO
INSERT TOP(5)INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales
SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO
Jika Anda ingin menggunakan TOP untuk menyisipkan baris dalam urutan kronologis yang bermakna, gunakan TOP dengan ORDER BY dalam pernyataan subpilih. Contoh berikut menunjukkan cara melakukan ini. Klausa OUTPUT menampilkan baris yang disisipkan ke EmployeeSales
dalam tabel. Perhatikan bahwa lima karyawan teratas sekarang dimasukkan berdasarkan hasil klausul ORDER BY alih-alih baris yang tidak ditentukan.
INSERT INTO dbo.EmployeeSales
OUTPUT inserted.EmployeeID, inserted.FirstName, inserted.LastName, inserted.YearlySales
SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD
FROM Sales.SalesPerson AS sp
INNER JOIN Person.Person AS c
ON sp.BusinessEntityID = c.BusinessEntityID
WHERE sp.SalesYTD > 250000.00
ORDER BY sp.SalesYTD DESC;
GO
C. Menggunakan TOP untuk membatasi jumlah baris yang diperbarui
Contoh berikut menggunakan klausul TOP untuk memperbarui baris dalam tabel. Saat Anda menggunakan klausa TOP (n) dengan UPDATE, operasi pembaruan berjalan pada jumlah baris yang tidak ditentukan. Artinya, pernyataan UPDATE memilih jumlah baris (n) apa pun yang memenuhi kriteria yang ditentukan dalam klausa WHERE. Contoh berikut menetapkan 10 pelanggan dari satu tenaga penjual ke tenaga penjual lainnya.
USE AdventureWorks2022;
UPDATE TOP (10) Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
Jika Anda harus menggunakan TOP untuk menerapkan pembaruan dalam kronologi yang bermakna, Anda harus menggunakan TOP bersama dengan ORDER BY dalam pernyataan subpilih. Contoh berikut memperbarui jam liburan 10 karyawan dengan tanggal sewa paling awal.
UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee
ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO
Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)
Contoh berikut mengembalikan 31 baris teratas yang cocok dengan kriteria kueri. Klausa ORDER BY memastikan bahwa 31 baris yang dikembalikan adalah 31 baris pertama berdasarkan urutan LastName
alfabet kolom.
Menggunakan TOP tanpa menentukan ikatan.
SELECT TOP (31) FirstName, LastName
FROM DimEmployee ORDER BY LastName;
Hasil: 31 baris dikembalikan.
Menggunakan TOP, menentukan WITH TIES.
SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee ORDER BY LastName;
Hasil: 33 baris dikembalikan, karena tiga karyawan bernama Brown dasi untuk baris ke-31.
Lihat Juga
SELECT (Transact-SQL)
INSERT (Transact-SQL)
UPDATE (Transact-SQL)
DELETE (Transact-SQL)
Klausul ORDER BY (Transact-SQL)
SET ROWCOUNT (Transact-SQL)
MERGE (Transact-SQL)