Wählen SIE - ORDER BY-Klausel (Transact-SQL)SELECT - ORDER BY Clause (Transact-SQL)

DIESES THEMA GILT FÜR: jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Sortiert die von einer Abfrage zurückgegebene Daten SQL ServerSQL Server.Sorts data returned by a query in SQL ServerSQL Server. Verwenden Sie diese Klausel, um:Use this clause to:

  • Sortieren Sie das Resultset einer Abfrage anhand der angegebenen Spaltenliste und schränken Sie optional die für einen angegebenen Bereich zurückgegebenen Zeilen ein.Order the result set of a query by the specified column list and, optionally, limit the rows returned to a specified range. Die Reihenfolge, in der Zeilen in einem Resultset zurückgegeben werden, ist nicht garantiert, es sei denn, eine ORDER BY-Klausel wird angegeben.The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

  • Bestimmt die Reihenfolge, in der rangfolgefunktion Werte werden auf das Resultset angewendet.Determine the order in which ranking function values are applied to the result set.

    Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  

ORDER BY order_by_expression  
    [ COLLATE collation_name ]   
    [ ASC | DESC ]   
    [ ,...n ]   
[ <offset_fetch> ]  

<offset_fetch> ::=  
{   
    OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }  
    [  
      FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY  
    ]  
}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

[ ORDER BY   
    {  
    order_by_expression   
    [ ASC | DESC ]   
    } [ ,...n ]   
]   

ArgumenteArguments

order_by_expressionorder_by_expression
Gibt eine Spalte oder einen Ausdruck an, anhand derer das Abfrageresultset sortiert werden soll.Specifies a column or expression on which to sort the query result set. Eine Sortierspalte kann als Name, Spaltenalias oder eine nicht negative ganze Zahl angegeben werden, die die Position der Spalte in der Auswahlliste darstellt.A sort column can be specified as a name or column alias, or a nonnegative integer representing the position of the column in the select list.

Es können mehrere Sortierspalten angegeben werden.Multiple sort columns can be specified. Spaltennamen müssen eindeutig sein.Column names must be unique. Die Reihenfolge der Sortierspalten in der ORDER BY-Klausel definiert die Anordnung des sortierten Resultsets.The sequence of the sort columns in the ORDER BY clause defines the organization of the sorted result set. Dies bedeutet, dass das Resultset anhand der ersten Spalte sortiert wird, und diese sortierte Liste wird anhand der zweiten Spalte sortiert usw.That is, the result set is sorted by the first column and then that ordered list is sorted by the second column, and so on.

Die Spaltennamen, auf die in der ORDER BY-Klausel verwiesen wird, müssen entweder einer Spalte in der Auswahlliste oder einer Spalte aus einer Tabelle in der FROM-Klausel entsprechen, ohne dass dabei Zweideutigkeiten zulässig sind.The column names referenced in the ORDER BY clause must correspond to either a column in the select list or to a column defined in a table specified in the FROM clause without any ambiguities.

COLLATE Collation_nameCOLLATE collation_name
Gibt an, dass die ORDER BY-Vorgang soll, entsprechend der im angegebenen Sortierung ausgeführt werden Collation_name, und nicht gemäß der Sortierung der Spalte in der Tabelle oder Sicht definiert.Specifies that the ORDER BY operation should be performed according to the collation specified in collation_name, and not according to the collation of the column as defined in the table or view. Collation_name kann entweder ein Windows-Sortierungsname oder ein SQL-Sortierungsname sein.collation_name can be either a Windows collation name or a SQL collation name. Weitere Informationen finden Sie unter Collation and Unicode Support.For more information, see Collation and Unicode Support. COLLATE ist nur für Spalten vom Typ Char, Varchar, Nchar, und Nvarchar.COLLATE is applicable only for columns of type char, varchar, nchar, and nvarchar.

ASC | "DESC"ASC | DESC
Gibt an, dass die Werte in der angegebenen Spalte in aufsteigender oder absteigender Reihenfolge sortiert werden sollen.Specifies that the values in the specified column should be sorted in ascending or descending order. ASC sortiert vom niedrigsten Wert zum höchsten Wert.ASC sorts from the lowest value to highest value. DESC sortiert vom höchsten Wert zum niedrigsten Wert.DESC sorts from highest value to lowest value. ASC ist die Standardsortierreihenfolge.ASC is the default sort order. NULL-Werte werden als die niedrigsten Werte behandelt, die möglich sind.Null values are treated as the lowest possible values.

OFFSET { Integer_constant | Offset_row_count_expression } {Zeile | ZEILEN}OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Gibt die Anzahl der Zeilen an, die übersprungen werden soll, bevor Zeilen vom Abfrageausdruck zurückgegeben werden.Specifies the number of rows to skip before it starts to return rows from the query expression. Der Wert kann eine ganzzahlige Konstante oder ein Ausdruck größer oder gleich 0 sein.The value can be an integer constant or expression that is greater than or equal to zero.

Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017 und Azure SQL-DatenbankAzure SQL Database.sApplies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017 and Azure SQL-DatenbankAzure SQL Database.s

