다음을 통해 공유


SELECT - ORDER BY 절(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

SQL Server의 쿼리에서 반환되는 데이터를 정렬합니다. 이 절을 사용하여 다음을 수행할 수 있습니다.

  • 쿼리 결과 집합을 지정한 열 목록별로 정렬하고 필요한 경우 반환되는 행을 지정한 범위로 제한합니다. 절을 지정하지 않으면 ORDER BY 결과 집합에서 행이 반환되는 순서가 보장되지 않습니다.

  • 순위 함수 값이 결과 집합에 적용되는 순서를 결정합니다.

Transact-SQL 구문 표기 규칙

참고 항목

ORDER BY은 Azure Synapse Analytics 또는 CREATE TABLE AS SELECT PDW(Analytics Platform System)의 CTAS 문에서 지원INTOSELECT/되지 않습니다.

구문

SQL Server 및 Azure SQL Database 구문

ORDER BY order_by_expression
    [ COLLATE collation_name ]
    [ ASC | DESC ]
    [ , ...n ]
[ <offset_fetch> ]

<offset_fetch> ::=
{
    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
    [
      FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
    ]
}

Azure Synapse Analytics 및 병렬 데이터 웨어하우스에 대한 구문입니다.

[ ORDER BY
    {
    order_by_expression
    [ ASC | DESC ]
    } [ , ...n ]
]

참고 항목

SQL Server 2014(12.x) 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.

인수

order_by_expression

쿼리 결과 집합을 정렬할 열 또는 식을 지정합니다. 정렬 열은 이름 또는 열 별칭 또는 선택 목록에서 열의 위치를 나타내는 음수가 아닌 정수로 지정할 수 있습니다.

여러 개의 열 정렬을 지정할 수 있습니다. 열 이름은 고유해야 합니다. 절의 정렬 열 시퀀스는 ORDER BY 정렬된 결과 집합의 구성을 정의합니다. 즉, 결과 집합은 첫 번째 열을 기준으로 정렬된 다음 이 정렬된 목록이 두 번째 열을 기준으로 정렬되는 식으로 정렬됩니다.

절에서 ORDER BY 참조되는 열 이름은 선택 목록의 열 또는 열 별칭 또는 모호성 없이 절에 지정된 테이블에 정의된 열에 FROM 해당해야 합니다. 절이 ORDER BY 선택 목록에서 열 별칭을 참조하는 경우 열 별칭은 절의 일부 식 ORDER BY 의 일부가 아니라 자체적으로 사용해야 합니다. 예를 들면 다음과 같습니다.

SELECT SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
ORDER BY SchemaName; -- correct

SELECT SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
ORDER BY SchemaName + ''; -- wrong

COLLATE collation_name

테이블 또는 뷰에 ORDER BY 정의된 열의 데이터 정렬에 따라 수행되지 않고 collation_name 지정된 데이터 정렬에 따라 작업을 수행하도록 지정합니다. collation_name Windows 데이터 정렬 이름 또는 SQL 데이터 정렬 이름일 수 있습니다. 자세한 내용은 데이터 정렬 및 유니코드 지원을 참조하십시오. COLLATE는 char, varchar, ncharnvarchar 형식의 열에만 적용됩니다.

ASC | DESC

지정된 열의 값이 오름차순으로 정렬되는지 내림차순으로 정렬되는지를 지정합니다. ASC는 오름차순으로 정렬하고, DESC는 내림차순으로 정렬합니다. ASC는 기본 정렬 순서입니다. NULL 값은 가능한 가장 작은 값으로 취급됩니다.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

적용 대상: SQL Server 2012(11.x) 이상 버전, Azure SQL Database 및 Azure SQL Managed Instance.

쿼리 식에서 행을 반환하기 전에 건너뛸 행 수를 지정합니다. 값은 0보다 크거나 같은 정수 상수 또는 식일 수 있습니다.

offset_row_count_expression은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다. 즉, 외부 쿼리와 상관 관계를 지정할 수 없습니다.

ROWROWS 은 동의어이며 ANSI 호환성을 위해 제공됩니다.

쿼리 실행 계획에서 오프셋 행 개수 값은 쿼리 연산자의 Offset 특성에 TOP 표시됩니다.

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY

적용 대상: SQL Server 2012(11.x) 이상 버전, Azure SQL Database 및 Azure SQL Managed Instance.

절이 처리된 후 OFFSET 반환할 행 수를 지정합니다. 값은 1보다 크거나 같은 정수 상수 또는 식일 수 있습니다.

fetch_row_count_expression은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다. 즉, 외부 쿼리와 상관 관계를 지정할 수 없습니다.

FIRSTNEXT 은 동의어이며 ANSI 호환성을 위해 제공됩니다.

ROWROWS 은 동의어이며 ANSI 호환성을 위해 제공됩니다.

쿼리 실행 계획에서 오프셋 행 개수 값은 쿼리 연산자의 Rows 또는 Top 특성에 TOP 표시됩니다.

모범 사례

절의 정수를 선택 목록에 있는 ORDER BY 열의 위치 표현으로 지정하지 않습니다. 예를 들어 이러한 SELECT ProductID, Name FROM Production.Production ORDER BY 2 문은 유효하지만 실제 열 이름을 지정하는 것과 비교하여 다른 사용자가 쉽게 이해할 수 없습니다. 또한 열 순서 변경 또는 새 열 추가와 같은 선택 목록을 변경하려면 예기치 않은 결과를 방지하기 위해 절을 ORDER BY 수정해야 합니다.

SELECT TOP (<n>) 문에서 항상 절을 ORDER BY 사용합니다. 이는 영향을 받는 TOP행을 예측할 수 있는 유일한 방법입니다. 자세한 내용은 TOP을 참조하세요.

상호 운용성

또는 INSERT...SELECT 문과 함께 SELECT...INTO 다른 소스 ORDER BY 의 행을 삽입하는 데 사용하는 경우 이 절은 행이 지정된 순서로 삽입되도록 보장하지 않습니다.

보기에서 사용 하 FETCHOFFSET 보기의 업데이트 가능성 속성을 변경 하지 않습니다.

제한 사항

절의 열 수에는 ORDER BY 제한이 없습니다. 그러나 절에 ORDER BY 지정된 열의 총 크기는 8,060바이트를 초과할 수 없습니다.

ntext, 텍스트, 이미지, 지리, 기하 도형xml 형식의 열은 절에 ORDER BY 사용할 수 없습니다.

순위 함수에 order_by_expression 나타나는 경우 정수 또는 상수는 지정할 수 없습니다. 자세한 내용은 SELECT - OVER 절을 참조하세요.

테이블 이름이 절에 FROM 별칭이 지정된 경우 별칭 이름만 사용하여 절의 ORDER BY 해당 열을 한정할 수 있습니다.

문에 다음 절 또는 연산자 중 하나가 포함된 경우 SELECT 절에 ORDER BY 지정된 열 이름과 별칭을 선택 목록에 정의해야 합니다.

  • UNION 연산자
  • EXCEPT 연산자
  • INTERSECT 연산자
  • SELECT DISTINCT

또한 문에 열 이름 또는 INTERSECT 열 별칭이 포함된 UNIONEXCEPT경우 첫 번째(왼쪽) 쿼리의 선택 목록에서 열 별칭을 지정해야 합니다.

연산자 또는 INTERSECT 연산 ORDER BY 자를 사용하는 UNIONEXCEPT쿼리에서는 문 끝에만 허용됩니다. 이 제한은 하위 쿼리가 아닌 최상위 쿼리에서 지정 UNIONEXCEPTINTERSECT 한 경우에만 적용됩니다. 다음 예제 섹션을 참조하세요.

ORDER BY 또는 OFFSET FETCH 절을 지정하지 않는 한 TOP 뷰, 인라인 함수, 파생 테이블 및 하위 쿼리에서는 절이 유효하지 않습니다. ORDER BY 이러한 개체에서 사용되는 경우 절은 절 또는 OFFSET FETCH 절에서 반환되는 행을 TOP 결정하는 데만 사용됩니다. 이 절은 ORDER BY 쿼리 자체에 지정되지 않는 한 ORDER BY 이러한 구문을 쿼리할 때 순서가 지정된 결과를 보장하지 않습니다.

OFFSETFETCH 덱싱된 뷰 또는 절을 사용하여 CHECK OPTION 정의된 뷰에서 지원되지 않습니다.

OFFSET 다음 FETCH 제한 사항을 허용하는 TOP ORDER BY 모든 쿼리에서 사용할 수 있습니다.

  • 절은 OVER 지원 OFFSET FETCH되지 않으며 .

  • OFFSETFETCH , UPDATEMERGEDELETE 문에서 INSERT직접 지정할 수 없지만 이러한 문에 정의된 하위 쿼리에서 지정할 수 있습니다. 예를 들어 문에서 INSERT INTO SELECT OFFSET FETCH 문에 SELECT 지정할 수 있습니다.

  • 연산자 또는 INTERSECT 연산 FETCH OFFSET 자를 사용하는 UNIONEXCEPT 쿼리에서는 쿼리 결과의 순서를 지정하는 최종 쿼리에서만 지정할 수 있습니다.

  • TOP 는 동일한 쿼리 식과 OFFSET FETCH 결합할 수 없습니다(동일한 쿼리 범위 내).

OFFSET 및 FETCH를 사용하여 반환된 행 제한

절 대신 TOP and FETCH 절을 사용하여 OFFSET 쿼리 페이징 솔루션을 구현하고 클라이언트 애플리케이션으로 전송되는 행 수를 제한해야 합니다.

페이징 솔루션으로 사용 OFFSET 하려면 FETCH 클라이언트 애플리케이션에 반환된 데이터의 각 페이지에 대해 쿼리를 한 번 실행해야 합니다. 예를 들어 쿼리 결과를 10행씩 증분하여 반환하려면 쿼리를 한 번 실행하여 행 1~10을 반환한 다음 쿼리를 다시 실행하여 행 11~20을 반환해야 합니다. 각 쿼리는 독립적이며 어떤 방식으로도 서로 관련이 없습니다. 즉, 쿼리가 한 번 실행되면 서버에 상태가 유지되는 커서와 달리 클라이언트 애플리케이션에서 상태를 추적해야 합니다. 사용한 OFFSET 쿼리 요청과 FETCH쿼리 요청 간에 안정적인 결과를 얻으려면 다음 조건을 충족해야 합니다.

  1. 쿼리에 사용되는 기본 데이터가 변경되지 않아야 합니다. 즉, 쿼리에서 터치한 행이 업데이트되지 않거나 쿼리의 페이지에 대한 모든 요청이 스냅샷 또는 직렬화 가능한 트랜잭션 격리를 사용하여 단일 트랜잭션에서 실행됩니다. 이러한 트랜잭션 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL을 참조 하세요.

  2. 절에는 ORDER BY 고유하게 보장되는 열 또는 열 조합이 포함되어 있습니다.

이 문서의 뒷부분에 있는 예제 섹션에서 "단일 트랜잭션에서 여러 쿼리 실행" 예제를 참조하세요.

페이징 솔루션에서 일관된 실행 계획이 중요한 경우 및 FETCH 매개 변수에 OPTIMIZE FOR 대한 쿼리 힌트를 OFFSET 사용하는 것이 좋습니다. 이 문서의 뒷부분에 있는 예제 섹션에서 OFFSET 및 FETCH 값대한 식 지정을 참조하세요. 자세한 OPTIMIZE FOR내용은 쿼리 힌트를 참조 하세요.

예제

이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용하며, 이는 Microsoft SQL Server 예시 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.

범주 중요한 구문 요소
기본 구문 ORDER BY
오름차순 및 내림차순 지정 DESC 또는 ASC
데이터 정렬 지정 COLLATE
조건부 순서 지정 CASE
순위 함수에서 ORDER BY 사용 순위 함수
반환되는 행 수 제한 OFFSETFETCH
UNION, EXCEPT 및 INTERSECT와 함께 ORDER BY 사용 UNION

기본 구문

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

A. 선택 목록에 정의된 단일 열 지정

다음 예에서는 숫자 열 ProductID를 기준으로 결과 집합을 정렬합니다. 특정 정렬 순서가 지정되지 않았으므로 기본값(오름차순)이 사용됩니다.

USE AdventureWorks2022;
GO

SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID;

B. 선택 목록에 정의되지 않은 열 지정

다음은 선택 목록에 포함되지 않지만 절에 지정된 테이블에 정의된 열로 결과 집합을 정렬하는 FROM 예제입니다.

USE AdventureWorks2022;
GO

SELECT ProductID, Name, Color
FROM Production.Product
ORDER BY ListPrice;

C. 별칭을 정렬 열로 지정

다음 예에서는 열 별칭 SchemaName을 정렬 순서 열로 지정합니다.

USE AdventureWorks2022;
GO

SELECT name, SCHEMA_NAME(schema_id) AS SchemaName
FROM sys.objects
WHERE type = 'U'
ORDER BY SchemaName;

D. 정렬 열로 식 지정

다음 예에서는 식을 정렬 열로 사용합니다. 이 식은 함수를 DATEPART 사용하여 직원이 고용된 연도별로 결과 집합을 정렬하여 정의됩니다.

USE AdventureWorks2022;
GO

SELECT BusinessEntityID, JobTitle, HireDate
FROM HumanResources.Employee
ORDER BY DATEPART(year, HireDate);

오름차순 및 내림차순 정렬 순서 지정

A. 내림차순 지정

다음 예에서는 숫자 열 ProductID를 기준으로 내림차순으로 결과 집합을 정렬합니다.

USE AdventureWorks2022;
GO

SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;

B. 오름차순 지정

다음 예에서는 Name 열을 기준으로 오름차순으로 결과 집합을 정렬합니다. 문자가 숫자순이 아니라 사전순으로 정렬됩니다. 즉, 10이 2보다 먼저 옵니다.

USE AdventureWorks2022;
GO

SELECT ProductID, Name
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY Name ASC;

C. 오름차순과 내림차순을 모두 지정합니다.

다음 예에서는 두 열을 기준으로 결과 집합을 정렬합니다. 쿼리 결과 집합은 먼저 FirstName 열을 기준으로 오름차순으로 정렬된 다음 LastName 열을 기준으로 내림차순으로 정렬됩니다.

USE AdventureWorks2022;
GO

SELECT LastName, FirstName
FROM Person.Person
WHERE LastName LIKE 'R%'
ORDER BY FirstName ASC, LastName DESC;

데이터 정렬 지정

다음 예제에서는 절에서 ORDER BY 데이터 정렬을 지정하면 쿼리 결과가 반환되는 순서를 변경할 수 있는 방법을 보여줍니다. 대/소문자 및 액센트를 구분하지 않는 데이터 정렬을 사용하여 정의된 열이 포함된 테이블이 만들어집니다. 값은 다양한 대/소문자와 악센트 차이를 사용하여 삽입됩니다. 데이터 정렬은 절에 ORDER BY 지정되지 않으므로 첫 번째 쿼리는 값을 정렬할 때 열의 데이터 정렬을 사용합니다. 두 번째 쿼리에서는 대/소문자를 구분하고 악센트를 구분하는 데이터 정렬을 절에 ORDER BY 지정하여 행이 반환되는 순서를 변경합니다.

USE tempdb;
GO

CREATE TABLE #t1 (name NVARCHAR(15) COLLATE Latin1_General_CI_AI);
GO

INSERT INTO #t1
VALUES (N'Sánchez'),
    (N'Sanchez'),
    (N'sánchez'),
    (N'sanchez');

-- This query uses the collation specified for the column 'name' for sorting.
SELECT name
FROM #t1
ORDER BY name;

-- This query uses the collation specified in the ORDER BY clause for sorting.
SELECT name
FROM #t1
ORDER BY name COLLATE Latin1_General_CS_AS;

조건부 순서 지정

다음 예제에서는 절의 CASE ORDER BY 식을 사용하여 지정된 열 값을 기반으로 행의 정렬 순서를 조건부로 결정합니다. 첫 번째 예에서는 SalariedFlag 테이블의 HumanResources.Employee 열의 값이 계산됩니다. SalariedFlag가 1로 설정된 직원은 BusinessEntityID 순서에 따라 내림차순으로 반환됩니다. SalariedFlag가 0으로 설정된 직원은 BusinessEntityID 순서에 따라 오름차순으로 반환됩니다. 두 번째 예에서 결과 집합은 TerritoryName 열이 'United States'와 동일하면 CountryRegionName 열을 기준으로 정렬되고 그 외 다른 행에는 CountryRegionName 열을 기준으로 정렬됩니다.

SELECT BusinessEntityID,
    SalariedFlag
FROM HumanResources.Employee
ORDER BY
    CASE SalariedFlag
        WHEN 1 THEN BusinessEntityID
    END DESC,
    CASE 
        WHEN SalariedFlag = 0 THEN BusinessEntityID
    END;
GO
SELECT BusinessEntityID,
    LastName,
    TerritoryName,
    CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY
    CASE CountryRegionName
        WHEN 'United States' THEN TerritoryName
        ELSE CountryRegionName
    END;

순위 함수에서 ORDER BY 사용

다음 예제에서는 ORDER BY 순위 함수ROW_NUMBER, RANKDENSE_RANKNTILE.

USE AdventureWorks2022;
GO

SELECT p.FirstName,
    p.LastName,
    ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number",
    RANK() OVER (ORDER BY a.PostalCode) AS "Rank",
    DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank",
    NTILE(4) OVER (ORDER BY a.PostalCode) AS "Quartile",
    s.SalesYTD,
    a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
    ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
    ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
    AND SalesYTD <> 0;

반환되는 행 수 제한

적용 대상: SQL Server 2012(11.x) 이상 버전, Azure SQL Database 및 Azure SQL Managed Instance.

다음 예제에서는 쿼리에서 반환되는 행 수를 사용하고 OFFSET FETCH 제한합니다.

A. OFFSET 및 FETCH 값에 정수 상수 지정

다음 예제에서는 정수 상수 및 절의 OFFSET FETCH 값으로 지정합니다. 첫 번째 쿼리는 DepartmentID 열을 기준으로 정렬된 모든 행을 반환합니다. 이 쿼리에서 반환된 결과를 다음에 나오는 두 쿼리의 결과와 비교해 보세요. 다음 쿼리는 절 OFFSET 5 ROWS 을 사용하여 처음 5개 행을 건너뛰고 나머지 행을 모두 반환합니다. 마지막 쿼리에서는 OFFSET 0 ROWS 절을 사용하여 첫 번째 행에서 시작한 다음 FETCH NEXT 10 ROWS ONLY를 사용하여 반환되는 행을 정렬된 결과 집합의 10개 행으로 제한합니다.

USE AdventureWorks2022;
GO

-- Return all rows sorted by the column DepartmentID.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID;

-- Skip the first 5 rows from the sorted result set and return all remaining rows.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 5 ROWS;

-- Skip 0 rows and return only the first 10 rows from the sorted result set.
SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY;

B. OFFSET 및 FETCH 값에 대한 변수 지정

다음 예제에서는 변수 @RowsToSkip 를 선언하고 @FetchRows and FETCH 절에서 이러한 변수를 OFFSET 지정합니다.

USE AdventureWorks2022;
GO

-- Specifying variables for OFFSET and FETCH values
DECLARE
    @RowsToSkip TINYINT = 2,
    @FetchRows TINYINT = 8;

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @RowsToSkip ROWS
FETCH NEXT @FetchRows ROWS ONLY;

C. OFFSET 및 FETCH 값에 대한 식 지정

다음 예제에서는 식을 @StartingRowNumber - 1 사용하여 값과 식을 @EndingRowNumber - @StartingRowNumber + 1 지정 OFFSET 하여 FETCH 값을 지정합니다. 또한 쿼리 힌트가 OPTIMIZE FOR지정됩니다. 이 힌트는 쿼리가 컴파일되고 최적화될 때 지역 변수에 대해 특정 값을 제공하는 데 사용될 수 있습니다. 해당 값은 쿼리 최적화 중에만 사용되고 쿼리 실행 중에는 사용되지 않습니다. 자세한 내용은 쿼리 힌트를 참조 하세요.

USE AdventureWorks2022;
GO

-- Specifying expressions for OFFSET and FETCH values
DECLARE
    @StartingRowNumber TINYINT = 1,
    @EndingRowNumber TINYINT = 8;

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS
FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY
OPTION (OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20));

