SELECT - ORDER BY 절(Transact-SQL)SELECT - ORDER BY Clause (Transact-SQL)

적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse

SQL ServerSQL Server의 쿼리에서 반환되는 데이터를 정렬합니다.Sorts data returned by a query in SQL ServerSQL Server. 이 절을 사용하여 다음을 수행할 수 있습니다.Use this clause to:

  • 쿼리 결과 집합을 지정한 열 목록별로 정렬하고 필요한 경우 반환되는 행을 지정한 범위로 제한합니다.Order the result set of a query by the specified column list and, optionally, limit the rows returned to a specified range. ORDER BY 절을 지정하지 않으면 결과 집합에서 행이 반환되는 순서가 보장되지 않습니다.The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

  • 순위 함수 값이 결과 집합에 적용되는 순서를 결정합니다.Determine the order in which ranking function values are applied to the result set.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙Topic link icon Transact-SQL Syntax Conventions

注意

ORDER BY는 Azure Synapse AnalyticsAzure Synapse Analytics 또는 병렬 데이터 웨어하우스Parallel Data Warehouse의 SELECT/INTO 또는 CREATE TABLE AS SELECT (CTAS) 문에서 지원되지 않습니다.ORDER BY is not supported in SELECT/INTO or CREATE TABLE AS SELECT (CTAS) statements in Azure Synapse AnalyticsAzure Synapse Analytics or 병렬 데이터 웨어하우스Parallel Data Warehouse.

구문Syntax

-- Syntax for SQL Server and 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  
    ]  
}  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
[ ORDER BY   
    {  
    order_by_expression   
    [ ASC | DESC ]   
    } [ ,...n ]   
]   

注意

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

인수Arguments

order_by_expressionorder_by_expression
쿼리 결과 집합을 정렬할 열 또는 식을 지정합니다.Specifies a column or expression on which to sort the query result set. 열 정렬은 이름이나 열 별칭으로 지정되거나 SELECT 목록에 있는 열의 위치를 나타내는 음수가 아닌 정수로 지정될 수 있습니다.A sort column can be specified as a name or column alias, or a nonnegative integer representing the position of the column in the select list.

여러 개의 열 정렬을 지정할 수 있습니다.Multiple sort columns can be specified. 열 이름은 고유해야 합니다.Column names must be unique. ORDER BY 절에서 열 정렬의 순서가 정렬된 결과 집합의 구성 방식을 정의합니다.The sequence of the sort columns in the ORDER BY clause defines the organization of the sorted result set. 즉, 결과 집합은 첫 번째 열을 기준으로 정렬된 다음 이 정렬된 목록이 두 번째 열을 기준으로 정렬되는 식으로 정렬됩니다.That is, the result set is sorted by the first column and then that ordered list is sorted by the second column, and so on.

ORDER BY 절에서 참조하는 열 이름은 선택 목록의 열이나 열 별칭 또는 정확하게 FROM 절에서 지정한 테이블에 정의된 열과 같아야 합니다.The column names referenced in the ORDER BY clause must correspond to either a column or column alias in the select list or to a column defined in a table specified in the FROM clause without any ambiguities. ORDER BY 절이 선택 목록에서 열 별칭을 참조하는 경우 열 별칭을 독립 실행형으로 사용해야 하며, 예를 들어 ORDER BY 절의 일부 식으로 사용하지 않아야 합니다.If the ORDER BY clause references a column alias from the select list, the column alias must be used standalone, and not as a part of some expression in ORDER BY clause, for example:

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_nameCOLLATE collation_name
테이블이나 뷰에 정의된 열의 데이터 정렬이 아니라 collation_name 에 지정된 데이터 정렬에 따라 ORDER BY 작업을 수행하도록 지정합니다.Specifies that the ORDER BY operation should be performed according to the collation specified in collation_name, and not according to the collation of the column as defined in the table or view. collation_name 으로는 Windows 데이터 정렬 이름 또는 SQL 데이터 정렬 이름을 사용할 수 있습니다.collation_name can be either a Windows collation name or a SQL collation name. 자세한 내용은 Collation and Unicode Support을 참조하세요.For more information, see Collation and Unicode Support. COLLATE는 char, varchar, ncharnvarchar 형식의 열에만 적용할 수 있습니다.COLLATE is applicable only for columns of type char, varchar, nchar, and nvarchar.