Offset_row_count_expression kann einer Variablen, Parameter oder Konstanten skalaren Unterabfrage sein.offset_row_count_expression can be a variable, parameter, or constant scalar subquery. Bei einer Unterabfrage sind keine Verweise auf Spalten möglich, die im äußeren Abfragebereich definiert wurden.When a subquery is used, it cannot reference any columns defined in the outer query scope. Dies bedeutet, das keine Korrelation mit der äußeren Abfrage möglich ist.That is, it cannot be correlated with the outer query.

ROW und ROWS sind Synonyme und werden mit ANSI-Kompatibilität bereitgestellt.ROW and ROWS are synonyms and are provided for ANSI compatibility.

In Abfrageausführungsplänen wird der Wert für die offsetzeilenanzahl angezeigt, der Offset -Attribut des TOP-Abfrageoperators.In query execution plans, the offset row count value is displayed in the Offset attribute of the TOP query operator.

ABRUFEN VON {ERSTE | NÄCHSTE} { Integer_constant | Fetch_row_count_expression } {Zeile | } NUR ZEILENFETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Gibt die Anzahl der Zeilen an, die zurückgegeben werden sollen, nachdem die OFFSET-Klausel verarbeitet wurde.Specifies the number of rows to return after the OFFSET clause has been processed. Der Wert kann eine ganzzahlige Konstante oder ein Ausdruck größer oder gleich 1 sein.The value can be an integer constant or expression that is greater than or equal to one.

Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017 und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017 and Azure SQL-DatenbankAzure SQL Database.

Fetch_row_count_expression kann einer Variablen, Parameter oder Konstanten skalaren Unterabfrage sein.fetch_row_count_expression can be a variable, parameter, or constant scalar subquery. Bei einer Unterabfrage sind keine Verweise auf Spalten möglich, die im äußeren Abfragebereich definiert wurden.When a subquery is used, it cannot reference any columns defined in the outer query scope. Dies bedeutet, das keine Korrelation mit der äußeren Abfrage möglich ist.That is, it cannot be correlated with the outer query.

FIRST und NEXT sind Synonyme und werden mit ANSI-Kompatibilität bereitgestellt.FIRST and NEXT are synonyms and are provided for ANSI compatibility.

ROW und ROWS sind Synonyme und werden mit ANSI-Kompatibilität bereitgestellt.ROW and ROWS are synonyms and are provided for ANSI compatibility.

In Abfrageausführungsplänen wird der Wert für die offsetzeilenanzahl angezeigt, der Zeilen oder oben -Attribut des TOP-Abfrageoperators.In query execution plans, the offset row count value is displayed in the Rows or Top attribute of the TOP query operator.

Bewährte MethodenBest Practices

Geben Sie in der ORDER BY-Klausel keine ganzen Zahlen als Positionsangaben der Spalten in der Auswahlliste an.Avoid specifying integers in the ORDER BY clause as positional representations of the columns in the select list. Auch wenn eine Anweisung wie SELECT ProductID, Name FROM Production.Production ORDER BY 2 nicht ungültig ist, wird dadurch im Vergleich zur Angabe des tatsächlichen Spaltennamens das Verständnis durch andere erschwert.For example, although a statement such as SELECT ProductID, Name FROM Production.Production ORDER BY 2 is valid, the statement is not as easily understood by others compared with specifying the actual column name. Außerdem erfordern Änderungen an der Auswahlliste, etwa eine Änderung der Spaltenreihenfolge oder das Hinzufügen neuer Spalten, auch Änderungen an der ORDER BY-Klausel, um unerwartete Ergebnisse zu vermeiden.In addition, changes to the select list, such as changing the column order or adding new columns, will require modifying the ORDER BY clause in order to avoid unexpected results.

In einer SELECT TOP (N)-Anweisung immer eine ORDER BY-Klausel verwenden.In a SELECT TOP (N) statement, always use an ORDER BY clause. Dies ist die einzige Möglichkeit, zuverlässig anzugeben, welche Zeilen von TOP betroffen sind.This is the only way to predictably indicate which rows are affected by TOP. Weitere Informationen finden Sie unter nach oben ( Transact-SQL ) .For more information, see TOP (Transact-SQL).

InteroperabilitätInteroperability

Wenn sie mit einer SELECT...INTO-Anweisung zum Einfügen von Zeilen aus einer anderen Quelle verwendet wird, garantiert die ORDER BY-Klausel nicht, dass die Zeilen in der angegebenen Reihenfolge eingefügt werden.When used with a SELECT…INTO statement to insert rows from another source, the ORDER BY clause does not guarantee the rows are inserted in the specified order.

Die Verwendung von OFFSET und FETCH in einer Sicht hat keinen Einfluss auf die Updateability-Eigenschaft derselben.Using OFFSET and FETCH in a view does not change the updateability property of the view.

EinschränkungenLimitations and Restrictions

Die Anzahl der Spalten in der ORDER BY-Klausel ist nicht begrenzt. Die Gesamtgröße der Spalten, die in einer ORDER BY-Klausel angegeben wurden, darf jedoch 8.060 Bytes nicht übersteigen.There is no limit to the number of columns in the ORDER BY clause; however, the total size of the columns specified in an ORDER BY clause cannot exceed 8,060 bytes.

