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
결과 집합에서 행이 반환되는 순서가 보장되지 않습니다.순위 함수 값이 결과 집합에 적용되는 순서를 결정합니다.
참고 항목
ORDER BY
은 Azure Synapse Analytics 또는 CREATE TABLE AS SELECT
PDW(Analytics Platform System)의 CTAS 문에서 지원INTO
SELECT
/되지 않습니다.
구문
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 ]
]
인수
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, nchar 및 nvarchar 형식의 열에만 적용됩니다.
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은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다. 즉, 외부 쿼리와 상관 관계를 지정할 수 없습니다.
ROW
ROWS
은 동의어이며 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은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다. 즉, 외부 쿼리와 상관 관계를 지정할 수 없습니다.
FIRST
NEXT
은 동의어이며 ANSI 호환성을 위해 제공됩니다.
ROW
ROWS
은 동의어이며 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
의 행을 삽입하는 데 사용하는 경우 이 절은 행이 지정된 순서로 삽입되도록 보장하지 않습니다.
보기에서 사용 하 FETCH
고 OFFSET
보기의 업데이트 가능성 속성을 변경 하지 않습니다.
제한 사항
절의 열 수에는 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
열 별칭이 포함된 UNION
EXCEPT
경우 첫 번째(왼쪽) 쿼리의 선택 목록에서 열 별칭을 지정해야 합니다.
연산자 또는 INTERSECT
연산 ORDER BY
자를 사용하는 UNION
EXCEPT
쿼리에서는 문 끝에만 허용됩니다. 이 제한은 하위 쿼리가 아닌 최상위 쿼리에서 지정 UNION
EXCEPT
INTERSECT
한 경우에만 적용됩니다. 다음 예제 섹션을 참조하세요.
ORDER BY
또는 OFFSET
FETCH
절을 지정하지 않는 한 TOP
뷰, 인라인 함수, 파생 테이블 및 하위 쿼리에서는 절이 유효하지 않습니다. ORDER BY
이러한 개체에서 사용되는 경우 절은 절 또는 OFFSET
FETCH
절에서 반환되는 행을 TOP
결정하는 데만 사용됩니다. 이 절은 ORDER BY
쿼리 자체에 지정되지 않는 한 ORDER BY
이러한 구문을 쿼리할 때 순서가 지정된 결과를 보장하지 않습니다.
OFFSET
인 FETCH
덱싱된 뷰 또는 절을 사용하여 CHECK OPTION
정의된 뷰에서 지원되지 않습니다.
OFFSET
다음 FETCH
제한 사항을 허용하는 TOP
ORDER BY
모든 쿼리에서 사용할 수 있습니다.
절은
OVER
지원OFFSET
FETCH
되지 않으며 .OFFSET
및FETCH
,UPDATE
및MERGE
DELETE
문에서INSERT
직접 지정할 수 없지만 이러한 문에 정의된 하위 쿼리에서 지정할 수 있습니다. 예를 들어 문에서INSERT INTO SELECT
OFFSET
FETCH
문에SELECT
지정할 수 있습니다.연산자 또는
INTERSECT
연산FETCH
OFFSET
자를 사용하는UNION
EXCEPT
쿼리에서는 쿼리 결과의 순서를 지정하는 최종 쿼리에서만 지정할 수 있습니다.TOP
는 동일한 쿼리 식과OFFSET
FETCH
결합할 수 없습니다(동일한 쿼리 범위 내).
OFFSET 및 FETCH를 사용하여 반환된 행 제한
절 대신 TOP
and FETCH
절을 사용하여 OFFSET
쿼리 페이징 솔루션을 구현하고 클라이언트 애플리케이션으로 전송되는 행 수를 제한해야 합니다.
페이징 솔루션으로 사용 OFFSET
하려면 FETCH
클라이언트 애플리케이션에 반환된 데이터의 각 페이지에 대해 쿼리를 한 번 실행해야 합니다. 예를 들어 쿼리 결과를 10행씩 증분하여 반환하려면 쿼리를 한 번 실행하여 행 1~10을 반환한 다음 쿼리를 다시 실행하여 행 11~20을 반환해야 합니다. 각 쿼리는 독립적이며 어떤 방식으로도 서로 관련이 없습니다. 즉, 쿼리가 한 번 실행되면 서버에 상태가 유지되는 커서와 달리 클라이언트 애플리케이션에서 상태를 추적해야 합니다. 사용한 OFFSET
쿼리 요청과 FETCH
쿼리 요청 간에 안정적인 결과를 얻으려면 다음 조건을 충족해야 합니다.
쿼리에 사용되는 기본 데이터가 변경되지 않아야 합니다. 즉, 쿼리에서 터치한 행이 업데이트되지 않거나 쿼리의 페이지에 대한 모든 요청이 스냅샷 또는 직렬화 가능한 트랜잭션 격리를 사용하여 단일 트랜잭션에서 실행됩니다. 이러한 트랜잭션 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL을 참조 하세요.
절에는
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 사용 | 순위 함수 |
반환되는 행 수 제한 | OFFSET 및 FETCH |
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
, RANK
DENSE_RANK
및 NTILE
.
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 사용
쿼리에서 해당 연 EXCEPT
INTERSECT
산 ORDER 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;