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
AS
dříve v klauzuliSELECT
. To používá hodnotu vypočtenou klauzulíSELECT
jako třídící klíč. - kladné celé číslo, označující jeden ze sloupců ve zdroji dat, buď klauzuli
FROM
klauzuleSELECT
, kde se to stane, nebo tabulku zapsanou doDELETE
neboUPDATE
. 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ámciFROM
operandu klauzuleSELECT
) je zachováno, pro řízení číslování řádků. - je zachováno uspořádání operandu samostatného
LIMIT
neboOFFSET
klauzule (sFROM
operandu 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
INSERT
nebo 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
UPDATE
neboDELETE
, 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
INSERT
UPSERT
DELETE
UPDATE
byla tato stránka užitečná?
Ano Ne