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
句(FROM
SELECT
句のオペランド付き)のオペランドの順序は、結果に行が保持されるかどうかを決定するために保持されます。 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)
ルールの順序が重要であることに注意してください。 あいまいさがある場合、AS
aliasestakeはデータソース列よりも優先されます。
各行に対して計算された任意のスカラー式を使用してソートすることもできます。:
> 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 ...
例については、”削除された行を並べ替えて返す”を参照してください。
も参照してください
- 選択クエリ
- スカラー式
INSERT
UPSERT
DELETE
UPDATE
このページは役に立ちましたか?
はいいいえ