SELECT – Cláusula ORDER BY (Transact-SQL)SELECT - ORDER BY Clause (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Classifica dados retornados por uma consulta no SQL ServerSQL Server.Sorts data returned by a query in SQL ServerSQL Server. Use esta cláusula para:Use this clause to:

  • Classificar o conjunto de resultados de uma consulta pela lista de colunas especificada e, opcionalmente, limitar as linhas retornadas a um intervalo especificado.Order the result set of a query by the specified column list and, optionally, limit the rows returned to a specified range. A ordem na qual as linhas são retornadas em um conjunto de resultados não é garantida, a menos que uma cláusula ORDER BY seja especificada.The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

  • Determine a ordem na qual os valores da função de classificação serão aplicados ao conjunto de resultados.Determine the order in which ranking function values are applied to the result set.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

Observação

ORDER BY não é compatível com as instruções SELECT/INTO ou CREATE TABLE AS SELECT (CTAS) no Azure SQL Data WarehouseAzure SQL Data Warehouse nem no Parallel Data WarehouseParallel Data Warehouse.ORDER BY is not supported in SELECT/INTO or CREATE TABLE AS SELECT (CTAS) statements in Azure SQL Data WarehouseAzure SQL Data Warehouse or Parallel Data WarehouseParallel Data Warehouse.

SintaxeSyntax

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

ArgumentosArguments

order_by_expressionorder_by_expression
Especifica uma coluna ou expressão na qual o conjunto de resultados da consulta deve ser classificado.Specifies a column or expression on which to sort the query result set. Uma coluna de classificação pode ser especificada como um nome ou alias de coluna, ou um inteiro não negativo que representa a posição da coluna na lista de seleção.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.

Várias colunas de classificação podem ser especificadas.Multiple sort columns can be specified. Os nomes de coluna devem ser exclusivos.Column names must be unique. A sequência das colunas de classificação na cláusula ORDER BY define a organização do conjunto de resultados classificado.The sequence of the sort columns in the ORDER BY clause defines the organization of the sorted result set. Ou seja, o conjunto de resultados é classificado pela primeira coluna e então essa lista ordenada é classificada pela segunda coluna e assim por diante.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.

Os nomes de coluna referenciados na cláusula ORDER BY devem corresponder a uma coluna ou a um alias de coluna na lista de seleção ou a uma coluna definida em uma tabela especificada na cláusula FROM sem nenhuma ambiguidade.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. Se a cláusula ORDER BY fizer referência a um alias de coluna na lista de seleção, o alias de coluna deverá ser usado de modo autônomo, e não como parte de alguma expressão na cláusula ORDER BY, por exemplo: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
Especifica que a operação ORDER BY deve ser executada de acordo com a ordenação especificada em collation_name e não de acordo com a ordenação da coluna definida na tabela ou na exibição.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 pode ser um nome de ordenação do Windows ou um nome de ordenação SQL.collation_name can be either a Windows collation name or a SQL collation name. Para obter mais informações, consulte Suporte a ordenações e a Unicode.For more information, see Collation and Unicode Support. COLLATE é aplicável somente a colunas do tipo char, varchar, nchar e nvarchar.COLLATE is applicable only for columns of type char, varchar, nchar, and nvarchar.

ASC | DESCASC | DESC
Define que os valores na coluna especificada devem ser classificados em ordem crescente ou decrescente.Specifies that the values in the specified column should be sorted in ascending or descending order. ASC classifica do valor mais baixo para o valor mais alto.ASC sorts from the lowest value to highest value. DESC classifica do valor mais alto para o valor mais baixo.DESC sorts from highest value to lowest value. ASC é a ordem de classificação padrão.ASC is the default sort order. Valores nulos são tratados como os menores valores possíveis.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 }
Especifica o número de linhas que devem ser ignoradas antes de começar a retornar linhas da expressão de consulta.Specifies the number of rows to skip before it starts to return rows from the query expression. O valor pode ser uma expressão ou constante inteira que seja maior que ou igual a zero.The value can be an integer constant or expression that is greater than or equal to zero.

Aplica-se a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) até o SQL Server 2017SQL Server 2017 e o Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.s

