Seleccione - ORDER BY (cláusula de Transact-SQL)SELECT - ORDER BY Clause (Transact-SQL)

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Ordena los datos devueltos por una consulta en SQL ServerSQL Server.Sorts data returned by a query in SQL ServerSQL Server. Use esta cláusula para lo siguiente:Use this clause to:

  • Ordenar el conjunto de resultados de una consulta por la lista de columnas especificada y, opcionalmente, limitar las filas devueltas a un intervalo especificado.Order the result set of a query by the specified column list and, optionally, limit the rows returned to a specified range. El orden en que se devuelven las filas en un conjunto de resultados no se puede garantizar, a menos que se especifique una cláusula ORDER BY.The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.

  • Determinar el orden en que función de categoría valores se aplican al conjunto de resultados.Determine the order in which ranking function values are applied to the result set.

    Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- 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 ]   
]   

ArgumentosArguments

order_by_expressionorder_by_expression
Especifica una columna o expresión según la que se ordenará el conjunto de resultados de la consulta.Specifies a column or expression on which to sort the query result set. Una columna de ordenación se puede especificar como un nombre o un alias de columna, o un entero no negativo que representa la posición de la columna en la lista de selección.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 posible especificar varias columnas de ordenación.Multiple sort columns can be specified. Los nombres de columna tienen que ser únicos.Column names must be unique. La secuencia de las columnas de ordenación de la cláusula ORDER BY define la organización del conjunto de resultados ordenado.The sequence of the sort columns in the ORDER BY clause defines the organization of the sorted result set. Es decir, el conjunto de resultados se ordena conforme a la primera columna y, a continuación, esa lista ordenada se ordena según la segunda columna, y así sucesivamente.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.

Los nombres de columna a los que se hace referencia en la cláusula ORDER BY deben corresponderse con una columna de la lista de selección o con una columna definida en la tabla especificada en la cláusula FROM sin ambigüedades.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
Especifica que la operación ORDER BY debe realizarse según la intercalación especificada en collation_namey no según la intercalación de la columna tal como se define en la tabla o vista.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 puede ser un nombre de intercalación de Windows o un nombre de intercalación de SQL.collation_name can be either a Windows collation name or a SQL collation name. Para más información, consulte Compatibilidad con la intercalación y Unicode.For more information, see Collation and Unicode Support. COLLATE sólo es aplicable para las columnas de tipo char, varchar, nchar, y nvarchar.COLLATE is applicable only for columns of type char, varchar, nchar, and nvarchar.

ASC | DESCASC | DESC
Indica que los valores de la columna especificada se deben ordenar en sentido ascendente o descendente.Specifies that the values in the specified column should be sorted in ascending or descending order. ASC ordena del valor mínimo al valor máximo.ASC sorts from the lowest value to highest value. DESC ordena del valor máximo al valor mínimo.DESC sorts from highest value to lowest value. ASC es el criterio de ordenación predeterminado.ASC is the default sort order. Los valores NULL se tratan como los valores más bajos posibles.Null values are treated as the lowest possible values.

DESPLAZAMIENTO { integer_constant | offset_row_count_expression } {fila | FILAS}OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
Especifica el número de filas que se deben omitir antes de comenzar a devolver filas de la expresión de consulta.Specifies the number of rows to skip before it starts to return rows from the query expression. El valor puede ser una expresión o constante entera mayor o igual que cero.The value can be an integer constant or expression that is greater than or equal to zero.

Se aplica a: SQL Server 2012SQL Server 2012 a través de SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.sApplies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.s

offset_row_count_expression puede ser una variable, un parámetro o una subconsulta escalar constante.offset_row_count_expression can be a variable, parameter, or constant scalar subquery. Cuando se utiliza una subconsulta, no puede hacer referencia a ninguna columna definida en el ámbito de la consulta externa.When a subquery is used, it cannot reference any columns defined in the outer query scope. Es decir, no se puede poner en correlación con la consulta externa.That is, it cannot be correlated with the outer query.

ROW y ROWS son sinónimos y se proporcionan para ofrecer compatibilidad con ANSI.ROW and ROWS are synonyms and are provided for ANSI compatibility.