Spalten vom Typ Ntext, Text, Image, Geography, Geometrie, und XML kann nicht in einer ORDER BY-Klausel verwendet werden.Columns of type ntext, text, image, geography, geometry, and xml cannot be used in an ORDER BY clause.

Eine ganze Zahl oder Konstante nicht angegeben, wann Order_by_expression in einer rangfolgefunktion angezeigt wird.An integer or constant cannot be specified when order_by_expression appears in a ranking function. Weitere Informationen finden Sie unter Klausel "OVER" ( Transact-SQL ) .For more information, see OVER Clause (Transact-SQL).

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.If a table name is aliased in the FROM clause, only the alias name can be used to qualify its columns in the ORDER BY clause.

Spaltennamen und Aliase, die in der ORDER BY-Klausel angegeben wurden, müssen in der Auswahlliste definiert werden, wenn die SELECT-Anweisung eine der folgenden Klauseln oder Operatoren enthält:Column names and aliases specified in the ORDER BY clause must be defined in the select list if the SELECT statement contains one of the following clauses or operators:

  • UNION-OperatorUNION operator

  • EXCEPT-OperatorEXCEPT operator

  • INTERSECT-OperatorINTERSECT operator

  • SELECT DISTINCTSELECT DISTINCT

    Wenn die Anweisung einen UNION-, EXCEPT- oder INTERSECT-Operator enthält, gilt außerdem, dass die Spaltennamen oder Spaltenaliasnamen in der Auswahlliste der ersten (linken) Abfrage angegeben werden müssen.Additionally, when the statement includes a UNION, EXCEPT, or INTERSECT operator, the column names or column aliases must be specified in the select list of the first (left-side) query.

    In einer Abfrage, die die Operatoren UNION, EXCEPT oder INTERSECT verwendet, wird ORDER BY nur am Ende der Anweisung zugelassen.In a query that uses UNION, EXCEPT, or INTERSECT operators, ORDER BY is allowed only at the end of the statement. Diese Einschränkung ist nur gültig, wenn UNION, EXCEPT und INTERSECT in einer Abfrage der obersten Ebene verwendet werden, nicht in einer Unterabfrage.This restriction applies only to when you specify UNION, EXCEPT and INTERSECT in a top-level query and not in a subquery. Weitere Informationen finden Sie im Abschnitt "Beispiele" weiter unten.See the Examples section that follows.

    Die ORDER BY-Klausel ist in Sichten, Inlinefunktionen, abgeleiteten Tabellen und Unterabfragen nicht gültig, es sei denn, die TOP- oder die OFFSET- und die FETCH-Klausel werden ebenfalls angegeben.The ORDER BY clause is not valid in views, inline functions, derived tables, and subqueries, unless either the TOP or OFFSET and FETCH clauses are also specified. Wenn ORDER BY in diesen Objekten verwendet wird, werden mit der Klausel nur die Zeilen bestimmt, die von der TOP-Klausel oder von der OFFSET- und der FETCH-Klausel zurückgegeben werden.When ORDER BY is used in these objects, the clause is used only to determine the rows returned by the TOP clause or OFFSET and FETCH clauses. Durch die ORDER BY-Klausel wird keine bestimmte Ergebnisreihenfolge bei der Abfrage dieser Konstrukte sichergestellt, es sei denn, in der Abfrage selbst ist ebenfalls ORDER BY angegeben.The ORDER BY clause does not guarantee ordered results when these constructs are queried, unless ORDER BY is also specified in the query itself.

    OFFSET und FETCH werden in indizierten Sichten oder einer Sicht, die mit der CHECK OPTION-Klausel definiert wird, nicht unterstützt.OFFSET and FETCH are not supported in indexed views or in a view that is defined by using the CHECK OPTION clause.

    OFFSET und FETCH können in jeder Abfrage verwendet werden, die TOP und ORDER BY zulässt. Dabei gelten folgenden Einschränkungen:OFFSET and FETCH can be used in any query that allows TOP and ORDER BY with the following limitations:

  • Die OVER-Klausel unterstützt OFFSET und FETCH nicht.The OVER clause does not support OFFSET and FETCH.

  • OFFSET und FETCH können in Anweisungen INSERT, UPDATE, MERGE, und DELETE nicht direkt angegeben werden, sondern müssen in eine entsprechende Unterabfrage eingeschlossen werden.OFFSET and FETCH cannot be specified directly in INSERT, UPDATE, MERGE, and DELETE statements, but can be specified in a subquery defined in these statements. Beispielsweise können OFFSET und FETCH in der INSERT INTO SELECT-Anweisung in die SELECT-Anweisung eingeschlossen werden.For example, in the INSERT INTO SELECT statement, OFFSET and FETCH can be specified in the SELECT statement.

  • In einer Abfrage, die die Operatoren UNION, EXCEPT oder INTERSECT verwendet, können OFFSET und FETCH nur in die abschließende Abfrage eingeschlossen werden, die die Reihenfolge der Abfrageergebnisse angibt.In a query that uses UNION, EXCEPT or INTERSECT operators, OFFSET and FETCH can only be specified in the final query that specifies the order of the query results.

  • TOP kann nicht mit OFFSET und FETCH im gleichen Abfrageausdruck (im gleichen Abfragebereich) kombiniert werden.TOP cannot be combined with OFFSET and FETCH in the same query expression (in the same query scope).