offset_row_count_expression pode ser uma subconsulta escalar de constante, parâmetro ou variável.offset_row_count_expression can be a variable, parameter, or constant scalar subquery. Quando uma subconsulta é usada, ela não pode referenciar nenhuma coluna definida no escopo de consulta externa.When a subquery is used, it cannot reference any columns defined in the outer query scope. Ou seja, ela não pode ser correlacionada com a consulta externa.That is, it cannot be correlated with the outer query.

ROW e ROWS são sinônimos fornecidos para compatibilidade ANSI.ROW and ROWS are synonyms and are provided for ANSI compatibility.

Nos planos de execução de consulta, o valor da contagem de linhas de deslocamento é exibido no atributo Offset do operador de consulta TOP.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
Especifica o número de linhas que devem ser retornadas depois que a cláusula OFFSET for processada.Specifies the number of rows to return after the OFFSET clause has been processed. O valor pode ser uma expressão ou constante inteira que seja maior que ou igual a um.The value can be an integer constant or expression that is greater than or equal to one.

Aplica-se a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

fetch_row_count_expression pode ser uma subconsulta escalar de constante, parâmetro ou variável.fetch_row_count_expression can be a variable, parameter, or constant scalar subquery. Quando uma subconsulta é usada, ela não pode referenciar nenhuma coluna definida no escopo de consulta externa.When a subquery is used, it cannot reference any columns defined in the outer query scope. Ou seja, ela não pode ser correlacionada com a consulta externa.That is, it cannot be correlated with the outer query.

FIRST e NEXT são sinônimos fornecidos para compatibilidade ANSI.FIRST and NEXT are synonyms and are provided for ANSI compatibility.

ROW e ROWS são sinônimos fornecidos para compatibilidade ANSI.ROW and ROWS are synonyms and are provided for ANSI compatibility.

Nos planos de execução de consulta, o valor da contagem de linhas de deslocamento é exibido no atributo Rows ou Top do operador de consulta TOP.In query execution plans, the offset row count value is displayed in the Rows or Top attribute of the TOP query operator.

Práticas recomendadasBest Practices

Evite especificar inteiros na cláusula ORDER BY como representações de posição das colunas na lista de seleção.Avoid specifying integers in the ORDER BY clause as positional representations of the columns in the select list. Por exemplo, embora uma instrução como SELECT ProductID, Name FROM Production.Production ORDER BY 2 seja válida, ela não é entendida por outros com tanta facilidade quanto com a especificação do nome de coluna real.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. Além disso, as alterações na lista de seleção, como a alteração da ordem das colunas ou a adição de novas colunas, exigirão a modificação da cláusula ORDER BY para evitar resultados inesperados.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.

Em uma instrução SELECT TOP (N), sempre use uma cláusula ORDER BY.In a SELECT TOP (N) statement, always use an ORDER BY clause. Essa é a única forma de indicar de maneira previsível as linhas que são afetadas por TOP.This is the only way to predictably indicate which rows are affected by TOP. Para obter mais informações, confira TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

InteroperabilidadeInteroperability

Quando usada com uma instrução SELECT…INTO para inserir linhas de outra origem, a cláusula ORDER BY não garante que as linhas sejam inseridas na ordem especificada.When used with a SELECT...INTO statement to insert rows from another source, the ORDER BY clause does not guarantee the rows are inserted in the specified order.

O uso de OFFSET e FETCH em uma exibição não altera a propriedade updateability da exibição.Using OFFSET and FETCH in a view does not change the updateability property of the view.

Limitações e RestriçõesLimitations and Restrictions

Não há um limite para o número de colunas na cláusula ORDER BY; porém, o tamanho total das colunas especificado em uma cláusula ORDER BY não pode exceder 8.060 bytes.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.

As colunas do tipo ntext, text, image, geography, geometry e XML não podem ser usadas em uma cláusula ORDER BY.Columns of type ntext, text, image, geography, geometry, and xml cannot be used in an ORDER BY clause.

Nem um inteiro nem uma constante podem ser especificados quando order_by_expression aparece em uma função de classificação.An integer or constant cannot be specified when order_by_expression appears in a ranking function. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Se um nome de tabela tiver um alias na cláusula FROM, apenas o nome do alias poderá ser utilizado para qualificar suas colunas na cláusula 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.