D. OFFSET 및 FETCH 값에 대한 상수 스칼라 하위 쿼리 지정

다음 예제에서는 상수 스칼라 하위 쿼리를 사용하여 절의 값을 정의합니다 FETCH . 이 하위 쿼리는 PageSize 테이블의 dbo.AppSettings 열에서 단일 값을 반환합니다.

-- Specifying a constant scalar subquery
USE AdventureWorks2022;
GO

CREATE TABLE dbo.AppSettings (
    AppSettingID INT NOT NULL,
    PageSize INT NOT NULL
);
GO

INSERT INTO dbo.AppSettings
VALUES (1, 10);
GO

DECLARE @StartingRowNumber TINYINT = 1;

SELECT DepartmentID, Name, GroupName
FROM HumanResources.Department
ORDER BY DepartmentID ASC OFFSET @StartingRowNumber ROWS
FETCH NEXT (
    SELECT PageSize
    FROM dbo.AppSettings
    WHERE AppSettingID = 1
) ROWS ONLY;

E. 단일 트랜잭션에서 여러 쿼리 실행

다음 예에서는 쿼리의 모든 요청에서 안정적인 결과가 반환되도록 페이징 솔루션을 구현하는 한 가지 방법을 보여 줍니다. 쿼리는 스냅샷 격리 수준을 사용하여 단일 트랜잭션에서 실행되며 절에 ORDER BY 지정된 열은 열 고유성을 보장합니다.

