klauzula ORDER BY
kontroluje kolejność zwracania lub przetwarzania wierszy. Może być używany w dowolnej selectionquery, w tym w operandach INSERT
lub UPSERT
, jak również w poleceniach DELETE
i UPDATE
.
- parametry
- zachowanie porządku
- kolejność wierszy bez kolejności przez
- sortowanie za pomocą prostych wyborów kolumn
- sortowanie przy użyciu wielu kolumn
- odwracanie kolejności sortowania
- sortowanie w kolejności klucza podstawowego
- sortowanie w kolejności indeksu
- porządkowanie wierszy w instrukcjach DML
- sortowanie wyniku usuwania
- Zobacz też
parametry
klauzula ORDER BY
pobiera oddzieloną przecinkami listę specyfikacji zamówienia.Każda specyfikacja zamówienia składa się z wyboru kolumny, a następnie opcjonalnie słowa kluczowego ASC
lub DESC
.
każdy wybór kolumny może mieć jedną z następujących form:
- prosty wybór kolumny, określony w następujący sposób:
- nazwa etykiety kolumny skonfigurowanej z
AS
wcześniej w klauzuliSELECT
. Używa to wartości obliczonej przez klauzulęSELECT
jako klucza sortowania. - dodatnia liczba całkowita, wyznaczająca jedną z kolumn w źródle danych, albo klauzulę
FROM
klauzuliSELECT
, w której się to dzieje, albo tabelę zapisywaną przezDELETE
lubUPDATE
. To używa odpowiedniej wartości wejściowej ze źródła danych do użycia jako klucza sortowania. - Dowolne wyrażenie skalarne. To wykorzystuje wynik oceny tego wyrażenia jako klucz sortowania.
- nazwa etykiety kolumny skonfigurowanej z
- notacja
PRIMARY KEY <table_name>
. Jako klucz sortujący używa się kolumny (kolumn) klucza podstawowego danej tabeli. Ta tabela musi być częścią źródła danych. - notacja
INDEX <table_name>@<index_name>
. Jako klucz sortujący używa się kolumn indeksowanych podanym indeksem. Ta tabela musi być częścią źródła danych.
opcjonalne słowo kluczowe ASC
po zaznaczeniu kolumny wskazuje na użycie klucza sortującego tak, jak jest, a zatem jest bez znaczenia.
opcjonalne słowo kluczowe DESC
odwraca kierunek kolumn wybranych przez zaznaczenie, które bezpośrednio poprzedza.
CockroachDB obsługuje NULLS FIRST
/NULLS LAST
w klauzulach ORDER BY
dla zgodności ze składnią sortowania wierszy PostgreSQL.
wsparcie dla NULLS LAST
jest obecnie tylko dla składni. Jeśli podasz NULLS LAST
w klauzuli ORDER BY
, CockroachDB użyje NULLS FIRST
i nie zwróci błędu.
zachowanie porządku
ogólnie kolejność pośrednich wyników zapytania nie jest gwarantowana, nawet jeśli określono ORDER BY
. Innymi słowy, klauzula ORDER BY
jest tylko efektywna na najwyższym poziomie. Na przykład, jest ignorowany przez queryplanner, gdy występuje w zapytaniu podrzędnym w klauzuli FROM
w następujący sposób:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
jednak podczas łączenia zapytań wraz zsub-queries, niektóre kombinacje sprawią, że klauzula ORDER BY
w zapytaniu podrzędnym będzie znacząca:
- kolejność operandu klauzuli
WITH ORDINALITY
(w obrębie operanduFROM
klauzuliSELECT
) jest zachowana,aby kontrolować numerację wierszy. - kolejność operandu samodzielnej klauzuli
LIMIT
lubOFFSET
(z operandemFROM
klauzuliSELECT
) jest zachowana, aby określić, które wiersze są przechowywane w wyniku. - kolejność źródła danych dla instrukcji
INSERT
lub instrukcjiUPSERT
, która również używaLIMIT
, jest zachowana, aby określić, które wiersze są przetwarzane, ale nie ich kolejność. - kolejność wskazana dla instrukcji
UPDATE
lubDELETE
, która również używaLIMIT
, jest używana do określenia, które wiersze są przetwarzane, ale nie ich kolejność.(Jest to rozszerzenie CockroachDB.) - kolejność podzapytania używana w wyrażeniu skalarnym jest zachowana.
na przykład za pomocą 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.
na przykład, używając samodzielnej klauzuli LIMIT
w FROM
:
na przykład, używając zapytania podrzędnego w kontekście skalarnym:
kolejność wierszy bez kolejności przez
bez ORDER BY
, wiersze są przetwarzane lub zwracane w porządku anoneterministycznym. „Niedeterministyczny” oznacza, że rzeczywisty porządek może zależeć od planu logicznego, kolejności danych na dysku, topologii klastra CockroachDB i jest na ogół zmienny w czasie.
sortowanie za pomocą prostych wyborów kolumn
biorąc pod uwagę następującą tabelę:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
następujące polecenia są równoważne:
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
należy pamiętać, że kolejność zasad ma znaczenie. Jeśli występuje niejednoznaczność, Alias AS
ma pierwszeństwo przed kolumnami źródła danych, na przykład:
możliwe jest również sortowanie za pomocą dowolnego wyrażenia skalarnego obliczonego dla każdego wiersza, na przykład:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
sortowanie przy użyciu wielu kolumn
gdy podano więcej niż jedną specyfikację zamówienia, używane są późniejsze specyfikacje do porządkowania wierszy, które są równe w stosunku do wcześniejszych specyfikacji, na przykład:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
sortuje to wyniki według kolumny b
, a jeśli w kolumnie b
są wielokrotności, które mają tę samą wartość, to porządkuje wyniki według kolumny a
.
odwracanie kolejności sortowania
słowo kluczowe DESC
(„malejące”) można dodać po specyfikacji zamówienia, aby zmienić jego kolejność. Można to określić oddzielnie dla każdej specyfikacji, na przykład:
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
sortowanie w kolejności klucza podstawowego
notacja ORDER BY PRIMARY KEY
gwarantuje, że wyniki są reprezentowane w kolejności klucza podstawowego.
szczególną zaletą jest to,że w przypadku zapytań wykorzystujących indeks główny gwarantuje to kolejność, a jednocześnie gwarantuje, że nie będzie dodatkowych obliczeń sortowania, aby ją osiągnąć, na przykład:
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
jeśli klucz podstawowy używa już słowa kluczowego DESC
, to jego znaczenie zostanie odwrócone (anulowane), jeśli klauzula ORDER BY
używa równieżDESC
, na przykład:
sortowanie w kolejności indeksu
notacja ORDER BY INDEX
gwarantuje, że wyniki są prezentowane w kolejności danego indeksu.
szczególną zaletą jest to, że w przypadku zapytań wykorzystujących ten indeks, gwarantuje to kolejność, a jednocześnie gwarantuje, że nie będzie dodatkowych obliczeń sortowania, aby to osiągnąć, na przykład:
> 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.
jeśli INDEKS Używa już słowa kluczowego DESC
, to jego znaczenie zostanie odwrócone (anulowane), jeśli klauzula ORDER BY
używa równieżDESC
, na przykład:
porządkowanie wierszy w instrukcjach DML
podczas używania ORDER BY
z poleceniem DML INSERT
,UPSERT
, UPDATE
lubDELETE
(tj., Instrukcja DML), klauzula ORDER BY
jest używana, jeśli nie jest używana w połączeniu z LIMIT
i/lubOFFSET
.
kombinacja obu ORDER BY
i LIMIT
/OFFSET
określa, które wiersze wejścia są używane do wstawiania, aktualizowania lub usuwania tabledata, ale nie określa, w jakiej kolejności mutacja zajmuje miejsce.
na przykład, używając LIMIT
w 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.
powodem, dla którego ORDER BY
nie kontroluje końcowej kolejności wierszy w tabeli jest to, że kolejność wierszy w tabeli docelowej jest określona przez jej indeksy pierwotne i wtórne.
aby zamówić wynik klauzuli RETURNING
, zobacz sortowanie wyniku usuwania.
sortowanie wyniku usuwania
aby posortować wynik instrukcji DELETE
, użyj:
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
na przykład zobacz sortowanie i zwracanie usuniętych wierszy.
Zobacz też
- zapytania wyboru
- wyrażenia skalarne
INSERT
UPSERT
DELETE
UPDATE
czy ta strona była pomocna?
Tak Nie