ASC | DESCASC | DESC
지정된 열의 값이 오름차순으로 정렬되는지 내림차순으로 정렬되는지를 지정합니다.Specifies that the values in the specified column should be sorted in ascending or descending order. ASC는 오름차순으로 정렬하고,ASC sorts from the lowest value to highest value. DESC는 내림차순으로 정렬합니다.DESC sorts from highest value to lowest value. ASC가 기본 정렬 순서입니다.ASC is the default sort order. Null 값은 가능한 가장 작은 값으로 취급됩니다.Null values are treated as the lowest possible values.

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
쿼리 식에서 행을 반환하기 전에 건너뛸 행 수를 지정합니다.Specifies the number of rows to skip before it starts to return rows from the query expression. 값은 0보다 크거나 같은 정수 상수 또는 식일 수 있습니다.The value can be an integer constant or expression that is greater than or equal to zero.

적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 이상 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) and later and Azure SQL DatabaseAzure SQL Database.s

offset_row_count_expression 은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다.offset_row_count_expression can be a variable, parameter, or constant scalar subquery. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다.When a subquery is used, it cannot reference any columns defined in the outer query scope. 즉, 외부 쿼리와 상관 관계를 만들 수 없습니다.That is, it cannot be correlated with the outer query.

ROW와 ROWS는 ANSI 호환성을 위해 제공되는 동의어입니다.ROW and ROWS are synonyms and are provided for ANSI compatibility.

쿼리 실행 계획에서 오프셋 행 수 값은 TOP 쿼리 연산자의 Offset 특성에 표시됩니다.In query execution plans, the offset row count value is displayed in the Offset attribute of the TOP query operator.

FETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLYFETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
OFFSET 절을 처리한 후에 반환할 행 수를 지정합니다.Specifies the number of rows to return after the OFFSET clause has been processed. 값은 1보다 크거나 같은 정수 상수 또는 식일 수 있습니다.The value can be an integer constant or expression that is greater than or equal to one.

적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 이상 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) and later and Azure SQL DatabaseAzure SQL Database.

fetch_row_count_expression 은 변수, 매개 변수 또는 상수 스칼라 하위 쿼리일 수 있습니다.fetch_row_count_expression can be a variable, parameter, or constant scalar subquery. 하위 쿼리를 사용하는 경우 외부 쿼리 범위에 정의된 열을 참조할 수 없습니다.When a subquery is used, it cannot reference any columns defined in the outer query scope. 즉, 외부 쿼리와 상관 관계를 만들 수 없습니다.That is, it cannot be correlated with the outer query.

FIRST와 NEXT는 ANSI 호환성을 위해 제공되는 동의어입니다.FIRST and NEXT are synonyms and are provided for ANSI compatibility.

ROW와 ROWS는 ANSI 호환성을 위해 제공되는 동의어입니다.ROW and ROWS are synonyms and are provided for ANSI compatibility.

쿼리 실행 계획에서 오프셋 행 수 값은 TOP 쿼리 연산자의 Rows 또는 Top 특성에 표시됩니다.In query execution plans, the offset row count value is displayed in the Rows or Top attribute of the TOP query operator.

모범 사례Best Practices

ORDER BY 절에서 정수를 지정하는 방식으로 SELECT 목록에 있는 열의 위치를 나타내지 않도록 해야 합니다.Avoid specifying integers in the ORDER BY clause as positional representations of the columns in the select list. 예를 들어 SELECT ProductID, Name FROM Production.Production ORDER BY 2와 같은 문은 유효하지만 실제 열 이름을 지정하는 것에 비해 다른 사용자가 이해하기 어렵습니다.For example, although a statement such as SELECT ProductID, Name FROM Production.Production ORDER BY 2 is valid, the statement is not as easily understood by others compared with specifying the actual column name. 또한 열 순서 변경 또는 새 열 추가와 같이 SELECT 목록을 변경하려면 예기치 않은 결과가 발생하지 않도록 ORDER BY 절을 수정해야 합니다.In addition, changes to the select list, such as changing the column order or adding new columns, requires modifying the ORDER BY clause in order to avoid unexpected results.