USE AdventureWorks2022;
GO

-- Ensure the database can support the snapshot isolation level set for the query.
IF (
    SELECT snapshot_isolation_state
    FROM sys.databases
    WHERE name = N'AdventureWorks2022'
) = 0
ALTER DATABASE AdventureWorks2022
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

-- Set the transaction isolation level  to SNAPSHOT for this query.
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO

-- Beginning the transaction.
BEGIN TRANSACTION;
GO

-- Declare and set the variables for the OFFSET and FETCH values.
DECLARE
    @StartingRowNumber INT = 1,
    @RowCountPerPage INT = 3;

-- Create the condition to stop the transaction after all rows have been returned.
WHILE (
    SELECT COUNT(*)
    FROM HumanResources.Department
) >= @StartingRowNumber
BEGIN
    -- Run the query until the stop condition is met.
    SELECT DepartmentID, Name, GroupName
    FROM HumanResources.Department
    ORDER BY DepartmentID ASC OFFSET @StartingRowNumber - 1 ROWS
    FETCH NEXT @RowCountPerPage ROWS ONLY;

    -- Increment @StartingRowNumber value.
    SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;

    CONTINUE
END;
GO

COMMIT TRANSACTION;
GO

UNION, EXCEPT 및 INTERSECT와 함께 ORDER BY 사용