Verwenden von OFFSET und FETCH zum Einschränken der zurückgegebenen ZeilenUsing OFFSET and FETCH to limit the rows returned

Es wird empfohlen, die OFFSET-Klausel und die FETCH-Klausel statt der TOP-Klausel verwenden, um eine Abfrageauslagerung zu implementieren und die Anzahl der an eine Clientanwendung gesendeten Zeilen einzuschränken.We recommend that you use the OFFSET and FETCH clauses instead of the TOP clause to implement a query paging solution and limit the number of rows sent to a client application.

Wenn Sie OFFSET und FETCH als Auslagerungslösung verwenden, muss die Abfrage einmal für jede "Seite" der Daten ausgeführt werden, die an die Clientanwendung zurückgegebenen werden.Using OFFSET and FETCH as a paging solution requires running the query one time for each "page" of data returned to the client application. Um beispielsweise die Ergebnisse der Abfrage in Schritten von 10 Zeilen zurückzugeben, müssen Sie die Abfrage einmal ausführen, damit die Zeilen 1 bis 10 zurückgegeben werden. Wenn Sie die Abfrage erneut ausführen, werden die Zeilen 11 bis 20 zurückgegeben usw.For example, to return the results of a query in 10-row increments, you must execute the query one time to return rows 1 to 10 and then run the query again to return rows 11 to 20 and so on. Jede Abfrage ist unabhängig und weist keinen Bezug zur anderen auf.Each query is independent and not related to each other in any way. Dies bedeutet, dass im Gegensatz zur Verwendung eines Cursors, bei dem die Abfrage einmal ausgeführt und der Status auf dem Server beibehalten wird, die Clientanwendung für das Nachverfolgen des Status zuständig ist.This means that, unlike using a cursor in which the query is executed once and state is maintained on the server, the client application is responsible for tracking state. Um stabile Ergebnisse zwischen Abfrageanforderungen mit OFFSET und FETCH zu erreichen, müssen die folgenden Bedingungen erfüllt werden:To achieve stable results between query requests using OFFSET and FETCH, the following conditions must be met:

  1. Die zugrunde liegenden Daten, die von der Abfrage verwendet werden, dürfen sich nicht ändern.The underlying data that is used by the query must not change. Dies bedeutet, dass die von der Abfrage erfassten Zeilen nicht aktualisiert werden oder alle Anforderungen für Seiten von der Abfrage mit einer Momentaufnahme in einer einzelnen Transaktion oder einer serialisierbare Transaktionsisolationsstufe ausgeführt werden.That is, either the rows touched by the query are not updated or all requests for pages from the query are executed in a single transaction using either snapshot or serializable transaction isolation. Weitere Informationen zu diesen Transaktionsisolationsstufen finden Sie unter SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about these transaction isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

  2. Die ORDER BY-Klausel enthält eine Spalte oder eine Kombination von Spalten, die garantiert nur einmal vorhanden sind.The ORDER BY clause contains a column or combination of columns that are guaranteed to be unique.

    Weitere Informationen finden Sie im Beispiel "Ausführen von mehreren Abfragen in einer einzelnen Transaktion" im Abschnitt "Beispiele" weiter unten in diesem Thema.See the example "Running multiple queries in a single transaction" in the Examples section later in this topic.

    Wenn konsistente Ausführungspläne in der Auslagerungslösung wichtig sind, können Sie den OPTIMIZE FOR-Abfragehinweis für den OFFSET-Parameter und den FETCH-Parameter verwenden.If consistent execution plans are important in your paging solution, consider using the OPTIMIZE FOR query hint for the OFFSET and FETCH parameters. Weitere Informationen finden Sie unter "Angeben von Ausdrücken für OFFSET- und FETCH-Werten" im Abschnitt "Beispiele" weiter unten in diesem Thema.See "Specifying expressions for OFFSET and FETCH values" in the Examples section later in this topic. Weitere Informationen zu OPTIMZE FOR finden Sie unter Abfragehinweise ( Transact-SQL ) .For more information about OPTIMZE FOR, see Query Hints (Transact-SQL).

BeispieleExamples

KategorieCategory FunktionssyntaxelementeFeatured syntax elements
Grundlegende syntaxBasic syntax ORDER BYORDER BY
Angeben der auf- und absteigender ReihenfolgeSpecifying ascending and descending order DESC • ASCDESC • ASC
Angeben einer SortierungSpecifying a collation COLLATECOLLATE
Angeben einer bedingten ReihenfolgeSpecifying a conditional order CASE-AusdruckCASE expression
Verwenden von ORDER BY in einer rangfolgefunktionUsing ORDER BY in a ranking function RangfolgefunktionenRanking functions
Beschränken der Anzahl von Zeilen zurückgegebenLimiting the number of rows returned OFFSET • FETCHOFFSET • FETCH
Verwenden von ORDER BY mit UNION, EXCEPT und INTERSECTUsing ORDER BY with UNION, EXCEPT, and INTERSECT UNIONUNION

