La cláusula ORDER BY
controla el orden en el que se devuelven o procesan las filas. Se puede utilizar en cualquier selectionquery, incluyendo un operando de INSERT
o UPSERT
, así como con sentencias DELETE
y UPDATE
.
- Sinopsis
- Parámetros
- Preservación de pedidos
- Orden de filas sin ORDEN POR
- Ordenar mediante selecciones simples de columnas
- Clasificación mediante múltiples columnas
- Invertir el orden de clasificación
- Ordenar en orden de clave primaria
- Ordenar en orden de índice
- Ordenar filas en instrucciones DML
- Ordenar la salida de elimina
- Véase también
Sinopsis
Parámetros
La cláusula ORDER BY
toma una lista de especificaciones de pedido separadas por comas.Cada especificación de pedido se compone de una selección de columnas seguida opcionalmente por la palabra clave ASC
o DESC
.
Cada selección de columna puede tomar una de las siguientes formas:
- Una selección de columna simple, determinada de la siguiente manera:
- El nombre de una etiqueta de columna configurada con
AS
anteriormente en la cláusulaSELECT
. Utiliza el valor calculado por la cláusulaSELECT
como clave de ordenación. - Un número entero positivo, que designa una de las columnas de la fuente de datos, ya sea la cláusula
FROM
de la cláusulaSELECT
donde sucede o la tabla en la que se escribeDELETE
oUPDATE
. Utiliza el valor de entrada correspondiente de la fuente de datos para usarlo como clave de ordenación. - Una expresión escalar arbitraria. Utiliza el resultado de evaluar esa expresión como clave de ordenación.
- El nombre de una etiqueta de columna configurada con
- La notación
PRIMARY KEY <table_name>
. Utiliza la(s) columna (s) de clave primaria de la tabla dada como clave de ordenación. Esta tabla debe formar parte de la fuente de datos. - La notación
INDEX <table_name>@<index_name>
. Utiliza las columnas indexadas por el índice dado como clave de ordenación. Esta tabla debe formar parte de la fuente de datos.
La palabra clave opcional ASC
después de una selección de columna indica que debe usarse la clave de clasificación tal cual, y por lo tanto no tiene sentido.
La palabra clave opcional DESC
invierte la dirección de las columnas seleccionadas por la selección que precede inmediatamente.
CockroachDB admite cláusulas NULLS FIRST
/ NULLS LAST
en ORDER BY
para compatibilidad con la sintaxis de clasificación de filas de PostgreSQL.
El soporte para NULLS LAST
es actualmente solo de sintaxis. Si especifica NULLS LAST
en una cláusula ORDER BY
, CockroachDB usa NULLS FIRST
y no devuelve un error.
Preservación de pedidos
En general, el orden de los resultados intermedios de una consulta no está garantizado,incluso si se especifica ORDER BY
. En otras palabras, la cláusula ORDER BY
solo es efectiva en la instrucción de nivel superior. Por ejemplo, es ignorado por el queryplanner cuando está presente en una sub-consulta en una cláusula FROM
de la siguiente manera:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
Sin embargo,al combinar consultas junto consub-consultas, algunas combinaciones harán que la cláusula ORDER BY
en una sub-consulta signifique:
- El orden del operando de una cláusula
WITH ORDINALITY
(dentro del operandoFROM
de una cláusulaSELECT
) se conserva,para controlar la numeración de las filas. - Se conserva el orden del operando de una cláusula independiente
LIMIT
oOFFSET
(con un operandoFROM
de una cláusulaSELECT
), para determinar qué filas se mantienen en el resultado. - Se conserva el orden de la fuente de datos para una instrucción
INSERT
o una instrucciónUPSERT
que también usaLIMIT
, para determinar qué filas se procesan, pero no su orden. - El pedido indicado para una instrucción
UPDATE
oDELETE
que también utilizaLIMIT
se utiliza para determinar qué filas se procesan, pero no su pedido.(Esta es una extensión cucaracha DB.) - Se conserva el orden de una sub-consulta utilizada en una expresión escalar.
Por ejemplo, utilizando WITH ORDINALITY
:
> SELECT * FROM (SELECT * FROM a ORDER BY a.x) WITH ORDINALITY; -- ensures that the rows are numbered in the order of column a.x.
Por ejemplo, usar una cláusula LIMIT
independiente en FROM
:
Por ejemplo, utilizando una sub-consulta en contexto escalar:
Orden de filas sin ORDEN POR
Sin ORDER BY
, las filas se procesan o devuelven en orden no determinista. «No determinista» significa que el orden real puede depender del plan lógico, el orden de los datos en el disco, la topología del clúster Cucaracha DB, y generalmente es variable con el tiempo.
Ordenar mediante selecciones simples de columnas
Teniendo en cuenta la siguiente tabla:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
Las siguientes instrucciones son equivalentes:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
Tenga en cuenta que el orden de las reglas importa. Si hay ambigüedad ,la prioridad AS
aliasestake sobre las columnas de origen de datos, por ejemplo:
También es posible ordenar usando una expresión escalar arbitraria calculada para cada fila, por ejemplo:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
Clasificación mediante múltiples columnas
Cuando se da más de una especificación de pedido, las especificaciones posteriores se utilizan para ordenar filas que son iguales a las especificaciones anteriores, por ejemplo:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
Esto ordena los resultados por columna b
, y luego si hay múltiplos que tienen el mismo valor en columna b
, ordenará los múltiplos por columna a
.
Invertir el orden de clasificación
La palabra clave DESC
(«descendente») se puede agregar después de una especificación de pedido para invertir su orden. Esto se puede especificar por separado para cada especificación, por ejemplo:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
Ordenar en orden de clave primaria
La notación ORDER BY PRIMARY KEY
garantiza que los resultados se representen en orden de clave primaria.
La ventaja particular es que para las consultas que utilizan el índice principal, esto garantiza el orden al tiempo que garantiza que no habrá un cálculo de clasificación adicional para lograrlo, por ejemplo:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
Si una clave primaria ya usa la palabra clave DESC
, entonces su significado se volteará (cancelará) si la cláusula ORDER BY
también usaDESC
, por ejemplo:
Ordenar en orden de índice
La notación ORDER BY INDEX
garantiza que los resultados se presenten en el orden de un índice dado.
La ventaja particular es que para las consultas que usan ese índice, esto garantiza el orden al tiempo que garantiza que no habrá un cómputo de clasificación adicional para lograrlo, por ejemplo:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT, INDEX v_idx(v));> SELECT k, v FROM kv ORDER BY INDEX kv@v_idx; -- guarantees ordering by column v.
Si un índice ya utiliza la palabra clave DESC
, su significado se invertirá (cancelará) si la cláusula ORDER BY
también utilizaDESC
, por ejemplo:
Ordenar filas en instrucciones DML
Al usar ORDER BY
con una INSERT
,UPSERT
, UPDATE
oDELETE
(p. ej., una instrucción DML), la cláusula ORDER BY
está firmada si no se utiliza en combinación con LIMIT
y/oOFFSET
.
La combinación de ORDER BY
y LIMIT
/OFFSET
determina qué filas de la entrada se utilizan para insertar, actualizar o eliminar los datos de tabla, pero no determina en qué orden se sitúa la mutación.
Por ejemplo, usando LIMIT
en INSERT
:
> INSERT INTO a SELECT * FROM b ORDER BY b.x LIMIT 1; -- ensures that only the first row of b in the order of column b.x -- is inserted into a.
La razón por la que ORDER BY
no controla el orden final de las filas en la tabla es que el orden de las filas en la tabla de destino está determinado por sus índices primario y secundario.
Para ordenar el resultado de la cláusula RETURNING
, consulte Ordenar la salida de eliminaciones.
Ordenar la salida de elimina
Para ordenar la salida de una instrucción DELETE
, use:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
Para ver un ejemplo, consulte Ordenar y devolver filas eliminadas.
Véase también
- Consultas de Selección
- las Expresiones Escalares
INSERT
UPSERT
DELETE
UPDATE
esta página Fue útil?
Sí No