17

DBAの皆さんへの基本的な簡単な質問。

選択を行うとき、結果が主キーで並べ替えられることが常に保証されていますか、それとも「順序付け」で指定する必要がありますか?

DBとしてOracleを使用しています。

4

6 に答える 6

44

いいえ、「order by」を使用しない場合、注文は一切保証されません。実際、あるクエリから次のクエリへの順序が同じであるとは限りません。SQLはセットベースの方法でデータを処理していることを忘れないでください。さて、あるデータベースの実装または別の実装が特定の方法で順序付けを提供する可能性がありますが、決してそれに依存するべきではありません。

于 2009-05-05T13:29:23.597 に答える
6

選択を行うとき、結果が主キーによって順序付けられることが常に保証されますか?それとも、'order by' で指定する必要がありますか?

いいえ、それは保証されていません。

SELECT  *
FROM    table

ほとんどのTABLE SCAN場合、主キーをまったく使用しないものを使用します。

ヒントを使用できます。

SELECT  /*+ INDEX(pk_index_name) */
        *
FROM    table

ですが、この場合でも順序は保証されません。 を使用するEnterprise Editionと、クエリが並列化される可能性があります。

これは問題です。句のサブクエリでORDER BYは使用できず、次のようなものを書くことはできません。SELECT

SELECT  (
        SELECT  column
        FROM    table
        WHERE   rownum = 1
        ORDER BY
                other_column
        )
FROM    other_table
于 2009-05-05T13:30:44.153 に答える
2

いいえ、ORDER BY を使用しない限り、順序は保証されません。

行がフェッチされる順序は、アクセス方法 (全表スキャン、索引スキャンなど)、表の物理属性、表内の各行の論理位置、およびその他の要因によって異なります。クエリを変更しなくても、これらはすべて変更される可能性があるため、結果セットで一貫した順序を保証するには、ORDER BY が必要です。

于 2009-05-05T13:32:39.877 に答える
1

DBに依存し、インデックス付きフィールドにも依存します。

たとえば、私のテーブル Users では、すべてのユーザーに一意の varchar(20) フィールド - login と主キー - id があります。

また、「Select * from users」は、ログイン順の行セットを返します。

于 2009-05-05T13:31:04.543 に答える
0

特定の順序付けが必要な場合は、ORDER BY を使用して明示的に宣言します。

テーブルに主キーがない場合はどうなりますか?

于 2009-05-05T13:31:50.313 に答える
0

結果を特定の順序で並べたい場合は、常に順序を指定してください

于 2009-05-05T13:31:50.487 に答える