Os nomes e aliases de coluna especificados na cláusula ORDER BY deverão ser definidos na lista de seleção, se a instrução SELECT contiver uma das seguintes cláusulas ou dos seguintes operadores: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:

  • operador UNIONUNION operator

  • operador EXCEPTEXCEPT operator

  • operador INTERSECTINTERSECT operator

  • SELECT DISTINCTSELECT DISTINCT

Além disso, quando a instrução incluir um operador UNION, EXCEPT ou INTERSECT, os nomes ou aliases de coluna precisarão ser especificados na lista de seleção da primeira consulta (do lado esquerdo).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.

Em uma consulta que usa operadores UNION, EXCEPT ou INTERSECT, ORDER BY é permitida somente ao final da instrução.In a query that uses UNION, EXCEPT, or INTERSECT operators, ORDER BY is allowed only at the end of the statement. Essa restrição aplica-se apenas ao especificar UNION, EXCEPT e INTERSECT em uma consulta de nível superior e não em uma subconsulta.This restriction applies only to when you specify UNION, EXCEPT, and INTERSECT in a top-level query and not in a subquery. Consulte a seção de Exemplos a seguir.See the Examples section that follows.

A cláusula ORDER BY é inválida em exibições, funções embutidas, tabelas derivadas e subconsultas, a menos que as cláusulas TOP ou OFFSET e FETCH também estejam especificadas.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. Quando ORDER BY é usada nesses objetos, a cláusula é utilizada apenas para determinar as linhas retornadas pela cláusula TOP ou pelas cláusulas OFFSET e 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. A cláusula ORDER BY não garante resultados ordenados quando essas construções são consultadas, a menos que ORDER BY também seja especificada na própria consulta.The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.

Não há suporte para OFFSET e FETCH exibições indexadas ou em uma exibição definida usando a cláusula de CHECK OPTION.OFFSET and FETCH are not supported in indexed views or in a view that is defined by using the CHECK OPTION clause.

OFFSET e FETCH podem ser usadas em qualquer consulta que permita TOP e ORDER BY, com as seguintes limitações:OFFSET and FETCH can be used in any query that allows TOP and ORDER BY with the following limitations:

  • A cláusula OVER não dá suporte a OFFSET e FETCH.The OVER clause does not support OFFSET and FETCH.

  • Não é possível especificar OFFSET e FETCH diretamente em instruções INSERT, UPDATE, MERGE e DELETE, mas elas podem ser especificadas em uma subconsulta definida nessas instruções.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. Por exemplo, na instrução INSERT INTO SELECT, OFFSET e FETCH podem ser especificadas na instrução SELECT.For example, in the INSERT INTO SELECT statement, OFFSET and FETCH can be specified in the SELECT statement.

  • Em uma consulta que use operadores UNION, EXCEPT ou INTERSECT, OFFSET e FETCH podem ser especificadas somente na consulta final que define a ordem dos resultados da consulta.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.

  • Não é possível combinar TOP com OFFSET e FETCH na mesma expressão de consulta (no mesmo escopo de consulta).TOP cannot be combined with OFFSET and FETCH in the same query expression (in the same query scope).

Usando OFFSET e FETCH para limitar as linhas retornadasUsing OFFSET and FETCH to limit the rows returned

É recomendável usar as cláusulas OFFSET e FETCH em vez da cláusula TOP para implementar uma solução de paginação de consulta e limitar o número de linhas enviadas a um aplicativo cliente.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.

