bestilling forespørgsel resultater

ORDER BY – klausulen styrer rækkefølgen, i hvilken rækker returneres eller behandles. Det kan bruges i ethvert valgforespørgsel, herundersom operand af INSERT eller UPSERT, såvel som med DELETEog UPDATE udsagn.

Synopsis

ORDERBYa_exprASCDESCNULLSFIRSTLAstprimarykeytable_nameindextable_name@index_nameASCDESC,

parametre

ORDER BY klausulen tager en kommasepareret liste over bestillingsspecifikationer.Hver bestillingsspecifikation består af et kolonnevalg, der følges optionaltved nøgleordet ASC eller DESC.

hvert kolonnevalg kan tage en af følgende former:

  • et simpelt kolonnevalg, bestemt som følger:
    1. navnet på en kolonneetiket konfigureret med AS tidligere i SELECT – klausulen. Dette bruger værdien beregnet af SELECT – klausulen som sorteringsnøgle.
    2. et positivt heltal, der betegner en af kolonnerne i datakilden, enten FROM klausulen i SELECT klausulen, hvor det sker, eller tabellen skrives til af DELETEeller UPDATE. Dette bruger den tilsvarende inputværdi fra datakilden til at bruge som sorteringsnøgle.
    3. et vilkårligt skalært udtryk. Dette bruger resultatet af at evaluere dette udtryk som sorteringsnøglen.
  • notationen PRIMARY KEY <table_name>. Dette bruger den eller de primære nøglekolonner i den givne tabel som sorteringsnøgle. Denne tabel skal være en del af datakilden.
  • notationen INDEX <table_name>@<index_name>. Dette bruger kolonnerne indekseret af det givne indeks som sorteringsnøgle. Denne tabel skal være en del af datakilden.

det valgfrie søgeord ASC efter et kolonnevalg angiver at brugesorteringsnøglen som den er, og er således meningsløs.

det valgfrie søgeord DESC inverterer retningen af de(n)kolonne (er), der er valgt af det valg, der umiddelbart går forud.

Kakerlakdb understøtter NULLS FIRST/ NULLS LAST i ORDER BY klausuler for kompatibilitet med syntaks for rækkesortering.

Bemærk:

støtte til NULLS LAST er i øjeblikket kun syntaks. Hvis du angiver NULLS LAST i en ORDER BY – klausul, bruger CockroachDB NULLS FIRST og returnerer ikke en fejl.

ordrebevarelse

generelt er rækkefølgen af de mellemliggende resultater af en forespørgsel ikke garanteret, selvom ORDER BY er angivet. Med andre ord er ORDER BY klausulen kuneffektiv på øverste niveau erklæring. For eksempel ignoreres det af forespørgselsplanneren, når den findes i en underforespørgsel i en FROM-klausul som følger:

ikon / knapper / kopi
> 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 kombinerer forespørgsler sammen medsub-forespørgsler, vil nogle kombinationer gøre ORDER BY klausulen i en underforespørgselbetydelig:

  1. rækkefølgen af operand af en WITH ORDINALITY klausul (inden for FROM operand af en SELECT klausul) bevares for at kontrollere nummereringen af rækkerne.
  2. bestilling af operand af en stand-alone LIMIT eller OFFSET klausul (inden FROM operand af en SELECT klausul) bevares for at bestemmehvilke rækker holdes i resultatet.
  3. rækkefølgen af datakilden for en INSERT erklæring eller enUPSERT erklæring, der også bruger LIMIT, bevares for at bestemme, hvilke rækker der behandles, men ikke deres rækkefølge.
  4. ordren angivet for en UPDATE eller DELETEerklæring, der også bruger LIMIT, bruges til at bestemmehvilke rækker behandles, men ikke deres rækkefølge.(Dette er en Kakerlakdb forlængelse.)
  5. rækkefølgen af en underforespørgsel, der anvendes i et skalarudtrykbevares.

for eksempel ved hjælp af WITH ORDINALITY:

ikon / knapper / kopi
> SELECT * FROM (SELECT * FROM a ORDER BY a.x) WITH ORDINALITY; -- ensures that the rows are numbered in the order of column a.x.

for eksempel ved hjælp af en stand-alone LIMIT klausul i FROM:

