Ordinamento delle righe con la clausola ORDER BY
La clausola ORDER BY ordina i risultati delle query in base a una o più colonne fino a un massimo di 8.060 byte. Per ulteriori informazioni sulle dimensioni massime della clausola ORDER BY, vedere Clausola ORDER BY (Transact-SQL).
A partire da MicrosoftSQL Server 2005, SQL Server consente di specificare le colonne di ordinamento delle tabelle nella clausola FROM che non sono specificate nell'elenco SELECT. I nomi di colonna a cui viene fatto riferimento nella clausola ORDER BY devono corrispondere senza ambiguità a una colonna dell'elenco SELECT o a una colonna della tabella nella clausola FROM. Se per i nomi di colonna sono stati creati alias nell'elenco SELECT, nella clausola ORDER BY è possibile utilizzare unicamente gli alias. Allo stesso modo, se per i nomi di tabella sono stati creati alias nella clausola FROM, è possibile utilizzare unicamente gli alias per qualificare le relative colonne nella clausola ORDER BY.
L'ordinamento può essere crescente (ASC) o decrescente (DESC). Se non è specificato alcun ordinamento, viene applicato l'ordinamento ASC.
I risultati restituiti dalla query seguente sono disposti in ordine crescente in base a ProductID:
USE AdventureWorks;
GO
SELECT ProductID, ProductLine, ProductModelID
FROM Production.Product
ORDER BY ProductID
Se nella clausola ORDER BY vengono specificate più colonne, le operazioni di ordinamento vengono nidificate. L'istruzione seguente ordina le righe della tabella Production.Product prima in base alla sottocategoria di prodotto in ordine decrescente e quindi in base a ListPrice in ordine crescente all'interno di ogni sottocategoria di prodotto.
USE AdventureWorks;
GO
SELECT ProductID, ProductSubcategoryID, ListPrice
FROM Production.Product
ORDER BY ProductSubcategoryID DESC, ListPrice
I risultati esatti di una clausola ORDER BY variano in base alle regole di confronto delle colonne ordinate. Per ulteriori informazioni, vedere Utilizzo delle regole di confronto. Per le colonne char, varchar, nchar e nvarchar, è possibile specificare che un'operazione ORDER BY deve essere eseguita in base a regole di confronto diverse da quelle definite per la colonna nella tabella o nella vista. È possibile specificare il nome di regole di confronto di Windows o SQL. Ad esempio, per la colonna LastName della tabella Person.Contact del database AdventureWorks sono state definite le regole di confronto Latin1_General, ma nello script seguente la colonna viene restituita in ordine crescente utilizzando le regole di confronto Traditional_Spanish.
USE AdventureWorks;
GO
SELECT LastName FROM Person.Contact
ORDER BY LastName
COLLATE Traditional_Spanish_ci_ai ASC
GO
Non è possibile utilizzare la clausola ORDER BY in colonne che includono i tipi di dati text, ntext, image o xml. Inoltre, subquery, aggregati ed espressioni costanti non sono consentiti nell'elenco ORDER BY. Tuttavia, è possibile utilizzare un nome specificato dall'utente nell'elenco di selezione per aggregati o espressioni. Ad esempio:
SELECT Color, AVG (ListPrice) AS 'average list price'
FROM Production.Product
GROUP BY Color
ORDER BY 'average list price'
ORDER BY garantisce l'ordinamento dei risultati unicamente per l'istruzione SELECT più esterna di una query. Si consideri, ad esempio, la definizione della vista seguente:
CREATE VIEW TopView AS
SELECT TOP 50 PERCENT * FROM Person.Contact
ORDER BY LastName
Viene quindi eseguita una query sulla vista:
SELECT * FROM TopView
La definizione della vista contiene una clausola ORDER BY, che tuttavia viene utilizzata unicamente per determinare le righe restituite dalla clausola TOP. Quando viene eseguita una query sulla vista, SQL Server non garantisce l'ordinamento dei risultati, a meno che l'ordinamento non venga specificato in modo esplicito, come illustrato nella query seguente:
SELECT * FROM TopView
ORDER BY LastName