SELECT TOP (N) 문에는 항상 ORDER BY 절을 사용합니다.In a SELECT TOP (N) statement, always use an ORDER BY clause. 이 방법은 TOP의 영향을 받는 행을 예측 가능한 방식으로 나타내는 유일한 방법입니다.This is the only way to predictably indicate which rows are affected by TOP. 자세한 내용은 TOP(Transact-SQL)을 참조하세요.For more information, see TOP (Transact-SQL).

상호 운용성Interoperability

ORDER BY 절을 SELECT...INTO 또는 INSERT...SELECT 문과 함께 사용하여 다른 원본에서 행을 삽입한 경우 지정된 순서대로 행이 삽입된다는 보장은 없습니다.When used with a SELECT...INTO or INSERT...SELECT statement to insert rows from another source, the ORDER BY clause does not guarantee the rows are inserted in the specified order.

뷰에서 OFFSET과 FETCH를 함께 사용하면 뷰의 updateability 속성이 변경되지 않습니다.Using OFFSET and FETCH in a view does not change the updateability property of the view.

제한 사항Limitations and Restrictions

ORDER BY 절의 열 개수에는 제한이 없지만 ORDER BY 절에 지정된 열의 전체 크기는 8,060바이트를 초과할 수 없습니다.There is no limit to the number of columns in the ORDER BY clause; however, the total size of the columns specified in an ORDER BY clause cannot exceed 8,060 bytes.

ntext, text, image, geography, geometryxml 형식의 열은 ORDER BY 절에서 사용할 수 없습니다.Columns of type ntext, text, image, geography, geometry, and xml cannot be used in an ORDER BY clause.

order_by_expression 이 순위 함수에 나타나는 경우 정수 또는 상수를 지정할 수 없습니다.An integer or constant cannot be specified when order_by_expression appears in a ranking function. 자세한 내용은 OVER 절(Transact-SQL)을 참조하세요.For more information, see OVER Clause (Transact-SQL).

FROM 절에 테이블 이름이 별칭으로 지정되어 있는 경우에는 ORDER BY 절에서 별칭 이름만 사용하여 해당 열을 정규화할 수 있습니다.If a table name is aliased in the FROM clause, only the alias name can be used to qualify its columns in the ORDER BY clause.

SELECT 문에 다음 절 또는 연산자 중 하나가 있으면 ORDER BY 절에 지정된 열 이름 및 별칭을 SELECT 문에도 정의해야 합니다.Column names and aliases specified in the ORDER BY clause must be defined in the select list if the SELECT statement contains one of the following clauses or operators:

  • UNION 연산자UNION operator

  • EXCEPT 연산자EXCEPT operator

  • INTERSECT 연산자INTERSECT operator

  • SELECT DISTINCTSELECT DISTINCT

또한 명령문에 UNION, EXCEPT 또는 INTERSECT 연산자가 포함되면, 첫 번째(왼쪽) 쿼리의 SELECT 목록에 열 이름 또는 열 별칭을 지정해야 합니다.Additionally, when the statement includes a UNION, EXCEPT, or INTERSECT operator, the column names, or column aliases must be specified in the select list of the first (left-side) query.

UNION, EXCEPT 또는 INTERSECT 연산자를 사용하는 쿼리에서는 문의 끝 부분에만 ORDER BY를 사용할 수 있습니다.In a query that uses UNION, EXCEPT, or INTERSECT operators, ORDER BY is allowed only at the end of the statement. 이 제한 사항은 UNION, EXCEPT 및 INTERSECT를 하위 쿼리가 아닌 최상위 수준 쿼리에서 지정하는 경우에만 적용됩니다.This restriction applies only to when you specify UNION, EXCEPT, and INTERSECT in a top-level query and not in a subquery. 뒷부분에 나오는 예 섹션을 참조하세요.See the Examples section that follows.