쿼리에서 해당 연 EXCEPTINTERSECTORDER BY 자를 사용하는 UNION경우 문 끝에 절을 지정해야 하며 결합된 쿼리의 결과가 정렬됩니다. 다음 예에서는 빨간색 또는 노란색 제품을 모두 반환하고 이 조합된 목록을 ListPrice 열을 기준으로 정렬합니다.

USE AdventureWorks2022;
GO

SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Red'
-- ORDER BY cannot be specified here.

UNION ALL

SELECT Name, Color, ListPrice
FROM Production.Product
WHERE Color = 'Yellow'
ORDER BY ListPrice ASC;

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

다음 예제에서는 결과 집합을 숫자 EmployeeKey 열을 기준으로 오름차순으로 정렬하는 방법을 보여 줍니다.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey;

다음 예제에서는 결과 집합을 숫자 EmployeeKey 열을 기준으로 내림차순으로 정렬합니다.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY EmployeeKey DESC;

다음 예제에서는 결과 집합을 LastName 열을 기준으로 정렬합니다.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName;

다음 예제에서는 두 열을 기준으로 정렬합니다. 이 쿼리는 먼저 FirstName 열을 기준으로 오름차순으로 정렬한 다음, 공통 FirstName 값을 LastName 열을 기준으로 내림차순으로 정렬합니다.

-- Uses AdventureWorks
SELECT EmployeeKey, FirstName, LastName
FROM DimEmployee
WHERE LastName LIKE 'A%'
ORDER BY LastName, FirstName;