En los planes de ejecución de consulta, se muestra el valor de recuento de filas de desplazamiento en el desplazamiento atributo del operador de consulta TOP.In query execution plans, the offset row count value is displayed in the Offset attribute of the TOP query operator.

CAPTURAR {PRIMER | SIGUIENTE} { integer_constant | fetch_row_count_expression } {fila | } SOLO FILASFETCH { FIRST | NEXT } { integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
Especifica el número de filas que se devolverán después de procesar la cláusula OFFSET.Specifies the number of rows to return after the OFFSET clause has been processed. El valor puede ser una expresión o constante entera mayor o igual que uno.The value can be an integer constant or expression that is greater than or equal to one.

Se aplica a: SQL Server 2012SQL Server 2012 a través de SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

fetch_row_count_expression puede ser una variable, un parámetro o una subconsulta escalar constante.fetch_row_count_expression can be a variable, parameter, or constant scalar subquery. Cuando se utiliza una subconsulta, no puede hacer referencia a ninguna columna definida en el ámbito de la consulta externa.When a subquery is used, it cannot reference any columns defined in the outer query scope. Es decir, no se puede poner en correlación con la consulta externa.That is, it cannot be correlated with the outer query.

FIRST y NEXT son sinónimos y se proporcionan para ofrecer compatibilidad con ANSI.FIRST and NEXT are synonyms and are provided for ANSI compatibility.

ROW y ROWS son sinónimos y se proporcionan para ofrecer compatibilidad con ANSI.ROW and ROWS are synonyms and are provided for ANSI compatibility.

En los planes de ejecución de consulta, se muestra el valor de recuento de filas de desplazamiento en el filas o arriba atributo del operador de consulta TOP.In query execution plans, the offset row count value is displayed in the Rows or Top attribute of the TOP query operator.

Procedimientos recomendadosBest Practices

Evite especificar enteros en la cláusula ORDER BY como representaciones posicionales de las columnas en la lista de selección.Avoid specifying integers in the ORDER BY clause as positional representations of the columns in the select list. Por ejemplo, aunque una instrucción como SELECT ProductID, Name FROM Production.Production ORDER BY 2 es válida, otros usuarios no la entenderán tan bien como si especificase el nombre de la columna real.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. Además, para realizar cambios en la lista de selección, como modificar el orden de las columnas o agregar otras nuevas, será preciso modificar la cláusula ORDER BY a fin de evitar resultados inesperados.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.

En la parte superior seleccione (N) (instrucción), utilice siempre una cláusula ORDER BY.In a SELECT TOP (N) statement, always use an ORDER BY clause. Esta es la única manera de indicar previsiblemente a qué filas afecta TOP.This is the only way to predictably indicate which rows are affected by TOP. Para obtener más información, vea TOP ( Transact-SQL ) .For more information, see TOP (Transact-SQL).

InteroperabilidadInteroperability

Cuando se usa con una instrucción SELECT... EN la instrucción para insertar filas de otro origen, la cláusula ORDER BY no garantiza que las filas se insertan en el orden especificado.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.

Al usar OFFSET y FETCH en una vista no se cambia la propiedad Updateability de la vista.Using OFFSET and FETCH in a view does not change the updateability property of the view.

Limitaciones y restriccionesLimitations and Restrictions

No hay ningún límite en cuanto al número de columnas de la cláusula ORDER BY; sin embargo, el tamaño total de las columnas especificadas en una cláusula ORDER BY no puede superar los 8.060 bytes.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.

Las columnas de tipo ntext, texto, imagen, geography, geometry, y XML no se puede usar en una cláusula ORDER BY.Columns of type ntext, text, image, geography, geometry, and xml cannot be used in an ORDER BY clause.

No puede ser un entero o una constante especificado cuando order_by_expression aparece en una función de categoría.An integer or constant cannot be specified when order_by_expression appears in a ranking function. Para obtener más información, consulte la cláusula OVER ( Transact-SQL ) .For more information, see OVER Clause (Transact-SQL).

Si los nombres de tabla están asociados a un alias en la cláusula FROM, solo pueden usarse los nombres de alias para calificar sus columnas en la cláusula ORDER BY.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.

Los nombres y alias de columna especificados en la cláusula ORDER BY deben estar definidos en la lista de selección si la instrucción SELECT contiene uno de los operadores o cláusulas siguientes: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, operadorUNION operator

  • EXCEPT, operadorEXCEPT operator

  • INTERSECT, operadorINTERSECT operator

  • SELECT DISTINCTSELECT DISTINCT

    Además, cuando la instrucción incluye un operador UNION, EXCEPT o INTERSECT, los nombres o los alias de columna deben ser los especificados en la lista de selección de la primera consulta (lado izquierdo).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.

    En una consulta que utiliza los operadores UNION, INTERSECT o EXCEPT, ORDER BY se permite únicamente al final de la instrucción.In a query that uses UNION, EXCEPT, or INTERSECT operators, ORDER BY is allowed only at the end of the statement. Esta restricción se aplica únicamente cuando se especifica UNION, EXCEPT e INTERSECT en una consulta de nivel superior y no en una subconsulta.This restriction applies only to when you specify UNION, EXCEPT and INTERSECT in a top-level query and not in a subquery. Vea la sección Ejemplos que aparece más adelante.See the Examples section that follows.

    La cláusula ORDER BY no es válida en vistas, funciones insertadas, tablas derivadas y subconsultas, a menos que se especifiquen también las cláusulas TOP u OFFSET y FETCH.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. Cuando ORDER BY se utiliza en estos objetos, la cláusula únicamente se utiliza para determinar las filas devueltas por la cláusula TOP o las cláusulas OFFSET Y FETCH.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. La cláusula ORDER BY no garantiza resultados ordenados cuando se consulten estos constructores, a menos que también se especifique ORDER BY en la misma consulta.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 y FETCH no se admiten en vistas indizadas ni en vistas definidas mediante la cláusula CHECK OPTION.OFFSET and FETCH are not supported in indexed views or in a view that is defined by using the CHECK OPTION clause.

    OFFSET y FETCH se pueden utilizar en cualquier consulta que permita TOP y ORDER BY con las siguientes limitaciones:OFFSET and FETCH can be used in any query that allows TOP and ORDER BY with the following limitations:

  • La cláusula OVER no admite OFFSET ni FETCH.The OVER clause does not support OFFSET and FETCH.

  • OFFSET y FETCH no se pueden especificar directamente en las instrucciones INSERT, UPDATE, MERGE ni DELETE, pero sí en una subconsulta definida en ellas.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. Por ejemplo, en la instrucción INSERT INTO SELECT, se pueden especificar OFFSET y FETCH en la instrucción SELECT.For example, in the INSERT INTO SELECT statement, OFFSET and FETCH can be specified in the SELECT statement.

  • En una consulta que utiliza los operadores UNION, EXCEPT o INTERSECT, OFFSET y FETCH únicamente se pueden utilizar en la consulta final que especifica el orden de los resultados de la consulta.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 no se puede combinar con OFFSET y FETCH en la misma expresión de consulta (en el mismo ámbito de la consulta).TOP cannot be combined with OFFSET and FETCH in the same query expression (in the same query scope).

Utilizar OFFSET y FETCH para limitar las filas devueltasUsing OFFSET and FETCH to limit the rows returned

Recomendamos utilizar las cláusulas OFFSET y FETCH en lugar de la cláusula TOP para implementar una solución de paginación de consulta y limitar el número de filas enviadas a una aplicación cliente.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.

Para utilizar OFFSET y FETCH como solución de paginación, es preciso ejecutar la consulta una vez por cada "página" de datos devuelta a la aplicación cliente.Using OFFSET and FETCH as a paging solution requires running the query one time for each "page" of data returned to the client application. Por ejemplo, para devolver los resultados de una consulta en incrementos de 10 filas, se debe ejecutar la consulta una vez para devolver las filas de 1 a 10, después otra vez para devolver las filas de 11 a 20, y así sucesivamente.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. Cada consulta es independiente y no está relacionada con las demás de forma alguna.Each query is independent and not related to each other in any way. Esto significa que, a diferencia de cuando se usa un cursor en que la consulta se ejecuta una vez y su estado se mantiene en el servidor, en este caso es la aplicación cliente la responsable de realizar el seguimiento del estado.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. Para lograr resultados estables entre las solicitudes de consultas donde se utilicen OFFSET y FETCH, se deben cumplir las siguientes condiciones:To achieve stable results between query requests using OFFSET and FETCH, the following conditions must be met:

  1. Los datos subyacentes que la consulta utilice no deben cambiar.The underlying data that is used by the query must not change. Es decir, o bien las filas afectadas por la consulta no se actualizarán, o bien todas las solicitudes correspondientes a las páginas de la consulta se ejecutarán en una transacción única utilizando el aislamiento de transacción serializable o de instantánea.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. Para obtener más información acerca de estos niveles de aislamiento de transacción, vea SET TRANSACTION ISOLATION LEVEL ( Transact-SQL ) .For more information about these transaction isolation levels, see SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

  2. Debe garantizarse que la columna o combinación de columnas contenidas en la cláusula ORDER BY sean únicas.The ORDER BY clause contains a column or combination of columns that are guaranteed to be unique.

    Vea el ejemplo que "Ejecutar varias consultas en una sola transacción" en la sección Ejemplos que aparece más adelante en este tema.See the example "Running multiple queries in a single transaction" in the Examples section later in this topic.

    Si el hecho de que los planes de ejecución sean coherentes es importante para su solución de paginación, puede ser conveniente utilizar la sugerencia de consulta OPTIMIZE FOR para los parámetros de OFFSET y FETCH.If consistent execution plans are important in your paging solution, consider using the OPTIMIZE FOR query hint for the OFFSET and FETCH parameters. Vea "Especificar expresiones para valores de OFFSET y FETCH" en la sección Ejemplos que aparece más adelante en este tema.See "Specifying expressions for OFFSET and FETCH values" in the Examples section later in this topic. Para obtener más información acerca de optimize FOR, vea sugerencias de consulta ( Transact-SQL ) .For more information about OPTIMZE FOR, see Query Hints (Transact-SQL).

EjemplosExamples

CategoríaCategory Elementos de sintaxis ofrecidosFeatured syntax elements
Sintaxis básicaBasic syntax ORDER BYORDER BY
Especificar orden ascendente y descendenteSpecifying ascending and descending order DESC • ASCDESC • ASC
Especificar una intercalaciónSpecifying a collation COLLATECOLLATE
Especificar un orden condicionalSpecifying a conditional order CASE, expresiónCASE expression
Usar ORDER BY en una función de categoríaUsing ORDER BY in a ranking function Funciones de categoríaRanking functions
Limitar el número de filas devueltasLimiting the number of rows returned OFFSET • FETCHOFFSET • FETCH
Usar ORDER BY con UNION, EXCEPT e INTERSECTUsing ORDER BY with UNION, EXCEPT, and INTERSECT UNIONUNION

Sintaxis básicaBasic syntax

En los ejemplos de esta sección se muestra la funcionalidad básica de la cláusula ORDER BY con la sintaxis mínima requerida.Examples in this section demonstrate the basic functionality of the ORDER BY clause using the minimum required syntax.

A.A. Especificar una sola columna definida en la lista de selecciónSpecifying a single column defined in the select list

En el siguiente ejemplo se ordena el conjunto de resultados por la columna numérica ProductID.The following example orders the result set by the numeric ProductID column. Dado que no se especifica un criterio de ordenación concreto, se utiliza el valor predeterminado (orden ascendente).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. Especificar una columna que no está definida en la lista de selecciónSpecifying a column that is not defined in the select list

En el siguiente ejemplo se ordena el conjunto de resultados por una columna que no está incluida en la lista de selección, pero sí definida en la tabla especificada en la cláusula FROM.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. Especificar un alias como columna de ordenaciónSpecifying an alias as the sort column

En el ejemplo siguiente se especifica el alias de columna SchemaName como columna de criterio de ordenación.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. Especificar una expresión como columna de ordenaciónSpecifying an expression as the sort column

En el ejemplo siguiente se utiliza una expresión como columna de ordenación.The following example uses an expression as the sort column. La expresión se define mediante la función DATEPART para ordenar el conjunto de resultados según el año de contratación de los empleados.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);  

