clauza ORDER BY
controlează ordinea în care rândurile sunt returnate sau procesate. Acesta poate fi utilizat în orice selectionquery, inclusivca operand de INSERT
sau UPSERT
, precum și cu DELETE
și UPDATE
declarații.
- Sinopsis
- parametri
- conservarea ordinii
- ordonarea rândurilor fără ordine de
- Sortare folosind selecții simple de coloane
- Sortare folosind mai multe coloane
- inversarea ordinii de sortare
- sortarea în ordinea cheii primare
- sortare în ordinea indexului
- ordonarea rândurilor în instrucțiunile DML
- sortarea ieșirii ștergerilor
- a se vedea, de asemenea,
Sinopsis
parametri
clauza ORDER BY
ia o listă separată prin virgulă a specificațiilor de comandă.Fiecare specificație de comandă este compusă dintr-o selecție de coloane urmată opțional de cuvântul cheie ASC
sau DESC
.
fiecare selecție coloană poate lua una dintre următoarele forme:
- o selecție coloană simplă, determinată după cum urmează:
- numele unei etichete coloană configurat cu
AS
mai devreme înSELECT
clauza. Aceasta utilizează valoarea calculată de clauzaSELECT
ca cheie de sortare. - un număr întreg pozitiv, desemnând una dintre coloanele din sursa de date, fie clauza
FROM
a clauzeiSELECT
unde se întâmplă, fie tabelul fiind scris deDELETE
sauUPDATE
. Aceasta utilizează valoarea de intrare corespunzătoare din sursa de date pentru a fi utilizată ca cheie de sortare. - o expresie scalară arbitrară. Aceasta folosește rezultatul evaluării acelei expresii ca cheie de sortare.
- numele unei etichete coloană configurat cu
- notația
PRIMARY KEY <table_name>
. Aceasta utilizează coloana cheie primară a tabelului dat ca cheie de sortare. Acest tabel trebuie să facă parte din sursa de date. - notația
INDEX <table_name>@<index_name>
. Aceasta utilizează coloanele indexate de indexul dat ca cheie de sortare. Acest tabel trebuie să facă parte din sursa de date.
cuvântul cheie opțional ASC
după selectarea unei coloane indică utilizarea cheii de sortare așa cum este și, prin urmare, nu are sens.
cuvântul cheie opțional DESC
inversează direcția coloanei(coloanelor)selectate de selecția care precede imediat.
CockroachDB acceptă NULLS FIRST
/NULLS LAST
în ORDER BY
clauze de compatibilitate cu sintaxa de sortare a rândurilor PostgreSQL.
suport pentru NULLS LAST
este în prezent numai sintaxa. Dacă specificați NULLS LAST
într-o clauză ORDER BY
, CockroachDB utilizează NULLS FIRST
și nu returnează o eroare.
conservarea ordinii
în general, ordinea rezultatelor intermediare ale unei interogări nu este garantată,chiar dacă este specificat ORDER BY
. Cu alte cuvinte, clauza ORDER BY
este numaieficace la declarația de nivel superior. De exemplu, este ignorat de queryplanner atunci când este prezent într-o sub-interogare într-o clauză FROM
după cum urmează:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
cu toate acestea, atunci când combinați interogări împreună cusub-interogări, unele combinații vor face clauza ORDER BY
într-un sub-interogaresemnificativ:
- ordonarea operandului unei clauze
WITH ORDINALITY
(în cadrul operanduluiFROM
al unei clauzeSELECT
) este păstrată,pentru a controla numerotarea rândurilor. - ordonarea operandului unei clauze de sine stătătoare
LIMIT
sauOFFSET
(în cadrul operanduluiFROM
al unei clauzeSELECT
) este păstrată, pentru a determinacare rânduri sunt păstrate în rezultat. - ordonarea sursei de date pentru o declarație
INSERT
sau o declarațieUPSERT
care utilizează șiLIMIT
este păstrată, pentru a determina ce rânduri sunt procesate, dar nu ordinea lor. - ordonarea indicată pentru o declarație
UPDATE
sauDELETE
care utilizează șiLIMIT
este utilizată pentru a determinacare rânduri sunt procesate, dar nu ordinea lor.(Aceasta este o extensie CockroachDB.) - ordonarea unei sub-interogări utilizate într-o expresie scalarăse păstrează.
de exemplu, folosind 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.
de exemplu, folosind o clauză autonomă LIMIT
în FROM
:
de exemplu, folosind o sub-interogare în context scalar:
ordonarea rândurilor fără ordine de
fără ORDER BY
, rândurile sunt procesate sau returnate în ordine anon-deterministă. „Nedeterminist” înseamnă că ordinea realăpoate depinde de planul logic, ordinea datelor de pe disc, topologiade Cluster CockroachDB, și este, în general, variabilă în timp.
Sortare folosind selecții simple de coloane
luând în considerare următorul tabel:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
următoarele afirmații sunt echivalente:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
rețineți că ordinea regulilor contează. Dacă există ambiguitate, aliasurile AS
au prioritate față de coloanele sursei de date, de exemplu:
de asemenea, este posibil să sortați folosind o expresie scalară arbitrară calculată pentru fiecare rând, de exemplu:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
Sortare folosind mai multe coloane
când sunt date mai multe specificații de comandă, sunt utilizate specificațiile ulterioarepentru a ordona rânduri care sunt egale față de specificațiile anterioare, de exemplu:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
aceasta sortează rezultatele după coloana b
și apoi dacă există multiplerows care au aceeași valoare în coloana b
, atunci va ordona theserows după coloana a
.
inversarea ordinii de sortare
cuvântul cheie DESC
(„descendent”) poate fi adăugat după o specificație de comandă pentru a inversa ordinea sa. Acest lucru poate fi specificat separat pentru fiecare specificație, de exemplu:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
sortarea în ordinea cheii primare
notația ORDER BY PRIMARY KEY
garantează că rezultatele sunt prezentate în ordinea cheii primare.
avantajul particular este că pentru interogările care utilizează indexul primar, acest lucru garantează ordinea, garantând, de asemenea, că nu va exista un calcul suplimentar de sortare pentru ao realiza, de exemplu:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
dacă o cheie primară folosește deja cuvântul cheie DESC
, atunci sensul său va fi răsturnat (anulat) dacă clauza ORDER BY
folosește șiDESC
, de exemplu:
sortare în ordinea indexului
notația ORDER BY INDEX
garantează că rezultatele sunt prezentateîn ordinea unui index dat.
avantajul particular este că pentru interogările care utilizează acel index, acestgarantează ordinea, garantând în același timp că nu va exista un calcul suplimentar de sortare pentru ao realiza, de exemplu:
> 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.
dacă un index folosește deja cuvântul cheie DESC
, atunci sensul său va fi inversat (anulat) dacă clauza ORDER BY
folosește șiDESC
, de exemplu:
ordonarea rândurilor în instrucțiunile DML
atunci când se utilizează ORDER BY
cu o INSERT
,UPSERT
, UPDATE
sau DELETE
(i. e., o declarație LMD), clauza ORDER BY
este semnalizată dacă nu este utilizată în combinație cuLIMIT
și/sau OFFSET
.
combinația ambelor ORDER BY
șiLIMIT
/ OFFSET
determinăcare rânduri de intrare sunt utilizate pentru a insera, actualiza sau șterge tabeluldate, dar nu determină în ce ordine ia mutația.
de exemplu, folosind LIMIT
în 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.
motivul pentru care ORDER BY
nu controlează ordinea finală a rândurilor din tabel este că ordonarea rândurilor din tabelul țintă este determinată de indicii săi primari și secundari.
pentru a ordona rezultatul clauzei RETURNING
, consultați sortarea ieșiriide ștergeri.
sortarea ieșirii ștergerilor
pentru a sorta ieșirea unei instrucțiuni DELETE
, utilizați:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
pentru un exemplu, consultați sortarea și returnarea rândurilor șterse.
a se vedea, de asemenea,
- interogări de selecție
- expresii scalare
INSERT
UPSERT
DELETE
UPDATE
a fost utilă această pagină?
Da Nu