icon / buttons/copy

for eksempel ved hjælp af en underforespørgsel i skalar kontekst:

icon/buttons / copy

bestilling af rækker uden ordre af

uden ORDER BY behandles rækker eller returneres i anon-deterministisk rækkefølge. “Ikke-deterministisk” betyder, at den faktiske ordrekan afhænge af den logiske plan, rækkefølgen af data på disken, Topologienaf Kakerlakdb-klyngen og er generelt variabel over tid.

sortering ved hjælp af enkle kolonnevalg

i betragtning af følgende tabel:

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

følgende udsagn er ækvivalente:

ikon / knapper / kopi
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)

Bemærk, at rækkefølgen af reglerne betyder noget. Hvis der er tvetydighed, AS aliaserneprioritet over datakildekolonnerne, for eksempel:

ikon / knapper / kopi

det er også muligt at sortere ved hjælp af et vilkårligt skalarudtryk beregnet for hver række, for eksempel:

ikon / knapper / kopi
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.

sortering ved hjælp af flere kolonner

når der gives mere end en ordrespecifikation, bruges de senere specifikationerat bestille rækker, der er ens i forhold til de tidligere specifikationer, for eksempel:

ikon / knapper / kopi
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;

dette sorterer resultaterne efter kolonne b, og hvis der er flere rækker, der har den samme værdi i kolonne b, vil den derefter bestille disse rækker efter kolonne a.

Invertering af sorteringsrækkefølgen

nøgleordet DESC (“faldende”) kan tilføjes efter en bestillingsspecifikation tilomvende sin rækkefølge. Dette kan specificeres separat for hver specifikation, for eksempel:

ikon / knapper / kopi
> 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ær nøglerækkefølge

notationen ORDER BY PRIMARY KEY garanterer, at resultaterne repræsenteres i primær nøglerækkefølge.

den særlige fordel er,at for forespørgsler, der bruger det primære indeks, garanterer dette ordren, mens det også garanterer, at der ikke vil være anadditionel sorteringsberegning for at opnå det, for eksempel:

ikon / knapper / kopi
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.

hvis en primær nøgle allerede bruger nøgleordet DESC, vil dens betydningvil blive vendt (annulleret), hvisORDER BY – klausulen også brugerDESC, for eksempel:

ikon/knapper/kopi

sortering i indeksrækkefølge

ORDER BY INDEX notationen garanterer, at resultaterne præsenteresi rækkefølgen af et givet indeks.

den særlige fordel er, at for forespørgsler, der bruger dette indeks, dettegaranterer ordren, samtidig med at der garanteres, at der ikke vil være anadditionel sorteringsberegning for at opnå det, for eksempel:

ikon / knapper / kopi
> 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.

hvis et indeks bruger søgeordet DESC allerede, så er dets betydningvil blive vendt (annulleret), hvisORDER BY klausulen også bruger DESC, for eksempel:

ikon / knapper / kopi

bestilling af rækker i DML-udsagn

når du bruger ORDER BY med en INSERT,UPSERT, UPDATE ellerDELETE(dvs., en DML-erklæring), ORDER BY – klausulen erignoreret, hvis den ikke bruges i kombination med LIMIT og/ellerOFFSET.

kombinationen af både ORDER BYogLIMIT/ OFFSET bestemmerhvilke rækker af input bruges til at indsætte, opdatere eller slette tabledata, men det bestemmer ikke i hvilken rækkefølge mutationen tagerplacere.

for eksempel bruger LIMIT i INSERT:

ikon / knapper / kopi
> 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.

årsagen til, at ORDER BY ikke kontrollerer den endelige rækkefølge af rækkernei tabellen er, at rækkefølgen af rækker i måltabellen bestemmes af dens primære og sekundære indekser.

for at bestille resultatet af RETURNING – klausulen, se sortering af outputof sletter.

sortering af output fra sletter

for at sortere output fra en DELETE erklæring, brug:

ikon / knapper / kopi
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...

du kan f.eks. se sortere og returnere slettede rækker.

Se også

  • Udvælgelsesforespørgsler
  • skalære udtryk
  • INSERT
  • UPSERT
  • DELETE
  • UPDATE

var denne side nyttig?

Ja Nej

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.