TOP 절 또는 OFFSET 및 FETCH 절을 함께 지정하지 않는 한 뷰, 인라인 함수, 파생 테이블 및 하위 쿼리에서 ORDER BY 절을 사용할 수 없습니다.The ORDER BY clause is not valid in views, inline functions, derived tables, and subqueries, unless either the TOP or OFFSET and FETCH clauses are also specified. 이러한 개체에서 ORDER BY 절을 사용하는 경우 이 절은 TOP 절 또는 OFFSET 및 FETCH 절에서 반환되는 행을 결정하기 위한 용도로만 사용됩니다.When ORDER BY is used in these objects, the clause is used only to determine the rows returned by the TOP clause or OFFSET and FETCH clauses. 쿼리 자체에 ORDER BY를 지정하지 않으면 ORDER BY 절은 이러한 구조에 대한 쿼리 시 정렬된 결과를 보장하지 않습니다.The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.

인덱싱 뷰 또는 CHECK OPTION을 사용하여 정의된 뷰에서는 OFFSET 및 FETCH가 지원되지 않습니다.OFFSET and FETCH are not supported in indexed views or in a view that is defined by using the CHECK OPTION clause.

OFFSET 및 FETCH는 TOP 및 ORDER BY를 허용하는 모든 쿼리에서 사용할 수 있지만 다음과 같은 제한 사항이 있습니다.OFFSET and FETCH can be used in any query that allows TOP and ORDER BY with the following limitations:

  • OVER 절은 OFFSET 및 FETCH를 지원하지 않습니다.The OVER clause does not support OFFSET and FETCH.

  • OFFSET 및 FETCH는 INSERT, UPDATE, MERGE 및 DELETE 문에서 직접 지정할 수 없지만 이러한 문에 정의된 하위 쿼리에서는 지정할 수 있습니다.OFFSET and FETCH cannot be specified directly in INSERT, UPDATE, MERGE, and DELETE statements, but can be specified in a subquery defined in these statements. 예를 들어 INSERT INTO SELECT 문의 경우 SELECT 문에서 OFFSET 및 FETCH를 지정할 수 있습니다.For example, in the INSERT INTO SELECT statement, OFFSET and FETCH can be specified in the SELECT statement.

  • UNION, EXCEPT 또는 INTERSECT 연산자를 사용하는 쿼리에서는 쿼리 결과의 순서를 지정하는 마지막 쿼리에서만 OFFSET 및 FETCH를 지정할 수 있습니다.In a query that uses UNION, EXCEPT or INTERSECT operators, OFFSET and FETCH can only be specified in the final query that specifies the order of the query results.

  • 같은 쿼리 식(같은 쿼리 범위)에서 TOP을 OFFSET 및 FETCH와 결합할 수 없습니다.TOP cannot be combined with OFFSET and FETCH in the same query expression (in the same query scope).

OFFSET 및 FETCH를 사용하여 반환되는 행 수 제한Using OFFSET and FETCH to limit the rows returned

TOP 절 대신 OFFSET 및 FETCH 절을 사용하여 쿼리 페이징 솔루션을 구현하고 클라이언트 애플리케이션으로 보내는 행 수를 제한하는 것이 좋습니다.We recommend that you use the OFFSET and FETCH clauses instead of the TOP clause to implement a query paging solution and limit the number of rows sent to a client application.

