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].
Iniciando com MicrosoftSQL 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 ambigüidade. 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 AdventureWorks;
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 AdventureWorks;
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.Contact no banco de dados AdventureWorks está definida com o agrupamento Latin1_General, mas no script a seguir, a coluna é retornada em ordem crescente utilizando o agrupamento Traditional_Spanish.
USE AdventureWorks;
GO
SELECT LastName FROM Person.Contact
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. Além disso, não são permitidas subconsultas, agregações e expressões constantes na lista ORDER BY. Porém, pode ser utilizado na lista de seleção um nome especificado pelo usuário para agregações ou expressões. Por exemplo:
SELECT Color, AVG (ListPrice) AS 'average list price'
FROM Production.Product
GROUP BY Color
ORDER BY 'average list price'
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.Contact
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