O uso de OFFSET e FETCH como solução de paginação exige a execução da consulta uma vez para cada "página" de dados retornados para o aplicativo cliente.Using OFFSET and FETCH as a paging solution requires running the query one time for each "page" of data returned to the client application. Por exemplo, para retornar os resultados de uma consulta em incrementos de 10 linhas, você deve executar a consulta uma vez para retornar as linhas 1 a 10, depois executar a consulta novamente para retornar as linhas 11 a 20 e assim por diante.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. Cada consulta é independente e elas não são relacionadas entre si.Each query is independent and not related to each other in any way. Isso significa que, diferentemente de usar um cursor no qual a consulta é executada uma vez e o estado é mantido no servidor, o aplicativo cliente é responsável para controlar o estado.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. Para obter resultados estáveis entre solicitações de consulta que usam OFFSET e FETCH, as seguintes condições devem ser atendidas:To achieve stable results between query requests using OFFSET and FETCH, the following conditions must be met:

  1. Os dados subjacentes que são usados pela consulta não devem ser alterados.The underlying data that is used by the query must not change. Ou seja, as linhas afetadas pela consulta não são atualizadas ou todas as solicitações de páginas da consulta são executadas em uma única transação usando isolamento de transação serializável ou de instantâneo.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. Para obter mais informações sobre esses níveis de isolamento de transação, confira SET TRANSACTION ISOLATION LEVEL (Transact-SQL).For more information about these transaction isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

  2. A cláusula ORDER BY contém uma coluna ou combinação de colunas cuja exclusividade é garantida.The ORDER BY clause contains a column or combination of columns that are guaranteed to be unique.

Consulte o exemplo "Executando várias consultas em uma única transação" na seção de Exemplos posteriormente neste tópico.See the example "Running multiple queries in a single transaction" in the Examples section later in this topic.

Se planos de execução consistentes forem importantes na sua solução de paginação, considere o uso da dica de consulta OPTIMIZE FOR para os parâmetros OFFSET e FETCH.If consistent execution plans are important in your paging solution, consider using the OPTIMIZE FOR query hint for the OFFSET and FETCH parameters. Consulte "Especificado expressões para valores de OFFSET e FETCH" na seção de Exemplos posteriormente neste tópico.See "Specifying expressions for OFFSET and FETCH values" in the Examples section later in this topic. Para obter mais informações sobre OPTIMIZE FOR, confira Dicas de consulta (Transact-SQL).For more information about OPTIMIZE FOR, see Query Hints (Transact-SQL).

ExemplosExamples

CategoriaCategory Elementos de sintaxe em destaqueFeatured syntax elements
Sintaxe básicaBasic syntax ORDER BYORDER BY
Especificando a ordem crescente e decrescenteSpecifying ascending and descending order DESC • ASCDESC • ASC
Especificando uma ordenaçãoSpecifying a collation COLLATECOLLATE
Especificando uma ordem condicionalSpecifying a conditional order expressão CASECASE expression
Usando ORDER BY em uma função de classificaçãoUsing ORDER BY in a ranking function Funções de classificaçãoRanking functions
Limitando o número de linhas retornadasLimiting the number of rows returned OFFSET • FETCHOFFSET • FETCH
Usando ORDER BY com UNION, EXCEPT e INTERSECTUsing ORDER BY with UNION, EXCEPT, and INTERSECT UNIONUNION

Sintaxe básicaBasic syntax

Os exemplos nesta seção demonstram a funcionalidade básica da cláusula ORDER BY usando a sintaxe mínima necessária.Examples in this section demonstrate the basic functionality of the ORDER BY clause using the minimum required syntax.

A.A. Especificando uma única coluna definida na lista de seleçãoSpecifying a single column defined in the select list

O exemplo a seguir classifica o conjunto de resultados pela coluna numérica ProductID.The following example orders the result set by the numeric ProductID column. Como não foi especificada nenhuma ordem de classificação específica, o padrão (ordem crescente) é usado.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. Especificando uma única coluna não definida na lista de seleçãoSpecifying a column that is not defined in the select list

O exemplo a seguir classifica o conjunto de resultados por uma coluna que não está incluída na lista de seleção, mas que foi definida na tabela especificada na cláusula 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. Especificando um alias como a coluna de classificaçãoSpecifying an alias as the sort column

O exemplo a seguir especifica o alias de coluna SchemaName como a coluna da ordem de classificação.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. Especificando uma expressão como a coluna de classificaçãoSpecifying an expression as the sort column

O exemplo a seguir usa uma expressão como a coluna de classificação.The following example uses an expression as the sort column. A expressão é definida usando a função DATEPART para classificar o conjunto de resultados pelo ano no qual os funcionários foram contratados.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);  
  

Especificando a ordem de classificação crescente e decrescenteSpecifying ascending and descending sort order

A.A. Especificando uma ordem decrescenteSpecifying a descending order

O exemplo a seguir classifica o conjunto de resultados pela coluna numérica ProductID na ordem decrescente.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. Especificando uma ordem crescenteSpecifying an ascending order