Grundlegende syntax Basic syntax

Anhand von Beispielen in diesem Abschnitt wird die grundlegende Funktion der ORDER BY-Klausel mithilfe der mindestens erforderlichen Syntax veranschaulicht.Examples in this section demonstrate the basic functionality of the ORDER BY clause using the minimum required syntax.

A.A. Angeben einer einzelnen Spalte, die in der Auswahlliste definiert istSpecifying a single column defined in the select list

Im folgenden Beispiel wird das Resultset anhand der numerischen ProductID-Spalte sortiert.The following example orders the result set by the numeric ProductID column. Da keine bestimmte Sortierreihenfolge angegeben wird, wird die Standardsortierung (aufsteigende Reihenfolge) verwendet.Because a specific sort order is not specified, the default (ascending order) is used.

USE AdventureWorks2012;  
GO  
SELECT ProductID, Name FROM Production.Product  
WHERE Name LIKE 'Lock Washer%'  
ORDER BY ProductID;  

B.B. Angeben einer Spalte, die nicht in der Auswahlliste definiert wirdSpecifying a column that is not defined in the select list

Im folgenden Beispiel wird das Resultset anhand einer Spalte sortiert, die nicht in der Auswahlliste enthalten ist, jedoch in der Tabelle in der FROM-Klausel definiert wird.The following example orders the result set by a column that is not included in the select list, but is defined in the table specified in the FROM clause.

USE AdventureWorks2012;  
GO  
SELECT ProductID, Name, Color  
FROM Production.Product  
ORDER BY ListPrice;  

C.C. Angeben eines Alias als SortierspalteSpecifying an alias as the sort column

Im folgenden Beispiel wird der Spaltenalias SchemaName als Sortierspalte angegeben.The following example specifies the column alias SchemaName as the sort order column.

USE AdventureWorks2012;  
GO  
SELECT name, SCHEMA_NAME(schema_id) AS SchemaName  
FROM sys.objects  
WHERE type = 'U'  
ORDER BY SchemaName;  

D.D. Angeben eines Ausdrucks als SortierspalteSpecifying an expression as the sort column

Im folgenden Beispiel wird ein Ausdruck als Sortierspalte verwendet.The following example uses an expression as the sort column. Der Ausdruck wird mit der DATEPART-Funktion definiert, um das Resultset nach dem Jahr zu sortieren, in dem ein Mitarbeiter eingestellt wurde.The expression is defined by using the DATEPART function to sort the result set by the year in which employees were hired.

USE AdventureWorks2012;  
GO  
SELECT BusinessEntityID, JobTitle, HireDate  
FROM HumanResources.Employee  
ORDER BY DATEPART(year, HireDate);  

Angeben der auf- und absteigender Sortierreihenfolge Specifying ascending and descending sort order

A.A. Angeben einer absteigenden ReihenfolgeSpecifying a descending order

Im folgenden Beispiel wird das Resultset anhand der numerischen ProductID-Spalte in absteigender Reihenfolge sortiert.The following example orders the result set by the numeric column ProductID in descending order.

USE AdventureWorks2012;  
GO  
SELECT ProductID, Name FROM Production.Product  
WHERE Name LIKE 'Lock Washer%'  
ORDER BY ProductID DESC;  

B.B. Angeben einer aufsteigenden ReihenfolgeSpecifying a ascending order

Im folgenden Beispiel wird das Resultset anhand der Name-Spalte in aufsteigender Reihenfolge sortiert.The following example orders the result set by the Name column in ascending order. Beachten Sie, dass die Zeichen alphabetisch und nicht numerisch sortiert sind.Note that the characters are sorted alphabetically, not numerically. Das heißt, 10 steht in der Sortierreihenfolge vor 2.That is, 10 sorts before 2.

USE AdventureWorks2012;  
GO  
SELECT ProductID, Name FROM Production.Product  
WHERE Name LIKE 'Lock Washer%'  
ORDER BY Name ASC ;  

C.C. Angeben von auf- und absteigender ReihenfolgeSpecifying both ascending and descending order

Im folgenden Beispiel wird das Resultset anhand von zwei Spalten sortiert.The following example orders the result set by two columns. Das Abfrageresultset wird zunächst anhand der FirstName-Spalte in aufsteigender und anschließend anhand der LastName-Spalte in absteigender Reihenfolge sortiert.The query result set is first sorted in ascending order by the FirstName column and then sorted in descending order by the LastName column.

USE AdventureWorks2012;  
GO  
SELECT LastName, FirstName FROM Person.Person  
WHERE LastName LIKE 'R%'  
ORDER BY FirstName ASC, LastName DESC ;  

Angeben einer Sortierung Specifying a collation

