TOP 및 OFFSET 모두 & FETCH를 사용하여 반환되는 행 수를 제한합니다. OFFSET 및 FETCH는 유사한 결과를 맨 위로 반환 할 수 있지만 주어진 상황에서 어떤 방법을 사용하는 것이 가장 적합한 지에 영향을 미칠 수있는 차이가 있습니다.
이 강의의 모든 예제는 Microsoft SQL Server Management를 기반으로합니다. Studio 및 AdventureWorks2012 데이터베이스. SQL Server 시작 가이드를 사용하여 이러한 무료 도구를 사용할 수 있습니다.
TOP와 OFFSET의 차이점은 무엇입니까 & Fetch?
다음 섹션에서는 TOP 및 OFFSET & FETCH를 다룹니다. 두 섹션을 모두 읽으면 차이점을 이해할 수있을 것입니다. 이것들은 또한이 기사의 끝에있는 표에 요약되어 있습니다.
Top
TOP는 쿼리 결과에서 특정 수의 행을 반환하는 데 사용됩니다.
TOP 절은 SQL 2005와 같은 이전 버전의 SQL 서버에서 한동안 사용 가능했습니다. TOP은 ANSI 규격이 아니며 SQL Server 및 MS-Access와 같은 Microsoft 제품으로 만 사용이 제한됩니다.
TOP 절은 SELECT 문의 열 목록에서 사용되며 ORDER BY를 포함하거나 포함하지 않고 사용할 수 있습니다.
예를 들어 가장 비용이 적게 드는 10 가지 제품을 선택하려면
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
ORDER BY가 필수는 아니지만, ORDER BY가 없으면 어떤 행이 반환되는지 보장 할 수 없으므로 모범 사례입니다.
TOP 고유의 항목 1 개 행의 백분율을 반환하는 기능입니다. 문
SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
는 StandardCost가 가장 낮은 상위 51 개 제품을 반환합니다 (예 : 504 행 x 10 % = 50.4, 51로 올림).
쿼리 결과 하단에서 지정된 수의 레코드를 선택할 수도 있습니다. 이렇게하려면 트릭을 사용하여 레코드를 내림차순으로 정렬 할 수 있습니다.
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC
결과가 내림차순으로 정렬 될 때 유의하십시오. 가장 큰 금액이 먼저 반환됩니다. 이 때문에 TOP은 가장 높은 표준 비용으로 해당 제품을 반환합니다.
TOP는 수천 개의 행을 반환하면 성능에 영향을 줄 수 있으므로 큰 결과에 매우 유용 할 수 있습니다. 대부분의 경우 사용은 결과의 시작 부분 만 검색합니다.
TOP는 관계 값을 표시 할 수 있습니다. – WITH TIES를 사용하면 기본 결과의 마지막 행과 동일한 값을 가진 추가 레코드도 표시 할 수 있습니다.
OFFSET 및 FETCH
OFFSET 및 FETCH는 결과 집합에서 레코드 창을 반환하는 데 사용됩니다. OFFSET은 결과 내에서 건너 뛸 행 수를 지정하고 FETCH는 해당 지점에서 앞으로 결과로 반환 할 행 수를 지정합니다.
OFFSET 및 FETCH는 최근 SQL Server 2012에서 도입되었으며 ANSI 규격입니다.
FETCH없이 OFFSET을 사용할 수 있지만 FETCH는 단독으로 사용할 수 없습니다. 그럼에도 불구하고 OFFSET은 ORDER BY 절과 함께 사용해야합니다. OFFSET 및 FETCH가 ORDER BY 절의 일부이기 때문에 그 이유는 간단합니다.
이 예에서는 결과의 처음 10 개 행을 건너 뛴 다음 결과에 다음 10 개 행을 표시합니다.
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
결과가 정렬 된 경우 OFFSET 및 FETCH를 사용하여 TOP에서 반환 된 행을 복제 할 수 있습니다. 다음 문은 TOP 10을 반환하는 것과 동일합니다.
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
OFFSET이 0으로 설정되면 행을 건너 뛰지 않습니다.
다름 TOP, OFFSET에는 행 비율을 반환하는 수단이 내장되어 있지 않습니다. 그러나 다음과 같이 백분율을 계산하여 직접 굴릴 수 있습니다.
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY
트릭은 하위 쿼리에 있습니다. 결과의 행 수를 계산하여 백분율을 얻을 수 있습니다. 다음은 하위 쿼리입니다. 원하는 경우 SQL Server Management Studio에서 실행할 수 있습니다.
SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product
여러 항목이 있습니다. 참고 :
- CEILING은 숫자를 반올림합니다. 이 예에서 CEILING (50.4)은 51.0을 반환합니다. 이것은 TOP의 동작을 모방합니다.
- FETCH에는 정수 값이 필요하므로 CAST를 사용하여 변환합니다. 따라서 51.0은 51이됩니다.
결과의 하위 10 개 레코드를 반환하려면 두 가지 방법이 있습니다. TOP에 대해했던 것처럼 정렬 순서를 바꿀 수 있습니다.
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
또는 정렬 순서를 유지하고 오프셋을 계산하여 모든 행이 마지막까지 10 개는 건너 뜁니다. 이 기술은 OFFSET 및 FETCH에 대한 SQL 강의에서 자세히 살펴 봅니다.
차이점 요약
다음은 TOP과 OFFSET의 주요 차이점에 대한 요약입니다. & FETCH.
일반적으로 처음 몇 개의 행만 반환하는 것이 목표라면 TOP이 간단한 해결책이라고 생각합니다. 페이징 솔루션을 찾고 있거나 원래 정렬 순서에 영향을주지 않고 쿼리 결과의 중간 또는 하단에있는 행을 선택해야하는 경우 OFFSET & FETCH 최고입니다.