Classificando linhas com ORDER BY

A cláusula ORDER BY classifica os resultados da consulta por uma ou mais colunas até 8.060 bytes. Para obter mais informações sobre o tamanho máximo da cláusula ORDER BY, consulte Cláusula ORDER BY [Transact-SQL].

A partir do SQL Server 2005, o SQL Server permite especificar colunas de classificação de tabelas na cláusula FROM que não estão especificadas na lista SELECT. Os nomes das colunas referenciados na cláusula ORDER BY devem corresponder a uma coluna na lista SELECT ou a uma coluna da tabela na cláusula FROM sem qualquer ambiguidade. Se os nomes das colunas forem aliases na lista SELECT, apenas o nome do alias poderá ser utilizado na cláusula ORDER BY. Da mesma forma, se os nomes das tabelas forem aliases na cláusula FROM, apenas os nomes dos aliases poderão ser utilizados para qualificar suas colunas na cláusula ORDER BY.

Uma classificação pode ser crescente (ASC) ou decrescente (DESC). Caso não seja especificada, assume-se a classificação ASC.

A seguinte consulta retorna resultados ordenados pelo ProductID crescente:

USE AdventureWorks2008R2;
GO
SELECT ProductID, ProductLine, ProductModelID
FROM Production.Product
ORDER BY ProductID;

Se mais de uma coluna for nomeada na cláusula ORDER BY, as classificações serão aninhadas. A instrução a seguir classifica as linhas na tabela Production.Product, primeiro pela subcategoria de produto na ordem decrescente e, depois, pelo ListPrice na ordem crescente dentro de cada subcategoria de produto.

USE AdventureWorks2008R2;
GO
SELECT ProductID, ProductSubcategoryID, ListPrice
FROM Production.Product
ORDER BY ProductSubcategoryID DESC, ListPrice;

Os resultados exatos de uma cláusula ORDER BY dependem do agrupamento das colunas que estão sendo ordenadas. Para obter mais informações, consulte Trabalhando com agrupamentos. Para as colunas char, varchar, nchar e nvarchar, você pode especificar que seja executada uma operação ORDER BY de acordo com um agrupamento diferente do agrupamento da coluna, como definido na tabela ou na exibição. Você pode especificar um nome de agrupamento Windows ou um nome de agrupamento SQL. Por exemplo, a coluna LastName da tabela Person.Person no banco de dados AdventureWorks2008R2 está definida com o agrupamento Latin1_General, mas no script a seguir, a coluna é retornada em ordem crescente utilizando o agrupamento Traditional_Spanish.

USE AdventureWorks2008R2;
GO
SELECT LastName FROM Person.Person
ORDER BY LastName
COLLATE Traditional_Spanish_ci_ai ASC;
GO

Você não pode utilizar ORDER BY em colunas com os tipos de dados text, ntext, image ou xml.

ORDER BY garante um resultado classificado apenas para a instrução SELECT mais externa de uma consulta. Por exemplo, considere a seguinte definição da exibição:

CREATE VIEW TopView AS 
SELECT TOP 50 PERCENT * FROM Person.Person       
ORDER BY LastName;       

Depois, consulte a exibição:

SELECT * FROM TopView;       

Embora a definição da exibição contenha uma cláusula ORDER BY, essa cláusula é utilizada apenas para determinar as linhas retornadas pela cláusula TOP. Ao consultar a própria exibição, o SQL Server não garante que os resultados serão ordenados, a menos que você especifique explicitamente, como mostrado na seguinte consulta:

SELECT * FROM TopView       
ORDER BY LastName;       

Consulte também

Conceitos