10

SQL を日常的に使い始めるまで、SQL はめったに使用していませんでした。「order by」句が使用されていない場合:

  1. テーブルの一部を選択すると、返される行は、テーブル全体を選択した場合と同じ順序で表示されます
  2. 結合からの選択によって返される行の順序は、結合の左端のメンバーによって決定されるようです。

この動作は、最も一般的なデータベース (MySql、Oracle、PostgreSQL、Sqlite、Sql Server) で信頼できる標準的なものですか? (本当に sqlite で信頼できるかどうかさえわかりません)。その場合、どの程度厳密に尊重されますか (たとえば、「group by」を使用する場合、個々のグループはそれぞれその順序になります)?

4

5 に答える 5

14

クエリに ORDER BY 句が含まれていない場合、返される行の順序は未定義です。

一部の RDBMS は、ORDER BY 句が省略されている場合でも、状況によっては特定の順序で行を返しますが、そのような動作に依存するべきではありません。

于 2012-05-02T16:53:26.167 に答える
13

SQL-92 仕様のセクション 20.2 <direct select statement: multiple rows>、サブセクション「General Rules」:

4) <order by 句> が指定されていない場合、次の順序付け
   Q の行は実装依存です。
于 2012-05-02T16:53:32.320 に答える
10

注文したい場合は、 を含めてORDER BYください。を含めない場合は、ORDER BYSQL Server に次のように伝えています。

行を返す順序は気にしません。行を返すだけです

気にしないので、SQL Server は、現時点で最も効率的な方法と思われる行を返す方法を決定します(または、この特定のクエリのプランが最後にキャッシュされた時点に従って)。したがって、観察した行動に頼るべきではありません。データの変更、統計の変更、インデックスの変更、サービス パック、累積的な更新、アップグレードなどにより、クエリの実行ごとに変更される可能性があります。

于 2012-05-02T16:56:22.473 に答える
4

PostgreSQL の場合、このORDER BY句を省略すると、データベースが変更されていないときにまったく同じクエリを 100 回実行し、途中で 1 回を他のクエリとは異なる順序で実行できます。実際、各実行は異なる順序になる可能性があります。

これが発生する理由の 1 つは、選択したプランがテーブルのヒープのシーケンシャル スキャンを含み、そのテーブルのヒープの seqscan が処理中の場合、クエリは、他のスキャンが既に行われている時点でスキャンを開始することです。ディスク アクセスの必要性を減らします。

他の回答が指摘しているように、特定の順序でデータが必要な場合は、その順序を指定してください。PostgreSQL は、計画を選択する際に要求された順序を考慮し、その順序でデータを提供するインデックスを使用する場合があります。これが、他の方法で行を取得してから並べ替えるよりも安価であることが判明した場合です。

GROUP BY順序を保証するものではありません。PostgreSQLは、グループ化を行うためにデータをソートするかハッシュ テーブルを使用して、ハッシュ アルゴリズムによって生成された番号順に (つまり、かなりランダムに) 行を返す場合がありますそして、それは実行ごとに変わる可能性があります。

于 2012-05-02T17:40:18.563 に答える
-1

私が DBA だったとき、SQL のこの機能が非常に風変わりであると考えられていたことに驚かされました。テキスト ファイルに対して実行され、何らかの出力を生成する単純なプログラムを考えてみましょう。プログラムが変更されず、データが変更されない場合、出力も変更されないと予想されます。

これに関しては:

クエリに ORDER BY 句が含まれていない場合、返される行の順序は未定義です。

厳密にはそうではありません - 私がこれまで取り組んできたすべての RDBMS (Oracle、Informix、SQL Server、DB2 など) では、一意の値を見つけるには定義による並べ替えが必要になるため、DISTINCT 句には ORDER BY と同じ効果があります。

編集 (2014 年 6 月 2 日):

簡単なテーブルを作成する

ここに画像の説明を入力

DISTINCT と ORDER BY の場合、表向きは同じ操作を実行するため、計画とコストは同じです。

ここに画像の説明を入力

ここに画像の説明を入力

当然のことながら、効果は同じです。

ここに画像の説明を入力

于 2012-05-02T21:10:34.607 に答える