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
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ě:
- název štítku sloupce nakonfigurovaného s
ASdříve v klauzuliSELECT. To používá hodnotu vypočtenou klauzulíSELECTjako třídící klíč. - kladné celé číslo, označující jeden ze sloupců ve zdroji dat, buď klauzuli
FROMklauzuleSELECT, kde se to stane, nebo tabulku zapsanou doDELETEneboUPDATE. To používá odpovídající vstupní hodnotu ze zdroje dat pro použití jako třídící klíč. - libovolný skalární výraz. To používá výsledek vyhodnocení tohoto výrazu jako třídícího klíče.
- název štítku sloupce nakonfigurovaného s
- 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.
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.
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ě:
> 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:
- uspořádání operandu klauzule
WITH ORDINALITY(v rámciFROMoperandu klauzuleSELECT) je zachováno, pro řízení číslování řádků. - je zachováno uspořádání operandu samostatného
LIMITneboOFFSETklauzule (sFROMoperandu klauzuleSELECT), aby bylo možné určit, které řádky jsou ve výsledku zachovány. - je zachováno uspořádání zdroje dat pro příkaz
INSERTnebo příkazUPSERT, který také používáLIMIT, aby se určilo, které řádky jsou zpracovány, ale ne jejich pořadí. - pořadí uvedené pro příkaz
UPDATEneboDELETE, 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.) - uspořádání dílčího dotazu použitého v skalárním výrazuje zachován.
například 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.
například použití samostatné klauzule LIMIT v FROM:
například pomocí sub-dotazu ve skalárním kontextu:
ř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:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
následující příkazy jsou ekvivalentní:
+---------+| 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:
je také možné třídit pomocí libovolného skalárního výrazu vypočítaného pro každý řádek, například:
> 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:
> 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:
> 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:
> 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:
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:
> 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:
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:
> 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:
> 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
INSERTUPSERTDELETEUPDATE
byla tato stránka užitečná?
Ano
Ne