Im folgenden Beispiel wird gezeigt, wie sich die Reihenfolge, in der die Abfrageergebnisse zurückgegeben werden, durch Angeben einer Sortierung in der ORDER BY-Klausel ändern kann.The following example shows how specifying a collation in the ORDER BY clause can change the order in which the query results are returned. Es wird eine Tabelle mit einer Spalte erstellt, bei deren Sortierung weder die Groß- und Kleinschreibung beachtet noch nach Akzent unterschieden wird.A table is created that contains a column defined by using a case-insensitive, accent-insensitive collation. Werte werden mit Groß- und Kleinschreibung sowie unterschiedlichen Akzenten eingefügt.Values are inserted with a variety of case and accent differences. Da in der ORDER BY-Klausel keine Sortierung angegeben wurde, wird von der ersten Abfrage die Sortierung der Spalte beim Sortieren der Werte verwendet.Because a collation is not specified in the ORDER BY clause, the first query uses the collation of the column when sorting the values. In der zweiten Abfrage wird in der ORDER BY-Klausel eine Sortierung angegeben, bei der die Groß- und Kleinschreibung beachtet und Akzente unterschieden werden; dadurch ändert sich die Reihenfolge, in der die Zeilen zurückgegeben werden.In the second query, a case-sensitive, accent-sensitive collation is specified in the ORDER BY clause, which changes the order in which the rows are returned.

USE tempdb;  
GO  
CREATE TABLE #t1 (name nvarchar(15) COLLATE Latin1_General_CI_AI)  
GO  
INSERT INTO #t1 VALUES(N'Sánchez'),(N'Sanchez'),(N'sánchez'),(N'sanchez');  

-- This query uses the collation specified for the column 'name' for sorting.  
SELECT name  
FROM #t1  
ORDER BY name;  
-- This query uses the collation specified in the ORDER BY clause for sorting.  
SELECT name  
FROM #t1  
ORDER BY name COLLATE Latin1_General_CS_AS;  

Angeben einer bedingten Reihenfolge Specifying a conditional order

In den folgenden Beispielen wird der CASE-Ausdruck in einer ORDER BY-Klausel verwendet, um die Sortierreihenfolge der Zeilen auf Grundlage eines angegebenen Spaltenwerts bedingt zu bestimmen.The following examples uses the CASE expression in an ORDER BY clause to conditionally determine the sort order of the rows based on a given column value. Im ersten Beispiel wird der Wert in der SalariedFlag-Spalte der HumanResources.Employee-Tabelle ausgewertet.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Mitarbeiter, deren SalariedFlag auf 1 festgelegt wurde, werden nach BusinessEntityID in absteigender Folge zurückgegeben.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Mitarbeiter, deren SalariedFlag auf 0 festgelegt wurde, werden nach BusinessEntityID in aufsteigender Folge zurückgegeben.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. Im zweiten Beispiel wird das Resultset nach der TerritoryName-Spalte sortiert, wenn die CountryRegionName-Spalte gleich 'United States' ist, und bei allen anderen Zeilen nach CountryRegionName.In the second example, the result set is ordered by the column TerritoryName when the column CountryRegionName is equal to 'United States' and by CountryRegionName for all other rows.

SELECT BusinessEntityID, SalariedFlag  
FROM HumanResources.Employee  
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC  
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;  
GO  
SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName  
FROM Sales.vSalesPerson  
WHERE TerritoryName IS NOT NULL  
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName  
         ELSE CountryRegionName END;  

Verwenden von ORDER BY in einer rangfolgefunktion Using ORDER BY in a ranking function

Im folgenden Beispiel wird die ORDER BY-Klausel in den Rangfolgefunktionen ROW_NUMBER, RANK, DENSE_RANK und NTILE verwendet.The following example uses the ORDER BY clause in the ranking functions ROW_NUMBER, RANK, DENSE_RANK, and NTILE.

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.LastName  
    ,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"  
    ,RANK() OVER (ORDER BY a.PostalCode) AS "Rank"  
    ,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"  
    ,NTILE(4) OVER (ORDER BY a.PostalCode) AS "Quartile"  
    ,s.SalesYTD, a.PostalCode  
FROM Sales.SalesPerson AS s   
    INNER JOIN Person.Person AS p   
        ON s.BusinessEntityID = p.BusinessEntityID  
    INNER JOIN Person.Address AS a   
        ON a.AddressID = p.BusinessEntityID  
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;  

Beschränken der Anzahl von Zeilen zurückgegeben Limiting the number of rows returned

In den folgenden Beispielen wird die Anzahl der Zeilen, die von einer Abfrage zurückgegeben werden, mit OFFSET und FETCH eingeschränkt.The following examples use OFFSET and FETCH to limit the number of rows returned by a query.

Gilt für: SQL Server 2012SQL Server 2012 über SQL Server 2017SQL Server 2017 und Azure SQL-DatenbankAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017 and Azure SQL-DatenbankAzure SQL Database.

A.A. Angeben von ganzzahligen Konstanten für OFFSET- und FETCH-WerteSpecifying integer constants for OFFSET and FETCH values

