TOP (Transact-SQL) (한국어)

  • 2017 년 3 월 16 일
  • 읽는 데 11 분
    • V
    • M
    • r
    • c
    • d
    • +12

적용 대상 : SQL Server (지원되는 모든 버전) Azure SQL 데이터베이스 Azure SQL 관리 형 인스턴스 Azure Synapse Analytics 병렬 데이터웨어 하우스

쿼리 결과 집합에 반환되는 행을 SQL Server의 지정된 행 수 또는 행 비율로 제한합니다. ORDER BY 절과 함께 TOP을 사용하면 결과 집합이 정렬 된 행의 처음 N 개로 제한됩니다. 그렇지 않으면 TOP은 정의되지 않은 순서로 처음 N 개의 행을 반환합니다. 이 절을 사용하여 SELECT 문에서 반환 된 행 수를 지정합니다. 또는 TOP을 사용하여 INSERT, UPDATE, MERGE 또는 DELETE 문의 영향을받는 행을 지정합니다.

Transact-SQL 구문 규칙

구문

다음은 SQL Server 및 Azure SQL Database의 구문입니다.

다음은 Azure Synapse Analytics 및 Parallel의 구문입니다. 데이터웨어 하우스 :

참고

SQL Server 2014 및 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하십시오. .

인수

expression
반환 할 행 수를 지정하는 숫자 표현식입니다. PERCENT를 지정하면 expression은 암시 적으로 부동 소수점 값으로 변환됩니다. 그렇지 않으면식이 bigint로 변환됩니다.

PERCENT
쿼리가 결과 집합에서 행의 첫 번째 식 비율 만 반환 함을 나타냅니다. 분수 값은 다음 정수 값으로 반올림됩니다.

WITH TIES
제한된 결과 집합에서 마지막 자리를 차지하는 두 개 이상의 행을 반환합니다. 이 인수는 ORDER BY 절과 함께 사용해야합니다. WITH TIES로 인해 expression에 지정된 값보다 더 많은 행이 반환 될 수 있습니다. 예를 들어 expression이 5로 설정되었지만 2 개의 추가 행이 5 행의 ORDER BY 열 값과 일치하는 경우 결과 집합에는 7 개의 행이 포함됩니다.

WITH TIES를 사용하여 TOP 절을 지정할 수 있습니다. 인수는 SELECT 문에서만, 그리고 “ORDER BY 절도 지정한 경우에만 가능합니다. 레코드를 묶는 순서는 임의적입니다. ORDER BY는이 규칙에 영향을주지 않습니다.

모범 사례

SELECT 문에서는 항상 TOP 절과 함께 ORDER BY 절을 사용합니다. 왜냐하면 어떤 행이 TOP의 영향을 받는지 예측 가능하게 표시하는 유일한 방법이기 때문입니다.

