zamawianie wyników zapytań

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 DELETEi UPDATE.

ORDERBYa_exprASCDESCNULLSFIRSTLAstprimarykeytable_nameindextable_name@index_nameASCDESC,

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:
    1. nazwa etykiety kolumny skonfigurowanej z AS wcześniej w klauzuli SELECT. Używa to wartości obliczonej przez klauzulę SELECT jako klucza sortowania.
    2. dodatnia liczba całkowita, wyznaczająca jedną z kolumn w źródle danych, albo klauzulę FROM klauzuli SELECT, w której się to dzieje, albo tabelę zapisywaną przez DELETElub UPDATE. To używa odpowiedniej wartości wejściowej ze źródła danych do użycia jako klucza sortowania.
    3. Dowolne wyrażenie skalarne. To wykorzystuje wynik oceny tego wyrażenia jako klucz sortowania.
  • 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.

Uwaga:

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:

icon / buttons / copy
> 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:

  1. kolejność operandu klauzuli WITH ORDINALITY(w obrębie operandu FROM klauzuli SELECT) jest zachowana,aby kontrolować numerację wierszy.
  2. kolejność operandu samodzielnej klauzuli LIMIT lub OFFSET (z operandem FROM klauzuli SELECT) jest zachowana, aby określić, które wiersze są przechowywane w wyniku.
  3. kolejność źródła danych dla instrukcji INSERTlub instrukcjiUPSERT, która również używa LIMIT, jest zachowana, aby określić, które wiersze są przetwarzane, ale nie ich kolejność.
  4. kolejność wskazana dla instrukcji UPDATE lub DELETE, która również używa LIMIT, jest używana do określenia, które wiersze są przetwarzane, ale nie ich kolejność.(Jest to rozszerzenie CockroachDB.)
  5. kolejność podzapytania używana w wyrażeniu skalarnym jest zachowana.

na przykład za pomocą WITH ORDINALITY:

icon / buttons / copy
> 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:

icon/buttons/copy

na przykład, używając zapytania podrzędnego w kontekście skalarnym:

icon/buttons / copy

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ę:

icon / buttons / copy
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);

następujące polecenia są równoważne:

icon / buttons / copy
+---------+| 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:

icon / buttons/copy

możliwe jest również sortowanie za pomocą dowolnego wyrażenia skalarnego obliczonego dla każdego wiersza, na przykład:

icon / buttons / copy
> 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:

icon / buttons / copy
> 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 bsą 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:

icon/buttons / copy
> 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:

icon/buttons / copy
> 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:

icon/buttons/copy

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:

icon / buttons / copy
> 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:

icon/buttons/copy

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:

icon / buttons / copy
> 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:

icon / buttons / copy
> 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

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.