objednání výsledků dotazu

klauzule ORDER BY řídí pořadí, ve kterém jsou řádky vráceny nebo zpracovány. Může být použit v libovolném výběrovém dotazníku, včetně operandu INSERT nebo UPSERT, stejně jako s příkazy DELETE a UPDATE.

Synopse

ORDERBYa_exprASCDESCNULLSFIRSTLAstprimarykeytable_nameindextable_name@index_nameASCDESC,

parametry

klauzule ORDER BY obsahuje čárkami oddělený seznam specifikací objednávání.Každá zadávací SPECIFIKACE se skládá z výběru sloupce následovaného volitelným klíčovým slovem ASC nebo DESC.

každý výběr sloupců může mít jednu z následujících forem:

  • jednoduchý výběr sloupce, stanovený následovně:
    1. název štítku sloupce nakonfigurovaného s AS dříve v klauzuli SELECT. To používá hodnotu vypočtenou klauzulí SELECT jako třídící klíč.
    2. kladné celé číslo, označující jeden ze sloupců ve zdroji dat, buď klauzuli FROM klauzule SELECT, kde se to stane, nebo tabulku zapsanou do DELETE nebo UPDATE. To používá odpovídající vstupní hodnotu ze zdroje dat pro použití jako třídící klíč.
    3. libovolný skalární výraz. To používá výsledek vyhodnocení tohoto výrazu jako třídícího klíče.
  • zápis PRIMARY KEY <table_name>. Toto používá sloupec (y) primárního klíče dané tabulky jako třídící klíč. Tato tabulka musí být součástí zdroje dat.
  • zápis INDEX <table_name>@<index_name>. To používá sloupce indexované daným indexem jako třídící klíč. Tato tabulka musí být součástí zdroje dat.

volitelné Klíčové slovo ASC po výběru sloupce označuje použití třídícího klíče tak, jak je, a proto nemá smysl.

volitelné Klíčové slovo DESC invertuje směr sloupců vybraných výběrem, který bezprostředně předchází.

CockroachDB podporujeNULLS FIRST/NULLS LAST v ORDER BY klauzule pro kompatibilitu se syntaxí řazení řádků PostgreSQL.

Poznámka:

podpora pro NULLS LAST je v současné době pouze syntaxe. Pokud zadáte NULLS LAST v klauzuli ORDER BY, CockroachDB použije NULLS FIRST a nevrátí chybu.

zachování objednávky

obecně není zaručeno pořadí průběžných výsledků dotazu, i když je zadáno ORDER BY. Jinými slovy, klauzule ORDER BY je pouzeefektivní na nejvyšší úrovni. Například je ignorován queryplannerem, pokud je přítomen v dílčím dotazu v klauzuli FROM následovně:

ikona / tlačítka / Kopírovat
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective

při kombinování dotazů spolu s sub-dotazy však některé kombinace vytvoří klauzuli ORDER BY v sub-querysignificant:

  1. uspořádání operandu klauzule WITH ORDINALITY (v rámci FROM operandu klauzule SELECT) je zachováno, pro řízení číslování řádků.
  2. je zachováno uspořádání operandu samostatného LIMIT nebo OFFSET klauzule (s FROM operandu klauzule SELECT), aby bylo možné určit, které řádky jsou ve výsledku zachovány.
  3. je zachováno uspořádání zdroje dat pro příkaz INSERTnebo příkaz UPSERT, který také používáLIMIT, aby se určilo, které řádky jsou zpracovány, ale ne jejich pořadí.
  4. pořadí uvedené pro příkaz UPDATE nebo DELETE, který také používá LIMIT, se používá k určeníkteré řádky jsou zpracovány, ale ne jejich pořadí.(Jedná se o rozšíření CockroachDB.)
  5. uspořádání dílčího dotazu použitého v skalárním výrazuje zachován.

například pomocí WITH ORDINALITY:

ikona / tlačítka / Kopírovat
> SELECT * FROM (SELECT * FROM a ORDER BY a.x) WITH ORDINALITY; -- ensures that the rows are numbered in the order of column a.x.