Im folgenden Beispiel wird eine ganzzahlige Konstante als Wert für die OFFSET- und die FETCH-Klausel angegeben.The following example specifies an integer constant as the value for the OFFSET and FETCH clauses. Die erste Abfrage gibt alle Zeilen nach der DepartmentID-Spalte sortiert zurück.The first query returns all rows sorted by the column DepartmentID. Vergleichen Sie die von dieser Abfrage zurückgegebenen Ergebnisse mit denen der beiden folgenden Abfragen.Compare the results returned by this query with the results of the two queries that follow it. In der folgenden Abfrage werden mit der OFFSET 5 ROWS-Klausel die ersten 5 Zeilen übersprungen und alle verbleibenden Zeilen zurückgegeben.The next query uses the clause OFFSET 5 ROWS to skip the first 5 rows and return all remaining rows. In der letzten Abfrage wird mit der OFFSET 0 ROWS-Klausel bei der ersten Zeile begonnen, und anschließend wird mit FETCH NEXT 10 ROWS ONLY die Anzahl der zurückgegebenen Zeilen vom sortierten Resultset auf 10 begrenzt.The final query uses the clause OFFSET 0 ROWS to start with the first row and then uses FETCH NEXT 10 ROWS ONLY to limit the rows returned to 10 rows from the sorted result set.

USE AdventureWorks2012;  
GO  
-- Return all rows sorted by the column DepartmentID.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID;  

-- Skip the first 5 rows from the sorted result set and return all remaining rows.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID OFFSET 5 ROWS;  

-- Skip 0 rows and return only the first 10 rows from the sorted result set.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID   
    OFFSET 0 ROWS  
    FETCH NEXT 10 ROWS ONLY;  

B.B. Angeben von Variablen für OFFSET- und FETCH-WerteSpecifying variables for OFFSET and FETCH values

Im folgenden Beispiel werden die Variablen @StartingRowNumber und @FetchRows deklariert und in der OFFSET- und in der FETCH-Klausel angegeben.The following example declares the variables @StartingRowNumber and @FetchRows and specifies these variables in the OFFSET and FETCH clauses.

USE AdventureWorks2012;  
GO  
-- Specifying variables for OFFSET and FETCH values    
DECLARE @StartingRowNumber tinyint = 1  
      , @FetchRows tinyint = 8;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber ROWS   
    FETCH NEXT @FetchRows ROWS ONLY;  

C.C. Angeben von Ausdrücken für OFFSET- und FETCH-WerteSpecifying expressions for OFFSET and FETCH values

Im folgenden Beispiel wird der OFFSET-Wert mit dem Ausdruck @StartingRowNumber - 1 und der FETCH-Wert mit dem Ausdruck @EndingRowNumber - @StartingRowNumber + 1 angegeben.The following example uses the expression @StartingRowNumber - 1 to specify the OFFSET value and the expression @EndingRowNumber - @StartingRowNumber + 1 to specify the FETCH value. Außerdem wird der Abfragehinweis OPTIMIZE FOR angegeben.In addition, the query hint, OPTIMIZE FOR, is specified. Mit dem Abfragehinweis kann ein bestimmter Wert für eine lokale Variable bereitgestellt werden, wenn die Abfrage kompiliert und optimiert wird.This hint can be used to provide a particular value for a local variable when the query is compiled and optimized. Dieser Wert wird nur während der Abfrageoptimierung verwendet, nicht während der Abfrageausführung.The value is used only during query optimization, and not during query execution. Weitere Informationen finden Sie unter Abfragehinweise (Transact-SQL).For more information, see Query Hints (Transact-SQL).

USE AdventureWorks2012;  
GO  

-- Specifying expressions for OFFSET and FETCH values      
DECLARE @StartingRowNumber tinyint = 1  
      , @EndingRowNumber tinyint = 8;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber - 1 ROWS   
    FETCH NEXT @EndingRowNumber - @StartingRowNumber + 1 ROWS ONLY  
OPTION ( OPTIMIZE FOR (@StartingRowNumber = 1, @EndingRowNumber = 20) );  

D.D. Angeben einer konstanten skalaren Unterabfrage für OFFSET- und FETCH-WerteSpecifying a constant scalar subquery for OFFSET and FETCH values

Im folgenden Beispiel wird der Wert für die FETCH-Klausel mit einer konstanten skalaren Unterabfrage definiert.The following example uses a constant scalar subquery to define the value for the FETCH clause. Die Unterabfrage gibt einen einzelnen Wert von der Spalte PageSize in der Tabelle dbo.AppSettings zurück.The subquery returns a single value from the column PageSize in the table dbo.AppSettings.

-- Specifying a constant scalar subquery  
USE AdventureWorks2012;  
GO  
CREATE TABLE dbo.AppSettings (AppSettingID int NOT NULL, PageSize int NOT NULL);  
GO  
INSERT INTO dbo.AppSettings VALUES(1, 10);  
GO  
DECLARE @StartingRowNumber tinyint = 1;  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber ROWS   
    FETCH NEXT (SELECT PageSize FROM dbo.AppSettings WHERE AppSettingID = 1) ROWS ONLY;  

E.E. Ausführen mehrerer Abfragen in einer einzelnen TransaktionRunning multiple queries in a single transaction