Especificar orden ascendente y orden descendenteSpecifying ascending and descending sort order

A.A. Especificar un orden descendenteSpecifying a descending order

En el siguiente ejemplo se ordena el conjunto de resultados en sentido descendente según la columna numérica ProductID.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. Especificar un orden ascendenteSpecifying a ascending order

En el siguiente ejemplo se ordena el conjunto de resultados en orden ascendente según la columna Name.The following example orders the result set by the Name column in ascending order. Observe que los caracteres están ordenados alfabéticamente, no numéricamente.Note that the characters are sorted alphabetically, not numerically. Es decir, 10 se ordena antes que 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. Especificar orden ascendente y también descendenteSpecifying both ascending and descending order

En el siguiente ejemplo se ordena el conjunto de resultados según dos columnas.The following example orders the result set by two columns. El conjunto de resultados se ordena en primer lugar en sentido ascendente según la columna FirstName y, a continuación, en orden descendente según la columna LastName.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 ;  

Especificar una intercalaciónSpecifying a collation

En el siguiente ejemplo se muestra cómo especificar una intercalación en la cláusula ORDER BY puede cambiar el orden en que se devuelven los resultados de la consulta.The following example shows how specifying a collation in the ORDER BY clause can change the order in which the query results are returned. Se crea una tabla que contiene una columna definida mediante una intercalación que no distingue entre mayúsculas y minúsculas, ni las tildes.A table is created that contains a column defined by using a case-insensitive, accent-insensitive collation. Los valores se insertan con diversas diferencias de uso de mayúsculas, minúsculas y tildes.Values are inserted with a variety of case and accent differences. Dado que no se especifica ninguna intercalación en la cláusula ORDER BY, la primera consulta utiliza la intercalación de la columna al ordenar los valores.Because a collation is not specified in the ORDER BY clause, the first query uses the collation of the column when sorting the values. En la segunda consulta, se especifica una intercalación que distingue entre mayúsculas y minúsculas y las tildes; en consecuencia, cambia el orden en el que se devuelven las filas.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;  

