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 DELETE
og 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
AS
tidligere iSELECT
– klausulen. Dette bruger værdien beregnet afSELECT
– klausulen som sorteringsnøgle. - et positivt heltal, der betegner en af kolonnerne i datakilden, enten
FROM
klausulen iSELECT
klausulen, hvor det sker, eller tabellen skrives til afDELETE
ellerUPDATE
. 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 ORDINALITY
klausul (inden forFROM
operand af enSELECT
klausul) bevares for at kontrollere nummereringen af rækkerne. - bestilling af operand af en stand-alone
LIMIT
ellerOFFSET
klausul (indenFROM
operand af enSELECT
klausul) bevares for at bestemmehvilke rækker holdes i resultatet. - rækkefølgen af datakilden for en
INSERT
erklæring eller enUPSERT
erklæring, der også brugerLIMIT
, bevares for at bestemme, hvilke rækker der behandles, men ikke deres rækkefølge. - ordren angivet for en
UPDATE
ellerDELETE
erklæ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 BY
ogLIMIT
/ 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
INSERT
UPSERT
DELETE
UPDATE
var denne side nyttig?
Ja Nej