Im folgenden Beispiel wird eine Methode veranschaulicht, eine Auslagerungslösung zu implementieren, die sicherstellt, dass in allen Anforderungen beständige Ergebnisse von der Abfrage zurückgegeben werden.The following example shows one method of implementing a paging solution that ensures stable results are returned in all requests from the query. Die Abfrage wird mit der Momentaufnahmeisolationsstufe in einer einzelnen Transaktion ausgeführt, und die in der ORDER BY-Klausel angegebene Spalte stellt die Eindeutigkeit der Spalten sicher.The query is executed in a single transaction using the snapshot isolation level, and the column specified in the ORDER BY clause ensures column uniqueness.

USE AdventureWorks2012;  
GO  

-- Ensure the database can support the snapshot isolation level set for the query.  
IF (SELECT snapshot_isolation_state FROM sys.databases WHERE name = N'AdventureWorks2012') = 0  
    ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON;  
GO  

-- Set the transaction isolation level  to SNAPSHOT for this query.  
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;  
GO  

-- Beging the transaction  
BEGIN TRANSACTION;  
GO  
-- Declare and set the variables for the OFFSET and FETCH values.  
DECLARE @StartingRowNumber int = 1  
      , @RowCountPerPage int = 3;  

-- Create the condition to stop the transaction after all rows have been returned.  
WHILE (SELECT COUNT(*) FROM HumanResources.Department) >= @StartingRowNumber  
BEGIN  

-- Run the query until the stop condition is met.  
SELECT DepartmentID, Name, GroupName  
FROM HumanResources.Department  
ORDER BY DepartmentID ASC   
    OFFSET @StartingRowNumber - 1 ROWS   
    FETCH NEXT @RowCountPerPage ROWS ONLY;  

-- Increment @StartingRowNumber value.  
SET @StartingRowNumber = @StartingRowNumber + @RowCountPerPage;  
CONTINUE  
END;  
GO  
COMMIT TRANSACTION;  
GO  

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

Das folgende Beispiel veranschaulicht ein Resultset nach der numerischen Reihenfolge EmployeeKey Spalte in aufsteigender Reihenfolge.The following example demonstrates ordering of a result set by the numerical EmployeeKey column in ascending order.

-- Uses AdventureWorks  

SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY EmployeeKey;  

Das folgende Beispiel ordnet ein Resultset nach der numerischen EmployeeKey Spalte in absteigender Reihenfolge.The following example orders a result set by the numerical EmployeeKey column in descending order.

-- Uses AdventureWorks  

SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY EmployeeKey DESC;  

Das folgende Beispiel ordnet einem Ergebnissatz durch die LastName Spalte.The following example orders a result set by the LastName column.

-- Uses AdventureWorks  

SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY LastName;  

Das folgende Beispiel Aufträge nach zwei Spalten.The following example orders by two columns. Diese Abfrage werden zuerst in aufsteigender Reihenfolge nach sortiert die FirstName Spalte und dann sortiert allgemeine FirstName Werte in absteigender Reihenfolge nach der LastName Spalte.This query first sorts in ascending order by the FirstName column, and then sorts common FirstName values in descending order by the LastName column.

-- Uses AdventureWorks  

SELECT EmployeeKey, FirstName, LastName FROM DimEmployee  
WHERE LastName LIKE 'A%'  
ORDER BY LastName, FirstName;  

Verwenden von ORDER BY mit UNION, EXCEPT und INTERSECT Using ORDER BY with UNION, EXCEPT, and INTERSECT

Wenn eine Abfrage die Operatoren UNION, EXCEPT oder INTERSECT verwendet, muss die ORDER BY-Klausel am Ende der Anweisung angegeben werden, und die Ergebnissen der kombinierten Abfragen werden sortiert.When a query uses the UNION, EXCEPT, or INTERSECT operators, the ORDER BY clause must be specified at the end of the statement and the results of the combined queries are sorted. Im folgenden Beispiel werden alle Produkte zurückgegeben, die rot oder gelb sind, und die kombinierte Liste wird anhand der Spalte ListPrice sortiert.The following example returns all products that are red or yellow and sorts this combined list by the column ListPrice.

USE AdventureWorks2012;  
GO  
SELECT Name, Color, ListPrice  
FROM Production.Product  
WHERE Color = 'Red'  
-- ORDER BY cannot be specified here.  
UNION ALL  
SELECT Name, Color, ListPrice  
FROM Production.Product  
WHERE Color = 'Yellow'  
ORDER BY ListPrice ASC;  

Siehe auchSee Also

Ausdrücke ( Transact-SQL ) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
Rangfolge Funktionen ( Transact-SQL ) Ranking Functions (Transact-SQL)
Nach oben ( Transact-SQL ) TOP (Transact-SQL)
Abfragehinweise (Transact-SQL) Query Hints (Transact-SQL)
Mit Ausnahme von und INTERSECT ( Transact-SQL ) EXCEPT and INTERSECT (Transact-SQL)
UNION ( Transact-SQL ) UNION (Transact-SQL)
CASE (Transact-SQL)CASE (Transact-SQL)