Freigeben über


Sortieren von Zeilen mit ORDER BY

Die ORDER BY-Klausel sortiert Abfrageergebnisse nach einer oder mehreren Spalten bis zu 8.060 Byte. Weitere Informationen zur maximalen ORDER BY-Klauselgröße finden Sie unter ORDER BY-Klausel (Transact-SQL).

Beginnend mit MicrosoftSQL Server 2005, ermöglicht SQL Server das Angeben von Sortierspalten aus Tabellen in der FROM-Klausel, die nicht in der SELECT-Liste angegeben sind. Die Spaltennamen, auf die in der ORDER BY-Klausel verwiesen wird, müssen entweder einer Spalte in der SELECT-Liste oder einer Spalte aus der Tabelle in der FROM-Klausel entsprechen, ohne dass dabei irgendwelche Zweideutigkeiten zulässig sind. Wenn Spaltennamen in der SELECT-Liste ein Alias zugeordnet ist, kann in der ORDER BY-Klausel nur der Aliasname verwendet werden. Desgleichen gilt: Wenn Tabellennamen in der FROM-Klausel ein Alias zugeordnet ist, können nur die Aliasnamen verwendet werden, um ihre Spalten in der ORDER BY-Klausel anzugeben.

Die Sortierreihenfolge kann aufsteigend (ASC) oder absteigend (DESC) sein. Ohne eine Angabe wird von ASC ausgegangen.

Die folgende Abfrage gibt Ergebnisse zurück, die nach den Werten in der ProductID-Spalte in aufsteigender Reihenfolge sortiert sind.

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

Werden in der ORDER BY-Klausel mehrere Spalten angegeben, wird geschachtelt sortiert. Mit der folgenden Anweisung werden die Zeilen in der Production.Product-Tabelle sortiert, und zwar zunächst in absteigender Reihenfolge nach der Produktunterkategorie (ProductSubcategory) und dann innerhalb jeder Produktunterkategorie in aufsteigender Reihenfolge nach dem Listenpreis (ListPrice).

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

Die exakten Ergebnisse einer ORDER BY-Klausel richten sich nach der Sortierung der sortierten Spalten. Weitere Informationen finden Sie unter Arbeiten mit Sortierungen. Für Spalten mit den Datentypen char, varchar, nchar und nvarchar können Sie angeben, dass ein ORDER BY-Vorgang entsprechend einer Sortierung durchgeführt wird, die von der Sortierung der Spalte laut Definition in der Tabelle oder Sicht abweicht. Sie können dabei einen Windows-Sortiernamen oder einen SQL-Sortiernamen angeben. So ist z. B. die LastName-Spalte in der Person.Contact-Tabelle der AdventureWorks-Datenbank mit der Sortierung Latin1_General definiert, im unten gezeigten Skript wird die Spalte jedoch in aufsteigender Reihenfolge mit der Sortierung Traditional_Spanish zurückgegeben.

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

Sie können ORDER BY nicht auf Spalten anwenden, die den Datentyp text, ntext, image oder xml haben. In der ORDER BY-Liste sind außerdem keine Unterabfragen, Aggregate und konstante Ausdrücke zulässig. Für Aggregate und Ausdrücke kann jedoch in der Auswahlliste ein benutzerdefinierter Name verwendet werden. Beispiel:

SELECT Color, AVG (ListPrice) AS 'average list price'
FROM Production.Product
GROUP BY Color
ORDER BY 'average list price'

ORDER BY garantiert ein sortiertes Ergebnis nur für die äußerste SELECT-Anweisung einer Abfrage. Nehmen Sie z. B. die folgende Definition einer Sicht an:

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

Anschließend erfolgt eine Abfrage für die Sicht:

SELECT * FROM TopView       

Obwohl die Definition der Sicht eine ORDER BY-Klausel enthält, wird diese ORDER BY-Klausel lediglich zur Ermittlung der Zeilen verwendet, die von der TOP-Klausel zurückgegeben werden. Wenn die Sicht als solche abgefragt wird, sortiert SQL Server die Ergebnisse nur, wenn Sie dies explizit festlegen, was in der folgenden Abfrage gezeigt wird:

SELECT * FROM TopView       
ORDER BY LastName