Aracılığıyla paylaş


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, MERGEveya 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, PERCENTbelirtirseniz ö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 ifadesini döndürdüğünü gösterir. Kesirli değerler bir sonraki tamsayı değerine yuvarlanir.

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. ,ifadesinde belirtilen değerden daha fazla satır döndürülmasına neden olabilir. Örneğin, ifade5 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, TOPhangi 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 sayfaları gönderme) ve yan tümceleri kullanılarak uygulanması daha kolaydır. Daha fazla bilgi için bkz. select - ORDER BY yan tümcesi.

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ında TOP veya FETCH yan tümcelerinde ifade değerini göz önünde bulundurabilir. Sorgu çalıştıran bir deyimin dışında SET 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, MERGEve 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, MERGEveya DELETE deyimlerinden gerçekten etkilenen satırları döndürür. Örneğin, bir INSERT TRIGGERTOP 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.

deyiminde belirtildiğinde, yan tümcesi kaynak tablonun tamamı ve hedef tablonun tamamı birleştirildikten sonra uygulanır. Ekleme, güncelleştirme veya silme eylemi için uygun olmayan birleştirilmiş satırlar da kaldırılır. 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, EXCEPTveya 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, MERGEveya DELETEile 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

DELETEile 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.Employeetablosundan 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. UPDATEile 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.

TOPkullanarak WITH TIESbelirtin.

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.