ORDER BY
– satsen styr ordningen i vilken rader returneras ellerbearbetas. Den kan användas i valfri selectionquery, inklusivesom operand av INSERT
eller UPSERT
, såväl som med DELETE
och UPDATE
uttalanden.
Synopsis
parametrar
ORDER BY
-satsen tar en kommaseparerad lista över beställningsspecifikationer.Varje Beställningsspecifikation består av ett kolumnval följt av nyckelordet ASC
eller DESC
.
varje kolumnval kan ta en av följande former:
- ett enkelt kolumnval, bestämt enligt följande:
- namnet på en kolumnetikett konfigurerad med
AS
tidigare iSELECT
– satsen. Detta använder värdet som beräknas avSELECT
– satsen som sorteringsnyckel. - ett positivt heltal som anger en av kolumnerna i datakällan, antingen
FROM
– klausulen iSELECT
– klausulen där det händer eller tabellen skrivs till avDELETE
ellerUPDATE
. Detta använder motsvarande inmatningsvärde från datakällan för att använda som sorteringsnyckel. - ett godtyckligt skalärt uttryck. Detta använder resultatet av att utvärdera det uttrycket som sorteringsnyckel.
- namnet på en kolumnetikett konfigurerad med
- notationen
PRIMARY KEY <table_name>
. Detta använder primärnyckelkolumnen i den givna tabellen som sorteringsnyckel. Denna tabell måste vara en del av datakällan. - notationen
INDEX <table_name>@<index_name>
. Detta använder kolumnerna indexerade av det angivna indexet som sorteringsnyckel. Denna tabell måste vara en del av datakällan.
det valfria nyckelordet ASC
efter ett kolumnval indikerar att användasorteringsnyckeln är som den är och är således meningslös.
det valfria nyckelordet DESC
inverterar riktningen för kolumnen / kolumnerna som valts av det urval som omedelbart föregår.
CockroachDB stöderNULLS FIRST
/NULLS LAST
i ORDER BY
klausuler för kompatibilitet med PostgreSQL radsortering syntax.
stöd för NULLS LAST
är för närvarande endast syntax. Om du anger NULLS LAST
i en ORDER BY
– klausul använder CockroachDB NULLS FIRST
och returnerar inte ett fel.
Orderbevarande
i allmänhet garanteras inte ordningen för mellanresultaten för en fråga, även om ORDER BY
anges. Med andra ord är ORDER BY
-klausulen endasteffektiv på högsta nivå. Till exempel ignoreras den av queryplanner när den finns i en underfråga i en FROM
– klausul enligt följande:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
men när man kombinerar frågor tillsammans medsub-frågor, kommer vissa kombinationer att göra ORDER BY
– klausulen i en underfråganbetydande:
- ordningen av operand av en
WITH ORDINALITY
klausul (inomFROM
operand av enSELECT
klausul) bevaras, för att styra numreringen av raderna. - beställningen av operand av en fristående
LIMIT
ellerOFFSET
klausul (withinaFROM
operand av ENSELECT
klausul) bevaras för att bestämmavilka rader hålls i resultatet. - beställningen av datakällan för en
INSERT
– sats eller enUPSERT
– sats som också använderLIMIT
bevaras för att bestämma vilka rader som behandlas, men inte deras ordning. - beställningen som anges för ett
UPDATE
ellerDELETE
– uttalande som också använderLIMIT
används för att bestämma vilka rader som behandlas, men inte deras ordning.(Detta är en Kackerlackadb-förlängning.) - ordningen av en underfråga som används i ett skalärt expressionär bevarad.
till exempel med 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.
till exempel, med hjälp av en fristående LIMIT
– klausul i FROM
:
till exempel, med hjälp av en underfråga i skalär sammanhang:
beställning av rader utan ordning med
utan ORDER BY
, rader bearbetas eller returneras i anon-deterministisk ordning. ”Icke-deterministisk” betyder att den faktiska ordningenkan bero på den logiska Planen, ordningen på data på disken, topologin av Kackerlackadb-klustret och är i allmänhet variabel över tiden.
sortering med enkla kolumnval
med tanke på följande tabell:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
följande påståenden är likvärdiga:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
Observera att ordningen på reglerna är viktig. Om det finns tvetydighet, AS
aliasestake prioritet över datakällkolumnerna, till exempel:
det är också möjligt att sortera med ett godtyckligt skalärt uttryck beräknat för varje rad, till exempel:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
sortering med flera kolumner
när mer än en Beställningsspecifikation ges används de senare specifikationerna för att beställa rader som är lika över de tidigare specifikationerna, till exempel:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
detta sorterar resultaten efter kolumn b
, och sedan om det finns multiplerows som har samma värde i kolumn b
, kommer det sedan att beställa theserows efter kolumn a
.
invertera sorteringsordningen
nyckelordet DESC
(”descending”) kan läggas till efter en Beställningsspecifikation toinvert sin ordning. Detta kan specificeras separat för varje specifikation, till exempel:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
sortering i primärnyckelordning
ORDER BY PRIMARY KEY
notationen garanterar att resultaten presenteras i primärnyckelordning.
den speciella fördelen är att för frågor som använder det primära indexet garanterar detta ordern samtidigt som det garanterar att det inte kommer att finnas någon ytterligare sorteringsberäkning för att uppnå det, till exempel:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
om en primärnyckel använder nyckelordet DESC
redan, kommer dess betydelse att vändas (annulleras) om ORDER BY
– klausulen också använderDESC
, till exempel:
sortering i indexordning
ORDER BY INDEX
notationen garanterar att resultaten presenterasi ordningen för ett givet index.
den speciella fördelen är att för frågor som använder det indexet garanterar detta ordern samtidigt som det garanterar att det inte kommer att finnas någon ytterligare sorteringsberäkning för att uppnå det, till exempel:
> 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.
om ett index använder nyckelordet DESC
redan, då dess meningkommer att vändas (annulleras) om ORDER BY
klausulen också använderDESC
, till exempel:
beställa rader i DML-uttalanden
när du använder ORDER BY
med en INSERT
,UPSERT
, UPDATE
ellerDELETE
(dvs., ett DML-uttalande), ORDER BY
– klausulen isignoreras om den inte används i kombination med LIMIT
och/ellerOFFSET
.
kombinationen av både ORDER BY
ochLIMIT
/ OFFSET
bestämmervilka rader av ingången används för att infoga, uppdatera eller radera tabellendata, men det bestämmer inte i vilken ordning mutationen tarplats.
till exempel med LIMIT
i 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.
anledningen till att ORDER BY
inte kontrollerar radernas slutliga ordningi tabellen är att ordningen av rader i måltabellen bestäms av dess primära och sekundära index.
för att beställa resultatet av RETURNING
– satsen, se Sortera utmatningenav raderingar.
Sortera utmatningen av raderar
för att sortera utmatningen från ett DELETE
– uttalande, använd:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
ett exempel finns i sortera och returnera raderade rader.
Se även
- urvalsfrågor
- skalära uttryck
INSERT
UPSERT
DELETE
UPDATE
var den här sidan till hjälp?
Ja Nej