TOP(Transact-SQL)
적용 대상:Microsoft Fabric의 Microsoft Fabric SQL 데이터베이스에 있는 Microsoft Fabric Warehouse의 SQL Server Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)SQL 분석 엔드포인트
쿼리 결과 집합에 반환되는 행을 SQL Server에서 지정한 행 수 또는 행의 백분율로 제한합니다.
ORDER BY
절과 함께 TOP
사용하면 결과 집합이 첫 번째 n 정렬된 행 수로 제한됩니다. 그렇지 않으면 TOP
첫 번째 n개의 행 수를 정의되지 않은 순서로 반환합니다. 이 절을 사용하여 SELECT
문에서 반환되는 행 수를 지정합니다. 또는 TOP
사용하여 INSERT
, UPDATE
, MERGE
또는 DELETE
문의 영향을 받는 행을 지정합니다.
구문
SQL Server 및 Azure SQL Database에 대한 구문:
[
TOP (expression) [ PERCENT ]
[ WITH TIES ]
]
Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)에 대한 구문:
[
TOP ( expression )
[ WITH TIES ]
]
인수
expression
반환할 행 개수를 지정하는 숫자 식입니다.
PERCENT
지정하면 식 암시적으로 float 값으로 변환됩니다. 그렇지 않으면 expression이 bigint로 변환됩니다.
PERCENT
쿼리 결과 집합에서 처음 expression%의 행만 반환됨을 나타냅니다. 소수 값은 다음 정수 값으로 올림됩니다.
WITH TIES
제한된 결과 집합의 마지막 위치에 대해 일치하는 둘 이상의 행을 반환합니다. 이 인수는 ORDER BY
절과 함께 사용해야 합니다.
WITH TIES
식지정된 값보다 더 많은 행이 반환될 수 있습니다. 예를 들어 식5
설정되었지만 행 5의 ORDER BY
열 값과 일치하는 행이 두 개 더 있으면 결과 집합에 7개의 행이 포함됩니다.
SELECT
문에서만 WITH TIES
인수를 사용하여 TOP
절을 지정할 수 있으며 ORDER BY
절도 지정할 경우에만 지정할 수 있습니다. 연결 레코드의 반환 순서는 임의로 지정됩니다.
ORDER BY
이 규칙에 영향을 주지 않습니다.
모범 사례
SELECT
문에서는 항상 TOP
절과 함께 ORDER BY
절을 사용합니다. 이는 TOP
영향을 받는 행을 예측할 수 있는 유일한 방법입니다.
TOP
절 대신 ORDER BY
절에서 OFFSET
및 FETCH
사용하여 쿼리 페이징 솔루션을 구현합니다. 페이징 솔루션(즉, 클라이언트에 데이터 청크 또는
SET ROWCOUNT
대신 TOP
(또는 OFFSET
및 FETCH
)을 사용하여 반환되는 행 수를 제한합니다. 이러한 메서드는 다음과 같은 이유로 SET ROWCOUNT
사용하는 것이 좋습니다.
- 쿼리 최적화 프로그램은
SELECT
문의 일부로 쿼리 최적화 중에TOP
또는FETCH
절에서 식 값을 고려할 수 있습니다. 쿼리를 실행하는 문 외부에서SET ROWCOUNT
사용하므로 쿼리 계획에서 해당 값을 고려할 수 없습니다.
호환성 지원
이전 버전과의 호환성을 위해 식이 정수 상수인 경우 SELECT
문에서 괄호는 선택 사항입니다. 항상 SELECT
문에서 TOP
괄호를 사용하는 것이 좋습니다. 이렇게 하면 INSERT
, UPDATE
, MERGE
및 DELETE
문에서 필요한 사용과 일관성을 제공합니다.
상호 운용성
TOP
식은 트리거로 인해 실행될 수 있는 문에 영향을 주지 않습니다. 트리거의 inserted
및 deleted
테이블은 INSERT
, UPDATE
, MERGE
또는 DELETE
문의 영향을 받는 행만 반환합니다. 예를 들어 INSERT TRIGGER
TOP
절을 사용한 INSERT
문의 결과로 발생하는 경우입니다.
SQL Server에서는 뷰를 통해 행을 업데이트할 수 있습니다. 뷰 정의에 TOP
절을 포함할 수 있으므로 행이 업데이트로 인해 TOP
식의 요구 사항을 더 이상 충족하지 않으면 특정 행이 보기에서 사라질 수 있습니다.
TOP
절은 조인된 행의 수를 지정된 값으로 더 줄이며 삽입, 업데이트 또는 삭제 작업은 정렬되지 않은 방식으로 나머지 조인된 행에 적용됩니다. 즉, 행이 WHEN
절에 정의된 작업 간에 분산되는 순서는 없습니다. 예를 들어 TOP (10)
지정하면 10개의 행에 영향을 주면 이러한 행 중 7개가 업데이트되고 3개가 삽입될 수 있습니다. 또는 1개가 삭제되고, 5개가 업데이트되고, 4개가 삽입될 수 있습니다.
MERGE
문은 원본 테이블과 대상 테이블 모두에 대한 전체 테이블 검사를 수행하므로 TOP
절을 사용하여 여러 일괄 처리를 만들어 큰 테이블을 수정할 때 I/O 성능에 영향을 미칠 수 있습니다. 이러한 시나리오에서 연속된 모든 일괄 처리는 새로운 행을 대상으로 해야 합니다.
UNION
, UNION ALL
, EXCEPT
또는 INTERSECT
연산자가 포함된 쿼리에서 TOP
절을 지정할 때는 주의해야 합니다.
TOP
및 ORDER BY
절이 논리적으로 처리되는 순서가 선택 연산에서 사용되는 경우 항상 직관적이지 않기 때문에 예기치 않은 결과를 반환하는 쿼리를 작성할 수 있습니다. 예를 들어 다음 테이블 및 데이터에서 가장 저렴한 빨간색 차와 가장 저렴한 파란색 차, 즉 red sedan과 blue van을 반환하려는 경우를 가정해 봅니다.
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');
이러한 결과를 얻기 위해 다음과 같은 쿼리를 작성할 수 있습니다.
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
결과 집합은 다음과 같습니다.
Model Color Price
------------- ---------- -------
sedan red 10000.00
convertible blue 15000.00
TOP
절이 연산자의 결과를 정렬하는 ORDER BY
절 앞에 논리적으로 실행되기 때문에 예기치 않은 결과가 반환됩니다(이 경우UNION ALL
). 따라서 이전 쿼리는 임의의 빨간색 차와 임의의 파란색 차를 반환한 다음 이 합집합의 결과를 가격순으로 정렬합니다. 다음 예에서는 원하는 결과를 얻을 수 있도록 이 쿼리를 올바르게 작성하는 방법을 보여 줍니다.
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
하위 선택 작업에서 TOP
및 ORDER BY
사용하여 ORDER BY
절의 결과가 UNION
작업의 결과를 정렬하지 않고 TOP
절에 적용되도록 합니다.
결과 집합은 다음과 같습니다.
Model Color Price
------------- ---------- -------
sedan red 10000.00
van blue 8000.00
제한
INSERT
, UPDATE
, MERGE
또는 DELETE
TOP
사용하면 참조된 행이 순서대로 정렬되지 않습니다. 또한 이러한 문에는 ORDER BY
절을 직접 지정할 수 없습니다.
TOP
사용하여 의미 있는 시간순으로 행을 삽입, 삭제 또는 수정해야 하는 경우 하위 선택 문에 지정된 ORDER BY
절과 함께 TOP
사용합니다. 이 문서의 예제 섹션을 참조하세요.
분할된 뷰의 UPDATE
또는 DELETE
문에는 TOP
사용할 수 없습니다.
동일한 쿼리 식(동일한 쿼리 범위)에서 TOP
OFFSET
및 FETCH
결합할 수 없습니다. 자세한 내용은 SELECT - ORDER BY 절참조하세요.
예제
이 문서의 Transact-SQL 코드 샘플은 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있는 AdventureWorks2022
또는 AdventureWorksDW2022
샘플 데이터베이스를 사용합니다.
범주 | 중요한 구문 요소 |
---|---|
기본 구문 | TOP * PERCENT |
동률 값 포함 | WITH TIES |
DELETE, INSERT 또는 UPDATE의 영향을 받는 행 제한 |
DELETE , INSERT , UPDATE |
기본 구문
이 섹션의 예제에서는 필요한 최소 구문을 사용하여 ORDER BY
절의 기본 기능을 보여 줍니다.
A. 상수 값으로 TOP 사용
다음 예에서는 상수 값을 사용하여 쿼리 결과 집합에 반환되는 직원 수를 지정합니다. 첫 번째 예제에서는 ORDER BY
절이 사용되지 않으므로 처음 10개의 정의되지 않은 행이 반환됩니다. 두 번째 예제에서는 ORDER BY
절을 사용하여 최근에 고용된 상위 10명의 직원을 반환합니다.
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 사용
다음 예에서는 변수를 사용하여 쿼리 결과 집합에 반환되는 직원 수를 지정합니다.
USE AdventureWorks2022;
GO
DECLARE @p AS INT = 10;
SELECT TOP (@p) JobTitle, HireDate, VacationHours
FROM HumanResources.Employee
ORDER BY VacationHours DESC;
GO
C. 백분율 지정
다음 예제에서는 PERCENT
사용하여 쿼리 결과 집합에 반환되는 직원 수를 지정합니다.
HumanResources.Employee
테이블에 290명의 직원이 있습니다. 290의 5%는 소수이므로 값이 다음 정수로 반올림됩니다.
USE AdventureWorks2022;
GO
SELECT TOP (5) PERCENT JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY HireDate DESC;
GO
동률 값 포함
A. WITH TIES를 사용하여 마지막 행의 값과 일치하는 행 포함
다음 예에서는 급여가 가장 많은 10
%의 직원을 검색하여 급여에 따라 내림차순으로 반환합니다.
WITH TIES
를 지정하면 가장 급여가 낮은 직원(마지막 행)이 여러 명이어서 10
%를 넘는 경우에도 해당하는 직원이 모두 결과 집합에 포함됩니다.
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 또는 UPDATE의 영향을 받는 행 제한
A. TOP을 사용하여 삭제된 행 수 제한
DELETE
TOP (<n>)
절을 사용하면 정의되지 않은 n개 행 수에 대해 삭제 작업이 수행됩니다. 즉, DELETE
문은 WHERE
절에 정의된 조건을 충족하는 모든(n) 행 수를 선택합니다. 다음 예에서는 20
테이블에서 기한이 2002년 7월 1일 이전인 행 중 PurchaseOrderDetail
개의 행을 삭제합니다.
USE AdventureWorks2022;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
TOP
사용하여 의미 있는 시간순으로 행을 삭제하려면 하위 선택 문에서 ORDER BY
TOP
사용합니다. 다음 쿼리는 PurchaseOrderDetail
테이블에서 기한이 가장 빠른 10개의 행을 삭제합니다. 10개의 행만 삭제하기 위해 하위 SELECT 문에서 지정한 열(PurchaseOrderID
)은 테이블의 기본 키입니다. 하위 선택 문에서 키가 아닌 열을 사용하면 지정된 열에 중복 값이 포함된 경우 10개 이상의 행이 삭제될 수 있습니다.
USE AdventureWorks2022;
GO
DELETE Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN (
SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC
);
GO
B. TOP을 사용하여 삽입된 행 수 제한
다음 예에서는 EmployeeSales
테이블을 만들고 HumanResources.Employee
테이블에서 가져온 직원 상위 5명에 대한 이름 및 연간 매출 데이터를 삽입합니다.
INSERT
문은 WHERE
절에 정의된 조건을 충족하는 SELECT
문에서 반환된 5개의 행을 선택합니다.
OUTPUT
절은 EmployeeSales
테이블에 삽입되는 행을 표시합니다.
SELECT
문의 ORDER BY
절은 상위 5명의 직원을 결정하는 데 사용되지 않습니다.
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
TOP
사용하여 의미 있는 시간순으로 행을 삽입하려면 하위 선택 문에서 ORDER BY
TOP
사용합니다. 다음 예제에서는 이 작업을 수행하는 방법을 보여줍니다.
OUTPUT
절은 EmployeeSales
테이블에 삽입되는 행을 표시합니다. 이제 상위 5명의 직원이 정의되지 않은 행 대신 ORDER BY
절의 결과에 따라 삽입됩니다.
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. TOP을 사용하여 업데이트된 행 수 제한
다음 예제에서는 TOP
절을 사용하여 테이블의 행을 업데이트합니다.
UPDATE
TOP (<n>)
절을 사용하는 경우 업데이트 작업은 정의되지 않은 수의 행에서 실행됩니다. 즉, UPDATE
문은 WHERE
절에 정의된 조건을 충족하는 모든(n) 행 수를 선택합니다. 다음 예에서는 한 영업 직원의 고객 10명을 다른 영업 직원에게 지정합니다.
USE AdventureWorks2022;
UPDATE TOP (10)
Sales.Store
SET SalesPersonID = 276
WHERE SalesPersonID = 275;
GO
TOP
사용하여 의미 있는 연대로 업데이트를 적용해야 하는 경우 하위 선택 문의 ORDER BY
함께 TOP
사용해야 합니다. 다음 예에서는 채용일이 가장 빠른 직원 10명의 휴가 기간을 업데이트합니다.
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
예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)
다음 예제에서는 쿼리 조건과 일치하는 상위 31개 행을 반환합니다.
ORDER BY
절은 반환된 31개 행이 LastName
열의 사전순 순서에 따라 처음 31개 행인지 확인합니다.
관계를 지정하지 않고 TOP
사용합니다.
SELECT TOP (31) FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
결과: 31개 행이 반환됩니다.
TOP
사용하여 WITH TIES
지정합니다.
SELECT TOP (31) WITH TIES FirstName, LastName
FROM DimEmployee
ORDER BY LastName;
결과: 31번째 행에 Brown
이름이 지정된 직원 3명이 동률이므로 33개의 행이 반환됩니다.