Especificar un orden condicionalSpecifying a conditional order

En los ejemplos siguientes se utiliza la expresión CASE en una cláusula ORDER BY para determinar de manera condicional el criterio de ordenación de las filas según el valor de una columna dada.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. En el primer ejemplo se evalúe el valor de la columna SalariedFlag de la tabla HumanResources.Employee.In the first example, the value in the SalariedFlag column of the HumanResources.Employee table is evaluated. Los empleados que tienen la columna SalariedFlag establecida en 1 se devuelven en orden descendente según el BusinessEntityID.Employees that have the SalariedFlag set to 1 are returned in order by the BusinessEntityID in descending order. Los empleados que tienen la columna SalariedFlag establecida en 0 se devuelven en orden ascendente según el BusinessEntityID.Employees that have the SalariedFlag set to 0 are returned in order by the BusinessEntityID in ascending order. En el segundo ejemplo, el conjunto de resultados se ordena según la columna TerritoryName cuando la columna CountryRegionName es igual a 'United States' y según la columna CountryRegionName en las demás filas.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;  

Usar ORDER BY en una función de categoríaUsing ORDER BY in a ranking function

En el siguiente ejemplo se utiliza la cláusula ORDER BY en las funciones de categoría ROW_NUMBER, RANK, DENSE_RANK y NTILE.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;  

