TOP(Transact-SQL)
쿼리 결과에서 첫 번째 행 집합만 반환됨을 지정합니다. 행 집합은 행의 수 또는 백분율이 될 수 있습니다. TOP 식은 SELECT, INSERT, UPDATE, MERGE 및 DELETE 문에 사용할 수 있습니다.
구문
[
TOP (expression) [PERCENT]
[ WITH TIES ]
]
인수
expression
반환할 행의 수를 지정하는 숫자 식입니다. PERCENT가 지정된 경우 expression은 암시적으로 float 값으로 변환됩니다. 그렇지 않은 경우에는 bigint로 변환됩니다.INSERT, UPDATE, MERGE 및 DELETE 문의 TOP에서는 괄호를 사용하여 expression을 구분해야 합니다. 이전 버전과의 호환성을 위해 SELECT 문에서 괄호 없이 TOP expression을 지원하지만 권장되지는 않습니다.
쿼리에 ORDER BY 절이 있는 경우 ORDER BY 절로 정렬하여 처음 expression개 행이나 expression%의 행이 반환됩니다. 쿼리에 ORDER BY 절이 없으면 행의 순서는 임의대로 지정됩니다.
PERCENT
쿼리 결과 집합에서 처음 expression%의 행만 반환됨을 나타냅니다.WITH TIES
ORDER BY 열에서 같은 값을 가진 기본 결과 집합에서 TOP n(PERCENT)의 마지막 행으로 표시되는 추가 행이 반환되도록 지정합니다. TOP...WITH TIES는 ORDER BY 절이 지정된 경우에만 사용할 수 있으며 SELECT 문에서만 지정할 수 있습니다.[!참고]
연결 레코드의 반환 순서는 임의로 지정됩니다. ORDER BY는 이 규칙에 영향을 주지 않습니다.
주의
TOP은 분할된 뷰에서 UPDATE 및 DELETE 문과 함께 사용할 수 없습니다.
INSERT, UPDATE, MERGE 또는 DELETE에 사용된 TOP 식에서 참조된 행은 어떠한 순서로도 정렬되지 않습니다. TOP n은 임의의 n개 행을 반환합니다. 예를 들어 다음 INSERT 문에는 ORDER BY 절이 포함되어 있지만 이 절은 INSERT 문에서 직접 참조하는 행에는 적용되지 않습니다.
INSERT TOP (2) INTO Table2 (ColumnB)
SELECT ColumnA FROM Table1
ORDER BY ColumnA;
위 쿼리의 ORDER BY 절은 중첩 SELECT 문에서 반환되는 행만 참조합니다. INSERT 문은 SELECT 문에서 반환되는 행 중 두 개를 선택합니다. SELECT 하위 쿼리에서 맨 위의 두 행을 삽입하려면 다음과 같이 쿼리를 다시 작성합니다.
INSERT INTO Table2 (ColumnB)
SELECT TOP (2) ColumnA FROM Table1
ORDER BY ColumnA;
SQL Server에서는 TOP 절을 사용하여 만든 뷰를 업데이트할 수 있습니다. TOP 절은 뷰 정의에 포함되므로 결과가 TOP 식의 요구 사항을 더 이상 충족하지 않는 경우에는 업데이트로 인해 특정 행이 뷰에서 사라질 수 있습니다. 자세한 내용은 뷰를 통해 데이터 수정을 참조하십시오.
쿼리의 TOP 식은 트리거가 시작되어 실행될 수 있는 문에 적용되지 않습니다. 트리거에서 삽입 및 업데이트된 테이블은 INSERT, UPDATE, MERGE 또는 DELETE 문에 의해 영향을 받는 행만 표시합니다.
MERGE 문에 TOP 사용
MERGE 문에 지정되는 경우 TOP 절은 전체 원본 테이블과 전체 대상 테이블이 조인되고 삽입, 업데이트 또는 삭제 동작에 적합하지 않은 조인된 행이 제거된 후에 적용됩니다. TOP 절은 조인된 행 수를 지정된 값으로 더 줄이며, 삽입, 업데이트 또는 삭제 동작은 나머지 조인된 행에 순서 없이 적용됩니다. 즉, 행은 WHEN 절에 정의된 동작에 순서 없이 분산됩니다. 예를 들어 TOP (10)을 지정하면 10개 행이 영향을 받습니다. 이 10개의 행 중 7개가 업데이트되고 3개가 삽입되거나, 1개가 삭제되고 5개가 업데이트되고 4개가 삽입될 수 있습니다.
MERGE 문은 원본과 대상 테이블 모두에 전체 테이블 검색을 수행하므로 큰 테이블을 수정하기 위해 TOP 절을 사용하여 다중 일괄 처리를 생성하는 경우에는 I/O 성능에 영향을 줄 수 있습니다. 이러한 시나리오에서 연속된 모든 일괄 처리는 새로운 행을 대상으로 해야 합니다. 자세한 내용은 MERGE 문 성능 최적화를 참조하십시오.
예
1. 변수를 사용한 TOP 사용
다음 예에서는 변수를 사용하여 AdventureWorks2008R2 데이터베이스의 dbo.Employee 테이블에 나열된 직원 중 처음 10명을 검색합니다.
USE AdventureWorks2008R2;
GO
DECLARE @p AS int;
SELECT @p=10
SELECT TOP(@p)*
FROM HumanResources.Employee;
GO
2. PERCENT 및 WITH TIES를 사용한 TOP 사용
다음 예에서는 급여가 가장 많은 10%의 직원을 검색하여 급여에 따라 내림차순으로 반환합니다. WITH TIES를 지정하면 가장 급여가 낮은 직원이 여러 명이어서 10%를 넘는 경우에도 이러한 직원이 모두 결과 집합에 포함됩니다.
USE AdventureWorks2008R2;
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;