Condividi tramite


Ordinamento delle righe con la clausola ORDER BY

La clausola ORDER BY consente di ordinare 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 SQL 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 AdventureWorks2008R2;
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 AdventureWorks2008R2;
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.Person del database AdventureWorks2008R2 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 AdventureWorks2008R2;
GO
SELECT LastName FROM Person.Person
ORDER BY LastName
COLLATE Traditional_Spanish_ci_ai ASC;
GO

Non è possibile utilizzare la clausola ORDER BY in colonne in cui sono inclusi i tipi di dati text, ntext, image o xml.

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.Person       
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;       

Vedere anche

Concetti