například použití samostatné klauzule LIMIT v FROM:

icon / buttons / copy

například pomocí sub-dotazu ve skalárním kontextu:

icon / buttons / copy

řazení řádků bez pořadí

bez ORDER BY jsou řádky zpracovány nebo vráceny v anon-deterministickém pořadí. „Nedeterministický“ znamená, že skutečná objednávkamůže záviset na logickém plánu, pořadí dat na disku, topologiiklustru CockroachDB a je obecně proměnlivá v průběhu času.

třídění pomocí jednoduchých výběrů sloupců

s ohledem na následující tabulku:

ikona / tlačítka / kopie
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);

následující příkazy jsou ekvivalentní:

icon / buttons / copy
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)

Všimněte si, že na pořadí pravidel záleží. Pokud existuje nejednoznačnost, AS aliasmít přednost před sloupci zdroje dat, například:

ikona / tlačítka / Kopírovat

je také možné třídit pomocí libovolného skalárního výrazu vypočítaného pro každý řádek, například:

ikona / tlačítka / Kopírovat
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.

řazení pomocí více sloupců

je-li zadáno více specifikací pro objednání, použijí se pozdější specifikace pro objednání řádků, které jsou stejné oproti dřívějším specifikacím, například:

icon / buttons/copy
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;

to třídí výsledky podle sloupce b, a pak, pokud existuje multiplerows, které mají stejnou hodnotu ve sloupci b, bude pak pořadí theserows podle sloupce a.

převrácením pořadí řazení

Klíčové slovo DESC („descending“) může být přidáno po specifikaci objednávky, aby bylo možné změnit jeho pořadí. To lze specifikovat samostatně pro každou specifikaci, například:

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.

řazení v pořadí primárního klíče

notace ORDER BY PRIMARY KEY zaručuje, že výsledky jsou uvedeny v pořadí primárního klíče.

zvláštní výhodou je, že pro dotazy používající primární index to zaručuje objednávku a zároveň zaručuje, že k jejímu dosažení nebude existovat další výpočet třídění, například:

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.

pokud primární klíč již používá klíčové slovo DESC, pak jeho význambude převrácen (zrušen), pokud klauzule ORDER BY také používáDESC, například:

icon / buttons / copy

třídění v pořadí indexů

ORDER BY INDEX notace zaručuje, že výsledky jsou prezentoványv pořadí daného indexu.

zvláštní výhodou je, že pro dotazy používající tento index, thisguarantees pořadí a zároveň zaručit, že nebude anaddational třídění výpočet k dosažení tohoto cíle, například:

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.

pokud index již používá klíčové slovo DESC, pak jeho význambude převrácen (zrušen), pokud klauzule ORDER BY také používáDESC, například:

icon / buttons / copy

objednávání řádků v příkazech DML

při použití ORDER BY s příkazem INSERT,UPSERT, UPDATE neboDELETE (tj. DML), klauzule ORDER BY je označena, pokud není použita v kombinaci s LIMIT a / neboOFFSET.

kombinace obou ORDER BY a LIMIT / OFFSET určuje, které řádky vstupu slouží k vložení, aktualizaci nebo odstranění tabledata, ale neurčuje, v jakém pořadí mutace trvá.

například pomocí LIMIT v INSERT:

ikona / tlačítka / Kopírovat
> 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.

důvod, proč ORDER BY nekontroluje konečné pořadí řádků v tabulce, je ten, že pořadí řádků v cílové tabulce je určeno primárními a sekundárními indexy.

Chcete-li objednat výsledek klauzule RETURNING, podívejte se na třídění outputof males.

třídění výstupu odstraní

Chcete-li seřadit výstup příkazu DELETE, použijte:

icon / buttons/copy
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...

například viz třídit a vracet smazané řádky.

Viz také

  • výběrové dotazy
  • skalární výrazy
  • INSERT
  • UPSERT
  • DELETE
  • UPDATE

byla tato stránka užitečná?

Ano Ne

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.