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
- parametre
- ordrebevarelse
- bestilling af rækker uden ordre af
- sortering ved hjælp af enkle kolonnevalg
- sortering ved hjælp af flere kolonner
- Invertering af sorteringsrækkefølgen
- sortering i primær nøglerækkefølge
- sortering i indeksrækkefølge
- bestilling af rækker i DML-udsagn
- sortering af output fra sletter
- Se også
Synopsis
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:
- navnet på en kolonneetiket konfigureret med
AStidligere iSELECT– klausulen. Dette bruger værdien beregnet afSELECT– klausulen som sorteringsnøgle. - et positivt heltal, der betegner en af kolonnerne i datakilden, enten
FROMklausulen iSELECTklausulen, hvor det sker, eller tabellen skrives til afDELETEellerUPDATE. Dette bruger den tilsvarende inputværdi fra datakilden til at bruge som sorteringsnøgle. - et vilkårligt skalært udtryk. Dette bruger resultatet af at evaluere dette udtryk som sorteringsnøglen.
- navnet på en kolonneetiket konfigureret med
- 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.
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:
> 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:
- rækkefølgen af operand af en
WITH ORDINALITYklausul (inden forFROMoperand af enSELECTklausul) bevares for at kontrollere nummereringen af rækkerne. - bestilling af operand af en stand-alone
LIMITellerOFFSETklausul (indenFROMoperand af enSELECTklausul) bevares for at bestemmehvilke rækker holdes i resultatet. - rækkefølgen af datakilden for en
INSERTerklæring eller enUPSERTerklæring, der også brugerLIMIT, bevares for at bestemme, hvilke rækker der behandles, men ikke deres rækkefølge. - ordren angivet for en
UPDATEellerDELETEerklæring, der også brugerLIMIT, bruges til at bestemmehvilke rækker behandles, men ikke deres rækkefølge.(Dette er en Kakerlakdb forlængelse.) - rækkefølgen af en underforespørgsel, der anvendes i et skalarudtrykbevares.
for eksempel ved hjælp af 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.
for eksempel ved hjælp af en stand-alone LIMIT klausul i FROM:
for eksempel ved hjælp af en underforespørgsel i skalar kontekst:
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:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
følgende udsagn er ækvivalente:
+---------+| 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:
det er også muligt at sortere ved hjælp af et vilkårligt skalarudtryk beregnet for hver række, for eksempel:
> 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:
> 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:
> 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:
> 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:
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:
> 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:
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:
> 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:
> 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
INSERTUPSERTDELETEUPDATE
var denne side nyttig?
Ja
Nej