OFFSET 및 FETCH를 페이징 솔루션으로 사용하려면 클라이언트 애플리케이션에 반환되는 데이터의 각 "페이지"에 대해 쿼리를 한 번씩 실행해야 합니다.Using OFFSET and FETCH as a paging solution requires running the query one time for each "page" of data returned to the client application. 예를 들어 행 수가 10개씩 증가하는 쿼리 결과를 반환하려면 1~10행을 반환하는 쿼리를 한 번 실행한 다음 11~20행을 반환하는 쿼리를 다시 실행하고 이런 식으로 계속 쿼리를 실행해야 합니다.For example, to return the results of a query in 10-row increments, you must execute the query one time to return rows 1 to 10 and then run the query again to return rows 11 to 20 and so on. 각 쿼리는 독립적이며 어떤 방식으로도 서로 관련이 없습니다.Each query is independent and not related to each other in any way. 즉, 쿼리가 한 번 실행되면 서버에 상태가 유지되는 커서와 달리 클라이언트 애플리케이션에서 상태를 추적해야 합니다.This means that, unlike using a cursor in which the query is executed once and state is maintained on the server, the client application is responsible for tracking state. OFFSET 및 FETCH를 사용한 쿼리 요청 간에 안정적인 결과를 얻으려면 다음 조건을 충족해야 합니다.To achieve stable results between query requests using OFFSET and FETCH, the following conditions must be met:

  1. 쿼리에 사용되는 기본 데이터가 변경되지 않아야 합니다.The underlying data that is used by the query must not change. 즉, 쿼리와 연결된 행이 업데이트되지 않거나 페이지에 대한 모든 쿼리 요청이 스냅샷 또는 직렬화 가능 트랜잭션 격리를 사용하여 단일 트랜잭션에서 실행되어야 합니다.That is, either the rows touched by the query are not updated or all requests for pages from the query are executed in a single transaction using either snapshot or serializable transaction isolation. 이러한 트랜잭션 격리 수준에 대한 자세한 내용은 SET TRANSACTION ISOLATION LEVEL(Transact-SQL)을 참조하세요.For more information about these transaction isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

  2. ORDER BY 절이 고유한 열 또는 열의 조합을 포함해야 합니다.The ORDER BY clause contains a column or combination of columns that are guaranteed to be unique.

이 항목의 뒷부분에 나오는 예 섹션에서 "단일 트랜잭션에서 여러 쿼리 실행" 예를 참조하세요.See the example "Running multiple queries in a single transaction" in the Examples section later in this topic.

페이징 솔루션에 일관된 실행 계획이 중요한 경우 OFFSET 및 FETCH 매개 변수에 대한 OPTIMIZE FOR 쿼리 힌트를 사용하는 것이 좋습니다.If consistent execution plans are important in your paging solution, consider using the OPTIMIZE FOR query hint for the OFFSET and FETCH parameters. 이 항목의 뒷부분에 나오는 예 섹션에서 "식을 사용하여 OFFSET 및 FETCH 값 지정"을 참조하세요.See "Specifying expressions for OFFSET and FETCH values" in the Examples section later in this topic. OPTIMIZE FOR에 대한 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.For more information about OPTIMIZE FOR, see Query Hints (Transact-SQL).

Examples

범주Category 중요한 구문 요소Featured syntax elements
기본 구문Basic syntax ORDER BYORDER BY
오름차순 또는 내림차순 지정Specifying ascending and descending order DESC • ASCDESC • ASC
데이터 정렬 지정Specifying a collation COLLATECOLLATE
조건부 순서 지정Specifying a conditional order CASE 식CASE expression
순위 함수에 ORDER BY 사용Using ORDER BY in a ranking function 순위 함수Ranking functions
반환되는 행 수 제한Limiting the number of rows returned OFFSET • FETCHOFFSET • FETCH
UNION, EXCEPT 및 INTERSECT가 포함된 ORDER BY 사용Using ORDER BY with UNION, EXCEPT, and INTERSECT UNIONUNION

기본 구문Basic syntax

이 섹션의 예에서는 최소 필수 구문을 사용하여 ORDER BY 절의 기본 기능을 보여 줍니다.Examples in this section demonstrate the basic functionality of the ORDER BY clause using the minimum required syntax.

A.A. SELECT 목록에 정의된 단일 열 지정Specifying a single column defined in the select list

다음 예에서는 숫자 열 ProductID를 기준으로 결과 집합을 정렬합니다.The following example orders the result set by the numeric ProductID column. 특정 정렬 순서를 지정하지 않으므로 기본값(오름차순)이 사용됩니다.Because a specific sort order is not specified, the default (ascending order) is used.

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

B.B. SELECT 목록에 정의되지 않은 열 지정Specifying a column that is not defined in the select list

다음 예에서는 SELECT 목록에 없지만 FROM 절에 지정된 테이블에 정의되어 있는 열을 기준으로 결과 집합을 정렬합니다.The following example orders the result set by a column that is not included in the select list, but is defined in the table specified in the FROM clause.

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

