TOP (Transact-SQL)
Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnalytics Platform Sistemi (PDW)SQL analiz uç noktası microsoft fabricAmbarı'nda Microsoft FabricSQL veritabanında Microsoft Fabric
Sorgu sonuç kümesinde döndürülen satırları SQL Server'da belirtilen sayıda satır veya satır yüzdesiyle sınırlar.
ORDER BY
yan tümcesiyle TOP
kullandığınızda, sonuç kümesi ilk n sıralı satır sayısıyla sınırlıdır. Aksi takdirde, TOP
tanımlanmamış bir sırada ilk n satır sayısını döndürür.
SELECT
deyiminden döndürülen satır sayısını belirtmek için bu yan tümceyi kullanın. Veya INSERT
, UPDATE
, MERGE
veya DELETE
deyiminden etkilenen satırları belirtmek için TOP
kullanın.
Transact-SQL söz dizimi kuralları
Sözdizimi
SQL Server ve Azure SQL Veritabanı söz dizimi:
[
TOP (expression) [ PERCENT ]
[ WITH TIES ]
]
Azure Synapse Analytics ve Analytics Platform Sistemi (PDW) için söz dizimi:
[
TOP ( expression )
[ WITH TIES ]
]
Bağımsız değişken
ifade
Döndürülecek satır sayısını belirten sayısal ifade.
ifade, PERCENT
belirtirseniz örtük olarak float değerine dönüştürülür. Aksi takdirde, ifadebigintdönüştürülür.
YÜZDE
Sorgunun sonuç kümesindeki satırların yüzdesini yalnızca ilk
TIES ile
Sınırlı sonuç kümesindeki son yer için birbirine bağlı iki veya daha fazla satır döndürür. Bu bağımsız değişkeni ORDER BY
yan tümcesiyle kullanmanız gerekir. 5
olarak ayarlandıysa ancak 5. satırdaki ORDER BY
sütunlarının değerleriyle eşleşen iki satır daha varsa, sonuç kümesi yedi satır içerir.
TOP
yan tümcesini yalnızca SELECT
deyimlerinde WITH TIES
bağımsız değişkeniyle ve yalnızca ORDER BY
yan tümcesini de belirtirseniz belirtebilirsiniz. Döndürülen kayıt bağlama sırası rastgeledir.
ORDER BY
bu kuralı etkilemez.
En iyi yöntemler
SELECT
deyiminde her zaman TOP
yan tümcesiyle bir ORDER BY
yan tümcesi kullanın. bu, TOP
hangi satırların etkilendiğini tahmin edilebilir şekilde belirtmenin tek yoludur.
Sorgu disk belleği çözümü uygulamak için TOP
yan tümcesi yerine ORDER BY
yan tümcesinde OFFSET
ve FETCH
kullanın. Disk belleği çözümünün (örneğin, istemciye veri öbekleri veya
Döndürülen satır sayısını sınırlamak için SET ROWCOUNT
yerine TOP
(veya OFFSET
ve FETCH
) kullanın. Bu yöntemler, aşağıdaki nedenlerle SET ROWCOUNT
kullanmak yerine tercih edilir:
-
SELECT
deyiminin bir parçası olarak, sorgu iyileştiricisi sorgu iyileştirme sırasındaTOP
veyaFETCH
yan tümcelerinde ifade değerini göz önünde bulundurabilir. Sorgu çalıştıran bir deyimin dışındaSET ROWCOUNT
kullandığınızdan, değeri sorgu planında dikkate alınamaz.
Uyumluluk desteği
Geriye dönük uyumluluk için ifade bir tamsayı sabitiyse SELECT
deyimlerinde parantezler isteğe bağlıdır.
SELECT
deyimlerinde TOP
için her zaman parantez kullanmanızı öneririz. Bunu yapmak, INSERT
, UPDATE
, MERGE
ve DELETE
deyimlerinde gerekli kullanımıyla tutarlılık sağlar.
Birlikte çalışabilirlik
TOP
ifadesi, tetikleyici nedeniyle çalışabilecek deyimleri etkilemez. Tetikleyicilerdeki inserted
ve deleted
tabloları yalnızca INSERT
, UPDATE
, MERGE
veya DELETE
deyimlerinden gerçekten etkilenen satırları döndürür. Örneğin, bir INSERT TRIGGER
TOP
yan tümcesi kullanan bir INSERT
deyiminin sonucu olarak tetiklendiğinde.
SQL Server, görünümler aracılığıyla satırların güncelleştirilmesini sağlar.
TOP
yan tümcesini görünüm tanımına ekleyebildiğiniz için, satırlar artık güncelleştirme nedeniyle TOP
ifadesinin gereksinimlerini karşılamıyorsa, bazı satırlar görünümden kaybolabilir.
TOP
yan tümcesi, birleştirilen satır sayısını belirtilen değere daha da azaltır ve kalan birleştirilmiş satırlara sıralamasız bir şekilde ekleme, güncelleştirme veya silme eylemleri uygulanır. Yani, satırların WHEN
yan tümcelerinde tanımlanan eylemler arasında dağıtıldığı bir sıra yoktur. Örneğin, TOP (10)
belirtilmesi 10 satırı etkiliyorsa, bu satırlardan yedisi güncelleştirilebilir ve üç satır eklenebilir. Ya da biri silinmiş, beş tanesi güncelleştirilmiş, dört tanesi eklenmiş vb. olabilir.
MERGE
deyimi hem kaynak hem de hedef tabloların tam tablo taramasını yaptığı için, birden çok toplu işlem oluşturarak büyük bir tabloyu değiştirmek için TOP
yan tümcesini kullandığınızda G/Ç performansı etkilenebilir. Bu senaryoda, ardışık tüm toplu işlerde yeni satırların hedeflediğinden emin olmak önemlidir.
UNION
, UNION ALL
, EXCEPT
veya INTERSECT
işleci içeren bir sorguda TOP
yan tümcesini belirtirken dikkatli olun.
TOP
ve ORDER BY
yan tümcelerinin mantıksal olarak işlenme sırası, bu işleçler seçme işleminde kullanıldığında her zaman sezgisel olmadığından beklenmeyen sonuçlar döndüren bir sorgu yazabilirsiniz. Örneğin, aşağıdaki tablo ve veriler göz önüne alındığında, en düşük maliyetli kırmızı ve en düşük maliyetli mavi arabayı döndürmek istediğinizi varsayalım. Yani, kırmızı sedan ve mavi minibüs.
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');
Bu sonuçları elde etmek için aşağıdaki sorguyu yazabilirsiniz.
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
Sonuç kümesi aşağıdadır.
Model Color Price
------------- ---------- -------
sedan red 10000.00
convertible blue 15000.00
beklenmeyen sonuçlar döndürülür çünkü TOP
yan tümcesi, işlecin sonuçlarını sıralayan ORDER BY
yan tümcesi (bu durumdaUNION ALL
) önce mantıksal olarak çalışır. Bu nedenle, önceki sorgu herhangi bir kırmızı arabayı ve herhangi bir mavi arabayı döndürür ve ardından bu birleşimin sonucunu fiyata göre sipariş verir. Aşağıdaki örnekte, istenen sonucu elde etmek için bu sorguyu yazmanın doğru yöntemi gösterilmektedir.
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
Alt seçim işleminde TOP
ve ORDER BY
kullanarak, ORDER BY
yan tümcesinin sonuçlarının UNION
işleminin sonucunu sıralamamak için TOP
yan tümcesine uygulandığından emin olursunuz.
Sonuç kümesi aşağıdadır.
Model Color Price
------------- ---------- -------
sedan red 10000.00
van blue 8000.00
Sınırlama
INSERT
, UPDATE
, MERGE
veya DELETE
ile TOP
kullandığınızda, başvuruda bulunan satırlar herhangi bir sırada düzenlenemez. Ayrıca, bu deyimlerde ORDER BY
yan tümcesini doğrudan belirtemezsiniz. Anlamlı bir kronolojik sırada satır eklemek, silmek veya değiştirmek için TOP
kullanmanız gerekiyorsa, TOP
alt seçim deyiminde belirtilen bir ORDER BY
yan tümcesiyle kullanın. Bu makaledeki Örnekleri bölümüne bakın.
bölümlenmiş görünümlerde UPDATE
veya DELETE
deyimlerinde TOP
kullanamazsınız.
TOP
aynı sorgu ifadesinde (aynı sorgu kapsamında) OFFSET
ve FETCH
birleştiremezsiniz. Daha fazla bilgi için bkz. select - ORDER BY yan tümcesi
Örnekler
Bu makaledeki Transact-SQL kod örnekleri, Microsoft SQL Server Örnekleri ve Topluluk Projeleri giriş sayfasından indirebileceğiniz AdventureWorks2022
veya AdventureWorksDW2022
örnek veritabanını kullanır.
Kategori | Öne çıkan söz dizimi öğeleri |
---|---|
Temel söz dizimi | TOP * PERCENT |
Bağlama değerleri dahil | WITH TIES |
DELETE, INSERT veya UPDATE etkilenen satırları sınırlama |
DELETE , INSERT , UPDATE |
Temel söz dizimi
Bu bölümdeki örneklerde, gerekli en düşük söz dizimi kullanılarak ORDER BY
yan tümcesinin temel işlevleri gösterilmektedir.
A. SABIT değerle TOP kullanma
Aşağıdaki örneklerde, sorgu sonuç kümesinde döndürülen çalışan sayısını belirtmek için sabit bir değer kullanılır. İlk örnekte, ORDER BY
yan tümcesi kullanılmadığından ilk 10 tanımsız satır döndürülür. İkinci örnekte, en son işe alınan ilk 10 çalışanı döndürmek için bir ORDER BY
yan tümcesi kullanılır.
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. TOP'i değişkenle kullanma
Aşağıdaki örnek, sorgu sonuç kümesinde döndürülen çalışan sayısını belirtmek için bir değişken kullanır.
USE AdventureWorks2022;
GO
DECLARE @p AS INT = 10;
SELECT TOP (@p) JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO
C. Yüzde belirtme
Aşağıdaki örnek, sorgu sonuç kümesinde döndürülen çalışan sayısını belirtmek için PERCENT
kullanır.
HumanResources.Employee
tablosunda 290 çalışan vardır. 290'ın yüzde beşi kesirli bir değer olduğundan, değer bir sonraki tamsayıya yuvarlanir.
USE AdventureWorks2022;
GO
SELECT TOP (5) PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
Bağlama değerlerini dahil et
A. Son satırdaki değerlerle eşleşen satırları eklemek için WITH TIES kullanma
Aşağıdaki örnek, en yüksek maaşa sahip tüm çalışanların ilk 10
yüzdesini alır ve maaşlarına göre azalan düzende döndürür.
WITH TIES
belirtilmesi, maaşları döndürülen en düşük maaşa (son satır) eşit olan çalışanların, çalışanların yüzde 10
'sini aşsa bile sonuç kümesine dahil edilmesini sağlar.
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
DELETE, INSERT veya UPDATE'in etkilediği satırları sınırlama
A. Silinen satır sayısını sınırlamak için TOP kullanın
DELETE
ile bir TOP (<n>)
yan tümcesi kullandığınızda, silme işlemi n sayıda satırdan oluşan tanımsız bir seçimde gerçekleştirilir. Başka bir DELETE
deyimi, WHERE
yan tümcesinde tanımlanan ölçütleri karşılayan satır sayısını (n) seçer. Aşağıdaki örnek, son tarihleri 1 Temmuz 2002'den önce olan PurchaseOrderDetail
tablosundan 20
satırları siler.
USE AdventureWorks2022;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Satırları anlamlı bir kronolojik sırayla silmek için TOP
kullanmak istiyorsanız, alt seçim deyiminde ORDER BY
ile TOP
kullanın. Aşağıdaki sorgu, PurchaseOrderDetail
tablosunun en erken son tarihlere sahip 10 satırını siler. Yalnızca 10 satırın silindiğinden emin olmak için, alt seçim deyiminde (PurchaseOrderID
) belirtilen sütun tablonun birincil anahtarıdır. Subselect deyiminde anahtar olmayan bir sütun kullanılması, belirtilen sütun yinelenen değerler içeriyorsa 10'dan fazla satırın silinmesine neden olabilir.
USE AdventureWorks2022;
GO
DELETE Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN (
SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC
);
GO
B. Eklenen satır sayısını sınırlamak için TOP kullanın
Aşağıdaki örnek, tablo EmployeeSales
oluşturur ve HumanResources.Employee
tablosundan ilk beş çalışanın adını ve yıllık satış verilerini ekler.
INSERT
deyimi, WHERE
yan tümcesinde tanımlanan ölçütleri karşılayan SELECT
deyimi tarafından döndürülen beş satırı seçer.
OUTPUT
yan tümcesi, EmployeeSales
tablosuna eklenen satırları görüntüler.
SELECT
deyimindeki ORDER BY
yan tümcesi ilk beş çalışanı belirlemek için kullanılmaz.
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
Anlamlı bir kronolojik sırada satır eklemek için TOP
kullanmak istiyorsanız, alt seçim deyiminde ORDER BY
ile TOP
kullanın. Aşağıdaki örnekte bunun nasıl yapıldığını gösterilmektedir.
OUTPUT
yan tümcesi, EmployeeSales
tablosuna eklenen satırları görüntüler. İlk beş çalışan artık tanımlanmamış satırlar yerine ORDER BY
yan tümcesinin sonuçlarına göre eklenir.
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. Güncelleştirilen satır sayısını sınırlamak için TOP kullanın
Aşağıdaki örnekte tablodaki satırları güncelleştirmek için TOP
yan tümcesi güncelleştirilir.
UPDATE
ile bir TOP (<n>)
yan tümcesi kullandığınızda, güncelleştirme işlemi tanımlanmamış sayıda satırda çalışır. Başka bir UPDATE
deyimi, WHERE
yan tümcesinde tanımlanan ölçütleri karşılayan satır sayısını (n) seçer. Aşağıdaki örnek, bir satış temsilcisinden diğerine 10 müşteri atar.
USE AdventureWorks2022;
UPDATE TOP (10)
Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
Güncelleştirmeleri anlamlı bir kronolojide uygulamak için TOP
kullanmanız gerekiyorsa, alt seçim deyimindeki ORDER BY
ile birlikte TOP
kullanmanız gerekir. Aşağıdaki örnek, 10 çalışanın tatil saatlerini en erken işe alma tarihleriyle güncelleştirir.
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
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
Aşağıdaki örnek, sorgu ölçütlerine uyan ilk 31 satırı döndürür.
ORDER BY
yan tümcesi, döndürülen 31 satırın LastName
sütununun alfabetik sırasına göre ilk 31 satır olmasını sağlar.
Bağlama belirtmeden TOP
kullanma.
SELECT TOP (31) FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Sonuç: 31 satır döndürülür.
TOP
kullanarak WITH TIES
belirtin.
SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
Sonuç: 31. satır için Brown
adlı üç çalışan bağlı olduğundan 33 satır döndürülür.
İlgili içerik
- SELECT (Transact-SQL)
- INSERT (Transact-SQL)
- UPDATE (Transact-SQL)
- DELETE (Transact-SQL)
- SELECT - ORDER BY yan tümcesi (Transact-SQL)
- SET ROWCOUNT (Transact-SQL)
- MERGE (Transact-SQL)