O exemplo a seguir classifica o conjunto de resultados pela coluna Name na ordem crescente.The following example orders the result set by the Name column in ascending order. Os caracteres são classificados em ordem alfabética e não em ordem numérica.The characters are sorted alphabetically, not numerically. Ou seja, 10 é tem uma classificação anterior a 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. Especificando as ordens crescente e decrescenteSpecifying both ascending and descending order

O exemplo a seguir classifica o conjunto de resultados por duas colunas.The following example orders the result set by two columns. O conjunto de resultados da consulta é classificado primeiro na ordem crescente pela coluna FirstName e, em seguida, na ordem decrescente pela coluna 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 ;  
  

Especificando uma ordenaçãoSpecifying a collation

O exemplo a seguir mostra como a especificação de uma ordenação na cláusula ORDER BY pode alterar a ordem na qual os resultados da consulta são retornados.The following example shows how specifying a collation in the ORDER BY clause can change the order in which the query results are returned. É criada uma tabela que contém uma coluna definida usando uma ordenação sem diferenciação de maiúsculas e minúsculas, nem de acentos.A table is created that contains a column defined by using a case-insensitive, accent-insensitive collation. Os valores são inseridos com várias diferenças de maiúsculas e minúsculas e de acentos.Values are inserted with a variety of case and accent differences. Como não foi especificado uma ordenação na cláusula ORDER BY, a primeira consulta usa a ordenação da coluna ao classificar os valores.Because a collation is not specified in the ORDER BY clause, the first query uses the collation of the column when sorting the values. Na segunda consulta, uma ordenação com diferenciação de maiúsculas e minúsculas e de acentos é especificada na cláusula ORDER BY, o que altera a ordem na qual as linhas são retornadas.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;  
  

Especificando uma ordem condicionalSpecifying a conditional order

O exemplo a seguir usa a expressão CASE em uma cláusula ORDER BY para determinar condicionalmente a ordem de classificação das linhas com base em um determinado valor de coluna.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. No primeiro exemplo, é avaliado o valor da coluna SalariedFlag da tabela HumanResources.Employee.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Funcionários que têm o SalariedFlag definido como 1 são retornados pelo BusinessEntityID em ordem decrescente.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Funcionários que têm o SalariedFlag definido como 0 são retornados pelo BusinessEntityID em ordem crescente.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. No segundo exemplo, o conjunto de resultados será ordenado pela coluna TerritoryName quando a coluna CountryRegionName for igual a 'United States' e por CountryRegionName para todas as outras linhas.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;  
  

Usando ORDER BY em uma função de classificaçãoUsing ORDER BY in a ranking function

O exemplo as seguir usa a cláusula ORDER BY nas funções de classificação ROW_NUMBER, RANK, DENSE_RANK e NTILE.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;  
  

Limitando o número de linhas retornadasLimiting the number of rows returned

Os exemplos as seguir usam OFFSET e FETCH para limitar o número de linhas retornadas por uma consulta.The following examples use OFFSET and FETCH to limit the number of rows returned by a query.

Aplica-se a: SQL Server 2012 (11.x)SQL Server 2012 (11.x) a SQL Server 2017SQL Server 2017 e Banco de dados SQL do AzureAzure SQL Database.Applies to: SQL Server 2012 (11.x)SQL Server 2012 (11.x) through SQL Server 2017SQL Server 2017 and Banco de dados SQL do AzureAzure SQL Database.

A.A. Especificando constantes inteiras para valores de OFFSET e FETCHSpecifying integer constants for OFFSET and FETCH values

O exemplo a seguir especifica uma constante inteira como o valor das cláusulas OFFSET e FETCH.The following example specifies an integer constant as the value for the OFFSET and FETCH clauses. A primeira consulta retorna todas as linhas classificadas pela coluna DepartmentID.The first query returns all rows sorted by the column DepartmentID. Compare os resultados retornados por essa consulta com os resultados das duas consultas seguintes.Compare the results returned by this query with the results of the two queries that follow it. A próxima consulta usa a cláusula OFFSET 5 ROWS para ignorar as cinco primeiras linhas e retornar todas as linhas restantes.The next query uses the clause OFFSET 5 ROWS to skip the first 5 rows and return all remaining rows. A consulta final usa a cláusula OFFSET 0 ROWS para iniciar com a primeira linha e depois usa FETCH NEXT 10 ROWS ONLY para limitar as linhas retornadas a 10 linhas do conjunto de resultados classificado.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. Especificando variáveis para valores de OFFSET e FETCHSpecifying variables for OFFSET and FETCH values