C.C. 별칭을 정렬 열로 지정Specifying an alias as the sort column

다음 예에서는 열 별칭 SchemaName을 정렬 순서 열로 지정합니다.The following example specifies the column alias SchemaName as the sort order column.

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

D.D. 식을 정렬 열로 지정Specifying an expression as the sort column

다음 예에서는 식을 정렬 열로 사용합니다.The following example uses an expression as the sort column. 이 식은 DATEPART 함수를 사용하여 직원이 고용된 연도별로 결과 집합을 정렬하도록 정의됩니다.The expression is defined by using the DATEPART function to sort the result set by the year in which employees were hired.

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

오름차순 또는 내림차순 정렬 지정Specifying ascending and descending sort order

A.A. 내림차순 지정Specifying a descending order

다음 예에서는 숫자 열 ProductID를 기준으로 내림차순으로 결과 집합을 정렬합니다.The following example orders the result set by the numeric column ProductID in descending order.

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

B.B. 오름차순 지정Specifying an ascending order

다음 예에서는 Name 열을 기준으로 오름차순으로 결과 집합을 정렬합니다.The following example orders the result set by the Name column in ascending order. 문자가 숫자순이 아니라 사전순으로 정렬됩니다.The characters are sorted alphabetically, not numerically. 즉, 10이 2보다 먼저 옵니다.That is, 10 sorts before 2.

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

C.C. 오름차순과 내림차순 둘 다 지정Specifying both ascending and descending order

다음 예에서는 두 열을 기준으로 결과 집합을 정렬합니다.The following example orders the result set by two columns. 쿼리 결과 집합은 먼저 FirstName 열을 기준으로 오름차순으로 정렬된 다음 LastName 열을 기준으로 내림차순으로 정렬됩니다.The query result set is first sorted in ascending order by the FirstName column and then sorted in descending order by the LastName column.

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

데이터 정렬 지정Specifying a collation

다음 예에서는 ORDER BY 절에서 데이터 정렬을 지정할 경우 쿼리 결과가 반환되는 순서가 어떻게 변경되는지를 보여 줍니다.The following example shows how specifying a collation in the ORDER BY clause can change the order in which the query results are returned. 대/소문자 및 액센트를 구분하지 않는 데이터 정렬을 사용하여 정의된 열이 포함된 테이블이 만들어집니다.A table is created that contains a column defined by using a case-insensitive, accent-insensitive collation. 다양한 대/소문자와 악센트가 있는 값을 삽입했습니다.Values are inserted with a variety of case and accent differences. ORDER BY 절에서 데이터 정렬을 지정하지 않았으므로 첫 번째 쿼리는 열의 데이터 정렬을 사용하여 값을 정렬합니다.Because a collation is not specified in the ORDER BY clause, the first query uses the collation of the column when sorting the values. 두 번째 쿼리에서는 ORDER BY 절에 대/소문자 구분 및 악센트 구분 데이터 정렬을 지정했으므로 행이 반환되는 순서가 변경됩니다.In the second query, a case-sensitive, accent-sensitive collation is specified in the ORDER BY clause, which changes the order in which the rows are returned.

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;  

조건부 순서 지정Specifying a conditional order

다음 예제에서는 ORDER BY 절에 CASE 식을 사용하여 지정된 열 값에 따라 행의 정렬 순서를 조건부로 결정합니다.The following examples use the CASE expression in an ORDER BY clause to conditionally determine the sort order of the rows based on a given column value. 첫 번째 예에서는 SalariedFlag 테이블의 HumanResources.Employee 열의 값이 계산됩니다.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. SalariedFlag가 1로 설정된 직원은 BusinessEntityID 순서에 따라 내림차순으로 반환됩니다.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. SalariedFlag가 0으로 설정된 직원은 BusinessEntityID 순서에 따라 오름차순으로 반환됩니다.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. 두 번째 예에서 결과 집합은 TerritoryName 열이 'United States'와 동일하면 CountryRegionName 열을 기준으로 정렬되고 그 외 다른 행에는 CountryRegionName 열을 기준으로 정렬됩니다.In the second example, the result set is ordered by the column TerritoryName when the column CountryRegionName is equal to 'United States' and by CountryRegionName for all other rows.

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 사용Using ORDER BY in a ranking function