Limitar el número de filas devueltasLimiting the number of rows returned

En los siguientes ejemplos se utiliza OFFSET y FETCH para limitar el número de filas devueltas por una consulta.The following examples use OFFSET and FETCH to limit the number of rows returned by a query.

Se aplica a: SQL Server 2012SQL Server 2012 a través de SQL Server 2017SQL Server 2017 y Base de datos SQL de AzureAzure SQL Database.Applies to: SQL Server 2012SQL Server 2012 through SQL Server 2017SQL Server 2017 and Base de datos SQL de AzureAzure SQL Database.

A.A. Especificar constantes enteras para los valores de OFFSET y FETCHSpecifying integer constants for OFFSET and FETCH values

En el siguiente ejemplo se especifica una constante entera como valor para las cláusulas OFFSET y FETCH.The following example specifies an integer constant as the value for the OFFSET and FETCH clauses. La primera consulta devuelve todas las filas ordenadas según la columna DepartmentID.The first query returns all rows sorted by the column DepartmentID. Compare los resultados devueltos por esta consulta con los de las dos consultas siguientes.Compare the results returned by this query with the results of the two queries that follow it. La consulta siguiente utiliza la cláusula OFFSET 5 ROWS para omitir las primeras 5 filas y devolver todas las restantes.The next query uses the clause OFFSET 5 ROWS to skip the first 5 rows and return all remaining rows. La última consulta utiliza la cláusula OFFSET 0 ROWS para comenzar por la primera fila y, a continuación, utiliza FETCH NEXT 10 ROWS ONLY para limitar las filas devueltas a 10 filas del conjunto de resultados ordenado.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. Especificar variables para los valores de OFFSET y FETCHSpecifying variables for OFFSET and FETCH values