O exemplo a seguir declara as variáveis @StartingRowNumber e @FetchRows, e especifica essas variáveis nas cláusulas OFFSET e FETCH.The following example declares the variables @StartingRowNumber and @FetchRows and specifies these variables in the OFFSET and FETCH clauses.

USE AdventureWorks2012;  
GO  
-- Specifying variables for OFFSET and FETCH values    
DECLARE @StartingRowNumber tinyint = 1  
      , @FetchRows tinyint = 8;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber ROWS   
    FETCH NEXT @FetchRows ROWS ONLY;  
  

C.C. Especificando expressões para valores de OFFSET e FETCHSpecifying expressions for OFFSET and FETCH values

O exemplo a seguir usa a expressão @StartingRowNumber - 1 para especificar o valor de OFFSET e a expressão @EndingRowNumber - @StartingRowNumber + 1 para especificar o valor de 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. Além disso, é especificada a dica de consulta, OPTIMIZE FOR.In addition, the query hint, OPTIMIZE FOR, is specified. Essa dica pode ser usada para fornecer um valor específico para uma variável local quando a consulta é compilada e otimizada.This hint can be used to provide a particular value for a local variable when the query is compiled and optimized. O valor é usado somente durante a otimização da consulta e não durante sua execução.The value is used only during query optimization, and not during query execution. Para obter mais informações, veja Dicas de consulta (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. Especificando uma subconsulta escalar de constante para valores de OFFSET e FETCHSpecifying a constant scalar subquery for OFFSET and FETCH values

O exemplo a seguir usa uma subconsulta escalar de constante para definir o valor para a cláusula FETCH.The following example uses a constant scalar subquery to define the value for the FETCH clause. A subconsulta retorna um único valor da coluna PageSize da tabela 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. Executando várias consultas em uma única transaçãoRunning multiple queries in a single transaction

O exemplo a seguir mostra um método de implementação de uma solução de paginação que assegura que sejam retornados resultados estáveis em todas as solicitações da consulta.The following example shows one method of implementing a paging solution that ensures stable results are returned in all requests from the query. A consulta é executada em uma única transação usando o nível de isolamento do instantâneo e a coluna especificada na cláusula ORDER BY assegura a exclusividade da coluna.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  

Usando ORDER BY com UNION, EXCEPT e INTERSECTUsing ORDER BY with UNION, EXCEPT, and INTERSECT

Quando uma consulta usa os operadores UNION, EXCEPT ou INTERSECT, a cláusula ORDER BY deve ser especificada no final da instrução e os resultados das consultas combinadas são classificados.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. O exemplo as seguir retorna todos os produtos que são vermelhos ou amarelos e classifica essa lista combinada pela coluna 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;  

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

O exemplo a seguir demonstra a ordenação de um conjunto de resultados pela coluna numérica EmployeeKey em ordem crescente.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;  

O exemplo a seguir classifica um conjunto de resultados pela coluna numérica EmployeeKey em ordem decrescente.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;  

O exemplo a seguir classifica um conjunto de resultados pela coluna 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;  

O exemplo a seguir ordena por duas colunas.The following example orders by two columns. Esta consulta classifica primeiro em ordem crescente pela coluna FirstName e, em seguida, classifica os valores comuns de FirstName em ordem decrescente pela coluna 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;  

Consulte TambémSee Also

Expressões (Transact-SQL) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
Funções de classificação (Transact-SQL) Ranking Functions (Transact-SQL)
TOP (Transact-SQL) TOP (Transact-SQL)
Dicas de consulta (Transact-SQL) Query Hints (Transact-SQL)
EXCEPT e INTERSECT (Transact-SQL) EXCEPT and INTERSECT (Transact-SQL)
UNION (Transact-SQL) UNION (Transact-SQL)
CASE (Transact-SQL)CASE (Transact-SQL)