다음 예에서는 순위 함수 ROW_NUMBER, RANK, DENSE_RANK 및 NTILE에 ORDER BY 절을 사용합니다.The following example uses the ORDER BY clause in the ranking functions ROW_NUMBER, RANK, DENSE_RANK, and NTILE.

USE AdventureWorks2012;  
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;  

반환되는 행 수 제한Limiting the number of rows returned

다음 예에서는 OFFSET 및 FETCH를 사용하여 쿼리에서 반환되는 행 수를 제한합니다.The following examples use OFFSET and FETCH to limit the number of rows returned by a query.

적용 대상: SQL Server 2012(11.x)SQL Server 2012 (11.x) 이상 및 Azure SQL DatabaseAzure SQL DatabaseApplies to: SQL Server 2012(11.x)SQL Server 2012 (11.x) and later and Azure SQL DatabaseAzure SQL Database.

A.A. 정수 상수를 사용하여 OFFSET 및 FETCH 값 지정Specifying integer constants for OFFSET and FETCH values

다음 예에서는 정수 상수를 OFFSET 및 FETCH 절의 값으로 지정합니다.The following example specifies an integer constant as the value for the OFFSET and FETCH clauses. 첫 번째 쿼리는 DepartmentID 열을 기준으로 정렬된 모든 행을 반환합니다.The first query returns all rows sorted by the column DepartmentID. 이 쿼리에서 반환된 결과를 다음에 나오는 두 쿼리의 결과와 비교해 보세요.Compare the results returned by this query with the results of the two queries that follow it. 다음 쿼리에서는 OFFSET 5 ROWS 절을 사용하여 처음 5개 행을 건너뛰고 나머지 행을 모두 반환합니다.The next query uses the clause OFFSET 5 ROWS to skip the first 5 rows and return all remaining rows. 마지막 쿼리에서는 OFFSET 0 ROWS 절을 사용하여 첫 번째 행에서 시작한 다음 FETCH NEXT 10 ROWS ONLY를 사용하여 반환되는 행을 정렬된 결과 집합의 10개 행으로 제한합니다.The final query uses the clause OFFSET 0 ROWS to start with the first row and then uses FETCH NEXT 10 ROWS ONLY to limit the rows returned to 10 rows from the sorted result set.

USE AdventureWorks2012;  
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.B. 변수를 사용하여 OFFSET 및 FETCH 값 지정Specifying variables for OFFSET and FETCH values

다음 예에서는 변수 @RowsToSkip@FetchRows를 선언하고 이러한 변수를 OFFSET 및 FETCH 절에 지정합니다.The following example declares the variables @RowsToSkip and @FetchRows and specifies these variables in the OFFSET and FETCH clauses.

USE AdventureWorks2012;  
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.C. 식을 사용하여 OFFSET 및 FETCH 값 지정Specifying expressions for OFFSET and FETCH values

다음 예에서는 @StartingRowNumber - 1 식을 사용하여 OFFSET 값을 지정하고, @EndingRowNumber - @StartingRowNumber + 1 식을 사용하여 FETCH 값을 지정합니다.The following example uses the expression @StartingRowNumber - 1 to specify the OFFSET value and the expression @EndingRowNumber - @StartingRowNumber + 1 to specify the FETCH value. 또한 OPTIMIZE FOR 쿼리 힌트를 지정합니다.In addition, the query hint, OPTIMIZE FOR, is specified. 이 힌트는 쿼리가 컴파일되고 최적화될 때 지역 변수에 대해 특정 값을 제공하는 데 사용될 수 있습니다.This hint can be used to provide a particular value for a local variable when the query is compiled and optimized. 해당 값은 쿼리 최적화 중에만 사용되고 쿼리 실행 중에는 사용되지 않습니다.The value is used only during query optimization, and not during query execution. 자세한 내용은 쿼리 힌트(Transact-SQL)를 참조하세요.For more information, see Query Hints (Transact-SQL).