En el siguiente ejemplo se declaran las variables @StartingRowNumber y @FetchRows, y se especifican estas variables en las cláusulas OFFSET y FETCH.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. Especificar expresiones para los valores de OFFSET y FETCHSpecifying expressions for OFFSET and FETCH values

En el siguiente ejemplo se utiliza la expresión @StartingRowNumber - 1 para especificar el valor de OFFSET y la expresión @EndingRowNumber - @StartingRowNumber + 1 para especificar el valor de FETCH.The following example uses the expression @StartingRowNumber - 1 to specify the OFFSET value and the expression @EndingRowNumber - @StartingRowNumber + 1 to specify the FETCH value. Además, se especifica la sugerencia de consulta OPTIMIZE FOR.In addition, the query hint, OPTIMIZE FOR, is specified. Esta sugerencia se puede usar para que se utilice un valor concreto para una variable local al compilar y optimizar la consulta.This hint can be used to provide a particular value for a local variable when the query is compiled and optimized. El valor se utiliza solo durante la optimización de la consulta y no durante la ejecución de la misma.The value is used only during query optimization, and not during query execution. Para obtener más información, vea Sugerencias de consulta (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. Especificar una subconsulta escalar constante para los valores de OFFSET y FETCHSpecifying a constant scalar subquery for OFFSET and FETCH values

En el siguiente ejemplo se utiliza una subconsulta escalar constante a fin de definir el valor para la cláusula FETCH.The following example uses a constant scalar subquery to define the value for the FETCH clause. La subconsulta devuelve un valor único de la columna PageSize de la tabla dbo.AppSettings.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. Ejecutar varias consultas en una sola transacciónRunning multiple queries in a single transaction

En el siguiente ejemplo se muestra un método de implementar una solución de paginación que permite asegurarse de la devolución de resultados estables en todas las solicitudes de la consulta.The following example shows one method of implementing a paging solution that ensures stable results are returned in all requests from the query. La consulta se ejecuta en una sola transacción utilizando el nivel de aislamiento de instantánea, mientras que la columna especificada en la cláusula ORDER BY asegura la singularidad de la columna.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  

Usar ORDER BY con UNION, EXCEPT e INTERSECTUsing ORDER BY with UNION, EXCEPT, and INTERSECT

Cuando una consulta utiliza los operadores UNION, EXCEPT o INTERSECT, la cláusula ORDER BY se debe especificar al final de la instrucción y se ordenan los resultados de las consultas combinadas.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. En el siguiente ejemplo se devuelven todos los productos que son rojos o amarillos y la lista combinada se ordena según la columna ListPrice.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;  

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

En el ejemplo siguiente se muestra la ordenación de un conjunto de resultados mediante el numéricos EmployeeKey columna en orden ascendente.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;  

En el ejemplo siguiente se ordena un conjunto de resultados mediante el numéricos EmployeeKey columna en orden descendente.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;  

El siguiente ejemplo ordena un conjunto de resultados por la LastName columna.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;  

Los pedidos de ejemplo siguientes por dos columnas.The following example orders by two columns. Esta consulta ordena primero en orden ascendente por la FirstName columna y, a continuación, ordena común FirstName valores en orden descendente por la LastName columna.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;  

Vea tambiénSee Also

Expresiones ( Transact-SQL ) Expressions (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
Funciones de categoría ( Transact-SQL ) Ranking Functions (Transact-SQL)
TOP ( Transact-SQL ) TOP (Transact-SQL)
Sugerencias de consulta (Transact-SQL) Query Hints (Transact-SQL)
EXCEPTO y INTERSECT ( Transact-SQL ) EXCEPT and INTERSECT (Transact-SQL)
Unión ( Transact-SQL ) UNION (Transact-SQL)
CASE (Transact-SQL)CASE (Transact-SQL)