beställa frågeresultat

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 DELETEoch UPDATE uttalanden.

Synopsis

ORDERBYa_exprASCDESCNULLSFIRSTLAstprimarykeytable_nameindextable_name@index_nameASCDESC,

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:
    1. namnet på en kolumnetikett konfigurerad med AS tidigare i SELECT – satsen. Detta använder värdet som beräknas av SELECT – satsen som sorteringsnyckel.
    2. ett positivt heltal som anger en av kolumnerna i datakällan, antingen FROM – klausulen i SELECT – klausulen där det händer eller tabellen skrivs till av DELETE eller UPDATE. Detta använder motsvarande inmatningsvärde från datakällan för att använda som sorteringsnyckel.
    3. ett godtyckligt skalärt uttryck. Detta använder resultatet av att utvärdera det uttrycket som sorteringsnyckel.
  • 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.

notera:

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:

ikon / knappar / kopiera
> 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:

  1. ordningen av operand av en WITH ORDINALITY klausul (inom FROM operand av en SELECT klausul) bevaras, för att styra numreringen av raderna.
  2. beställningen av operand av en fristående LIMIT eller OFFSET klausul (withina FROM operand av EN SELECT klausul) bevaras för att bestämmavilka rader hålls i resultatet.
  3. beställningen av datakällan för en INSERT – sats eller en UPSERT – sats som också använderLIMIT bevaras för att bestämma vilka rader som behandlas, men inte deras ordning.
  4. beställningen som anges för ett UPDATEeller DELETE – uttalande som också använder LIMIT används för att bestämma vilka rader som behandlas, men inte deras ordning.(Detta är en Kackerlackadb-förlängning.)
  5. ordningen av en underfråga som används i ett skalärt expressionär bevarad.

till exempel med WITH ORDINALITY:

ikon / knappar / kopiera
> 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:

icon / knappar / kopiera

till exempel, med hjälp av en underfråga i skalär sammanhang:

icon/knappar/kopiera

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:

ikon / knappar / kopia
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);

följande påståenden är likvärdiga:

ikon / knappar / kopia
+---------+| 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:

ikon / knappar / kopiera

det är också möjligt att sortera med ett godtyckligt skalärt uttryck beräknat för varje rad, till exempel:

ikon / knappar / kopiera
> 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:

ikon / knappar / kopia
> 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:

ikon / knappar / kopia
> 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:

ikon / knappar / kopia
> 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:

ikon/knappar/kopiera

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:

ikon / knappar / kopia
> 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:

ikon / knappar / kopiera

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 BYochLIMIT/ 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:

ikon / knappar / kopiera
> 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:

ikon / knappar / kopia
> 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

Lämna ett svar

Din e-postadress kommer inte publiceras.