ORDER BY句は、行が返される順序または処理される順序を制御します。 これは、INSERTまたはUPSERTのオペランド、およびDELETEおよびUPDATEステートメントを含む任意のselectionqueryで使用できます。
パラメータ
ORDER BY句は、順序指定のコンマ区切りのリストを取ります。各順序指定は、キーワードASCまたはDESCによって任意に続く列選択で構成されます。
各列の選択には、次のいずれかの形式を使用できます:
-
SELECT句の前のASで構成された列ラベルの名前。 これは、SELECT句によって計算された値をソートキーとして使用します。- 正の整数で、データソース内の列の1つ、
SELECT句のFROM句、またはDELETEまたはUPDATEによって書き込まれているテーブルのいずれかを指定します。 これは、データソースからの対応する入力値を使用して並べ替えキーとして使用します。 - 任意のスカラー式。 これは、その式を評価した結果をソートキーとして使用します。
- 表記は
PRIMARY KEY <table_name>。 これは、指定されたテーブルの主キー列をソートキーとして使用します。 このテーブルはデータソースの一部である必要があります。 - 表記は
INDEX <table_name>@<index_name>。 これは、指定された索引によって索引付けされた列をソートキーとして使用します。 このテーブルはデータソースの一部である必要があります。
列選択後のオプションのキーワードASCは、ソートキーをそのまま使用することを示しているため、意味がありません。
オプションのキーワードDESCは、直前の選択によって選択された列の方向を反転します。
CockroachDBは、PostgreSQLの行ソート構文との互換性のために、NULLS FIRST/NULLS LASTをORDER BY句でサポートしています。
NULLS LASTのサポートは現在構文のみです。 ORDER BY句にNULLS LASTを指定した場合、CockroachDBはNULLS FIRSTを使用し、エラーは返されません。
順序保持
一般に、クエリの中間結果の順序は、ORDER BYが指定されていても保証されません。 言い換えると、ORDER BY句はトップレベルの文でのみ有効です。 たとえば、次のようにFROM句のサブクエリに存在する場合、queryplannerでは無視されます:
> SELECT * FROM a, b ORDER BY a.x; -- valid, effective> SELECT * FROM (SELECT * FROM a ORDER BY a.x), b; -- ignored, ineffective
ただし、クエリをサブクエリと組み合わせると、いくつかの組み合わせでサブクエリのORDER BY句がsignificantになります:
- 行の番号付けを制御するために、
WITH ORDINALITY句のオペランドの順序(SELECT句のオペランドFROM内)が保持されます。 - スタンドアロン
LIMITまたはOFFSET句(FROMSELECT句のオペランド付き)のオペランドの順序は、結果に行が保持されるかどうかを決定するために保持されます。 INSERTステートメントまたはLIMITも使用するUPSERTステートメントのデータソースの順序は保持され、処理される行を決定しますが、その順序は決定しません。UPDATEまたはDELETEステートメントに示されている順序は、LIMITも使用して、行が処理されますが、その順序は決定されません。(これはCockroachDB拡張です。)- スカラー表現で使用されるサブクエリの順序は保持されます。
たとえば、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.
たとえば、スタンドアロンのLIMIT句を使用すると、次のようになりますFROM:
たとえば、スカラコンテキストでサブクエリを使用します。
ORDER BY
ORDER BYを指定しないと、行は非決定的な順序で処理または返されます。 “非決定論的”とは、実際の順序が論理計画、ディスク上のデータの順序、CockroachDBクラスタのトポロジーに依存し、一般に時間の経過とともに変化することを意味します。
単純な列選択を使用した並べ替え
次の表を考慮する:
> CREATE TABLE a(a INT);> INSERT INTO a VALUES (1), (3), (2);
次のステートメントは同等です。
+---------+| a |+---------+| 1 || 2 || 3 |+---------+(3 rows)
ルールの順序が重要であることに注意してください。 あいまいさがある場合、ASaliasestakeはデータソース列よりも優先されます。
各行に対して計算された任意のスカラー式を使用してソートすることもできます。:
> SELECT a, b FROM ab ORDER BY a + b; -- orders by the result of computing a+b.
複数の列を使用したソート
複数の順序指定が指定されている場合、
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b, a;
これにより、結果が列bでソートされ、列bに同じ値を持つ複数のローがある場合は、列aで並べ替えられます。
ソート順の反転
キーワードDESC(“降順”)は、順序指定の後にその順序を変換するために追加することができます。 これは、
> CREATE TABLE ab(a INT, b INT);> SELECT a, b FROM ab ORDER BY b DESC, a; -- sorts on b descending, then a ascending.
主キーの順序でソートする
ORDER BY PRIMARY KEY表記は、結果が主キーの順序で表されることを保証します。
特別な利点は、プライマリインデックスを使用するクエリの場合、これは順序を保証しながら、それを達成するための追加のソート計算がないことを保
> CREATE TABLE kv(k INT PRIMARY KEY, v INT);> SELECT k, v FROM kv ORDER BY PRIMARY KEY kv; -- guarantees ordering by column k.
主キーがキーワードDESCをすでに使用している場合、ORDER BY句もDESCを使用している場合、その意味は反転されます(キャンセルされます)。
インデックス順でソート
ORDER BY INDEX表記は、結果が指定されたインデックスの順序で表示されることを保証します。
特に利点は、そのインデックスを使用するクエリでは、順序を保証しながら、それを達成するための追加のソート計算がないことを保証することです。
> 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.
インデックスがキーワードDESCをすでに使用している場合、ORDER BY句でDESCも使用している場合、
DMLステートメントの行の順序付け
とORDER BYを使用している場合INSERT,UPSERT, UPDATE またはDELETE( 2820>句がLIMITおよび/またはOFFSETと組み合わせて使用されていない場合、ORDER BY句は無視されます。
ORDER BYとLIMIT/OFFSETの両方の組み合わせは、入力の行がtabledataの挿入、更新、または削除に使用されるかを決定しますが、突然変異がどの順序で行われるかは決定しません。
たとえば、LIMITを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.
ORDER BYがテーブル内の行の最終的な順序を制御しない理由は、ターゲットテーブル内の行の順序がプライマリインデックスとセカンダリインデックスによっ
RETURNING句の結果を並べ替えるには、outputof削除の並べ替えを参照してください。
削除の出力の並べ替え
DELETEステートメントの出力を並べ替えるには、次のように使用します。
> WITH a AS (DELETE ... RETURNING ...) SELECT ... FROM a ORDER BY ...
例については、”削除された行を並べ替えて返す”を参照してください。
も参照してください
- 選択クエリ
- スカラー式
INSERTUPSERTDELETEUPDATE
このページは役に立ちましたか?
はい
いいえ