USE AdventureWorks2012;  
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.D. 상수 스칼라 하위 쿼리를 사용하여 OFFSET 및 FETCH 값 지정Specifying a constant scalar subquery for OFFSET and FETCH values

다음 예에서는 상수 스칼라 하위 쿼리를 사용하여 FETCH 절의 값을 정의합니다.The following example uses a constant scalar subquery to define the value for the FETCH clause. 이 하위 쿼리는 PageSize 테이블의 dbo.AppSettings 열에서 단일 값을 반환합니다.The subquery returns a single value from the column PageSize in the table dbo.AppSettings.

-- Specifying a constant scalar subquery  
USE AdventureWorks2012;  
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.E. 단일 트랜잭션에서 여러 쿼리 실행Running multiple queries in a single transaction

다음 예에서는 쿼리의 모든 요청에서 안정적인 결과가 반환되도록 페이징 솔루션을 구현하는 한 가지 방법을 보여 줍니다.The following example shows one method of implementing a paging solution that ensures stable results are returned in all requests from the query. 쿼리는 스냅샷 격리 수준을 사용하여 단일 트랜잭션에서 실행되며, ORDER BY 절에 지정된 열이 열의 고유성을 보장합니다.The query is executed in a single transaction using the snapshot isolation level, and the column specified in the ORDER BY clause ensures column uniqueness.

USE AdventureWorks2012;  
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'AdventureWorks2012') = 0  
    ALTER DATABASE AdventureWorks2012 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 사용Using ORDER BY with UNION, EXCEPT, and INTERSECT

쿼리에서 UNION, EXCEPT 또는 INTERSECT 연산자를 사용하는 경우 문의 끝 부분에 ORDER BY 절을 지정해야 하며 조합된 쿼리 결과가 정렬됩니다.When a query uses the UNION, EXCEPT, or INTERSECT operators, the ORDER BY clause must be specified at the end of the statement and the results of the combined queries are sorted. 다음 예에서는 빨간색 또는 노란색 제품을 모두 반환하고 이 조합된 목록을 ListPrice 열을 기준으로 정렬합니다.The following example returns all products that are red or yellow and sorts this combined list by the column ListPrice.

USE AdventureWorks2012;  
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 AnalyticsAzure Synapse Analytics병렬 데이터 웨어하우스Parallel Data WarehouseExamples: Azure Synapse AnalyticsAzure Synapse Analytics and 병렬 데이터 웨어하우스Parallel Data Warehouse

다음 예제에서는 결과 집합을 숫자 EmployeeKey 열을 기준으로 오름차순으로 정렬하는 방법을 보여 줍니다.The following example demonstrates ordering of a result set by the numerical EmployeeKey column in ascending order.

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

다음 예제에서는 결과 집합을 숫자 EmployeeKey 열을 기준으로 내림차순으로 정렬합니다.The following example orders a result set by the numerical EmployeeKey column in descending order.

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

다음 예제에서는 결과 집합을 LastName 열을 기준으로 정렬합니다.The following example orders a result set by the LastName column.

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

다음 예제에서는 두 열을 기준으로 정렬합니다.The following example orders by two columns. 이 쿼리는 먼저 FirstName 열을 기준으로 오름차순으로 정렬한 다음, 공통 FirstName 값을 LastName 열을 기준으로 내림차순으로 정렬합니다.This query first sorts in ascending order by the FirstName column, and then sorts common FirstName values in descending order by the LastName column.

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

참고 항목See Also

식(Transact-SQL) Expressions (Transact-SQL)
SELECT(Transact-SQL) SELECT (Transact-SQL)
FROM(Transact-SQL) FROM (Transact-SQL)
순위 함수(Transact-SQL) Ranking Functions (Transact-SQL)
TOP(Transact SQL) TOP (Transact-SQL)
쿼리 힌트(Transact-SQL) Query Hints (Transact-SQL)
EXCEPT and INTERSECT (Transact-SQL) EXCEPT and INTERSECT (Transact-SQL)
UNION(Transact-SQL) UNION (Transact-SQL)
CASE(Transact-SQL)CASE (Transact-SQL)