TOP 절 대신 ORDER BY 절에서 OFFSET 및 FETCH를 사용하여 쿼리 페이징 솔루션을 구현합니다. 페이징 솔루션 ( 즉, 클라이언트에 데이터 청크 또는 “페이지”를 보내는 것이 OFFSET 및 FETCH 절을 사용하여 구현하는 것이 더 쉽습니다. 자세한 내용은 ORDER BY 절 (Transact-SQL)을 참조하십시오.

TOP 사용 (또는 SET ROWCOUNT 대신 OFFSET 및 FETCH)를 사용하여 반환되는 행 수를 제한합니다. 이러한 메서드는 다음과 같은 이유로 SET ROWCOUNT를 사용하는 것보다 선호됩니다.

  • SELECT 문의 일부인 쿼리 최적화 프로그램 쿼리 최적화 중에 TOP 또는 FETCH 절의 expression 값을 고려할 수 있습니다. 쿼리를 실행하는 문 외부에서 SET ROWCOUNT를 사용하기 때문에 쿼리 계획에서 해당 값을 고려할 수 없습니다.

호환성 지원

이전 버전과의 호환성을 위해 표현식이 정수 const 인 경우 SELECT 문에서 괄호는 선택 사항입니다. 개미. SELECT 문에서는 항상 TOP에 괄호를 사용하는 것이 좋습니다. 이렇게하면 INSERT, UPDATE, MERGE 및 DELETE 문에서 필요한 사용과 일관성을 유지할 수 있습니다.

상호 운용성

TOP 식은 트리거로 인해 실행될 수있는 문에 영향을주지 않습니다. 트리거에 삽입 및 삭제 된 테이블은 INSERT, UPDATE, MERGE 또는 DELETE 문에 의해 실제로 영향을받는 행만 반환합니다. 예를 들어, TOP 절을 사용한 INSERT 문의 결과로 INSERT TRIGGER가 실행되는 경우입니다.

SQL Server에서는 뷰를 통해 행을 업데이트 할 수 있습니다. 뷰 정의에 TOP 절을 포함 할 수 있기 때문에 업데이트로 인해 행이 더 이상 TOP 표현식의 요구 사항을 충족하지 않으면 뷰에서 특정 행이 사라질 수 있습니다. .

MERGE 문에 지정되면 TOP 절은 전체 소스 테이블과 전체 대상 테이블이 결합 된 후에 적용됩니다. 그리고 삽입, 업데이트 또는 삭제에 적합하지 않은 결합 된 행은 작업이 제거됩니다. TOP 절은 조인 된 행 수를 지정된 값으로 추가로 줄이며 삽입, 업데이트 또는 삭제 작업은 순서가 지정되지 않은 방식으로 나머지 조인 된 행에 적용됩니다. 즉, WHEN 절에 정의 된 작업간에 행이 배포되는 순서가 없습니다.예를 들어 TOP (10)을 지정하면 10 개의 행이 영향을받는 경우이 행 중 7 개가 업데이트되고 3 개가 삽입 될 수 있습니다. 또는 하나를 삭제하고 5 개를 업데이트하고 4 개를 삽입하는 등의 작업을 수행 할 수 있습니다. MERGE 문은 원본 테이블과 대상 테이블 모두에 대한 전체 테이블 스캔을 수행하기 때문에 TOP 절을 사용하여 여러 배치를 만들어 큰 테이블을 수정할 때 I / O 성능에 영향을 미칠 수 있습니다. 이 시나리오에서는 모든 연속 배치가 새 행을 대상으로하는지 확인하는 것이 중요합니다.

UNION, UNION ALL, EXCEPT 또는 INTERSECT가 포함 된 쿼리에서 TOP 절을 지정할 때주의해야합니다. 운영자. TOP 및 ORDER BY 절이 논리적으로 처리되는 순서가 선택 작업에 사용될 때 항상 직관적 인 것은 아니기 때문에 예기치 않은 결과를 반환하는 쿼리를 작성할 수 있습니다. 예를 들어, 다음 표와 데이터에서 가장 저렴한 빨간색 자동차와 가장 저렴한 파란색 자동차를 반환한다고 가정합니다. 즉, 빨간색 세단과 파란색 밴입니다.

이러한 결과를 얻기 위해 다음 쿼리를 작성할 수 있습니다.

다음은 결과 집합입니다.

TOP 절이 연산자의 결과를 정렬하는 ORDER BY 절 이전에 논리적으로 실행되기 때문에 예기치 않은 결과가 반환됩니다 (이 경우 UNION ALL). 따라서 이전 쿼리는 빨간색 자동차 1 개와 파란색 자동차 1 개를 반환 한 다음 해당 조합의 결과를 가격으로 정렬합니다. 다음 예제는 원하는 결과를 얻기 위해이 쿼리를 작성하는 올바른 방법을 보여줍니다.

하위 선택 작업에서 TOP 및 ORDER BY를 사용하여 ORDER BY 절의 결과가 TOP에 적용되는지 확인합니다. UNION 연산의 결과를 정렬하지 않습니다.

다음은 결과 집합입니다.

제한 사항 및 제한 사항

TOP를 INSERT, UPDATE, MERGE 또는 DELETE와 함께 사용하면 참조 된 행이 어떤 순서로도 정렬되지 않습니다. 또한 이러한 문에서 ORDER BY 절을 직접 지정할 수 없습니다. 의미있는 시간순으로 행을 삽입, 삭제 또는 수정하기 위해 TOP을 사용해야하는 경우 하위 선택 문에 지정된 ORDER BY 절과 함께 TOP을 사용하십시오. 이 기사의 다음 예제 섹션을 참조하십시오.

분할 된 뷰의 UPDATE 및 DELETE 문에서 TOP을 사용할 수 없습니다.

TOP를 OFFSET 및 FETCH와 결합 할 수 없습니다. 동일한 쿼리 식 (동일한 쿼리 범위 내) 자세한 내용은 ORDER BY 절 (Transact-SQL)을 참조하십시오.

카테고리 주요 구문 요소
기본 구문 TOP • PERCENT
동점 값 포함 WITH TIES
DELETE, INSERT 또는 UPDATE의 영향을받는 행 제한 DELETE • INSERT • UPDATE

기본 구문

이 섹션의 예는 최소 필수 구문을 사용하여 ORDER BY 절의 기본 기능을 보여줍니다.

ㅏ. 상수 값과 함께 TOP 사용

다음 예에서는 상수 값을 사용하여 쿼리 결과 집합에 반환되는 직원 수를 지정합니다. 첫 번째 예에서는 ORDER BY 절이 사용되지 않았기 때문에 처음 10 개의 정의되지 않은 행이 반환됩니다. 두 번째 예에서는 ORDER BY 절이 최근에 고용 된 상위 10 명의 직원을 반환하는 데 사용됩니다.

B. 변수와 함께 TOP 사용

다음 예에서는 변수를 사용하여 쿼리 결과 집합에 반환되는 직원 수를 지정합니다.

C. 백분율 지정

다음 예에서는 PERCENT를 사용하여 쿼리 결과 집합에 반환되는 직원 수를 지정합니다. HumanResources.Employee 테이블의 직원입니다. 290의 5 %는 분수 값이므로 값은 다음 정수로 반올림됩니다.

동점 값 포함

A. WITH TIES를 사용하여 마지막 행의 값과 일치하는 행을 포함

다음 예제는 상위 10 % nd는 급여에 따라 내림차순으로 반환합니다. WITH TIES를 지정하면 급여가 10 %.

DELETE, INSERT 또는 UPDATE의 영향을받는 행 제한

A. TOP을 사용하여 삭제되는 행 수 제한

DELETE와 함께 TOP (n) 절을 사용하면 n 개 행의 정의되지 않은 선택에 대해 삭제 작업이 수행됩니다. 즉, DELETE 문은 WHERE 절에 정의 된 기준을 충족하는 (n) 수의 행을 선택합니다.다음 예는 기한이 2002 년 7 월 1 일 이전 인 PurchaseOrderDetail 테이블에서 20 행을 삭제합니다.

TOP를 사용하여 의미있는 시간순으로 행을 삭제하려면 하위 선택 문에서 ORDER BY와 함께 TOP을 사용합니다. 다음 쿼리는 기한이 가장 빠른 PurchaseOrderDetail 테이블의 10 개 행을 삭제합니다. 10 개의 행만 삭제되도록하려면 subselect 문 (PurchaseOrderID)에 지정된 열이 테이블의 기본 키입니다. subselect 문에서 키가 아닌 열을 사용하면 지정된 열에 중복 값이 포함 된 경우 10 개 이상의 행이 삭제 될 수 있습니다.

B. TOP을 사용하여 삽입 된 행 수 제한

다음 예에서는 EmployeeSales 테이블을 만들고 상위 5 개 항목에 대한 이름과 연간 누계 판매 데이터를 삽입합니다. HumanResources.Employee 테이블의 직원. INSERT 문은 WHERE 절에 정의 된 기준을 충족하는 SELECT 문에서 반환 된 5 개의 행을 선택합니다. OUTPUT 절은 EmployeeSales 테이블에 삽입 된 행을 표시합니다. SELECT 문의 ORDER BY 절은 “상위 5 명의 직원을 결정하는 데 사용되지 않습니다.

TOP를 사용하여 의미있는 시간순으로 행을 삽입하려면 TOP과 함께 ORDER BY를 사용하십시오. 다음 예제는이를 수행하는 방법을 보여줍니다. OUTPUT 절은 EmployeeSales 테이블에 삽입 된 행을 표시합니다. 이제 결과에 따라 상위 5 명의 직원이 삽입됩니다. 정의되지 않은 행 대신 ORDER BY 절을 사용합니다.

C. TOP을 사용하여 업데이트 된 행 수 제한

다음 예 TOP 절을 사용하여 테이블의 행을 갱신합니다. UPDATE와 함께 TOP (n) 절을 사용하면 갱신 작업이 정의되지 않은 수의 행에서 실행됩니다. 즉, UPDATE 문은 일치하는 행의 수 (n)를 선택합니다. WHERE 절에 정의 된 기준입니다. 다음 예에서는 한 영업 사원의 고객 10 명을 다른 영업 사원에게 할당합니다.

필요한 경우 의미있는 연대순으로 업데이트를 적용하려면 TOP을 사용하십시오. 하위 선택 문에서 ORDER BY와 함께 TOP을 사용해야합니다. 다음 예는 고용 날짜가 가장 빠른 10 명의 직원의 휴가 시간을 업데이트합니다.

예 : Azure Synapse Analytics 및 병렬 데이터웨어 하우스

다음 예에서는 쿼리 기준과 일치하는 상위 31 개 행을 반환합니다. ORDER BY 절은 31 개의 반환 된 행이 LastName 열의 알파벳 순서에 따라 처음 31 개의 행이되도록합니다.

Tie를 지정하지 않고 TOP 사용.

결과 : 31 개 행이 반환됩니다.

TOP 사용, WITH TIES 지정

결과 : 31 번째 행에 Brown tie라는 이름의 직원 3 명이 있으므로 33 행이 반환됩니다.

참고 항목

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다