21

MySQL で質問がありましたが、正しく答えました。しかし、本のコードは少し異なります。

本:

use tennis;
select playerno, datediff(coalesce(end_date, current_date), 
begin_date) as Difference, position
from committee_members
where datediff(coalesce(end_date, current_date), begin_date) > 500
order by 1;

この 1 による順序は何ですか?

私のコードも機能し、次の点を除いてほぼ同じです。

select playerno, datediff(coalesce(end_date, current_date) AS Data,
order by Data;
4

2 に答える 2

35

order by 1は、「選択した最初のフィールドで並べる」という意味です。つまり、この場合は、 がリストの最初のフィールドであるorder by playernoため、 と同じです。playerno

公式の文言が必要な場合は、SQL-92 標準1の内容を次に示します。

10)If ORDER BY is specified, then each <sort specification> in the
        <order by clause> shall identify a column of T.

        Case:

        a) If a <sort specification> contains a <column name>, then T
          shall contain exactly one column with that <column name> and
          the <sort specification> identifies that column.

        b) If a <sort specification> contains an <unsigned integer>,
          then the <unsigned integer> shall be greater than 0 and not
          greater than the degree of T. The <sort specification> iden-
          tifies the column of T with the ordinal position specified by
          the <unsigned integer>.

この場合、bが当てはまりそうです。

ただし、SQL 標準の最近のバージョンではこの機能が削除されているため、通常、新しいコードではこれを避ける必要があります。SQL ベースのデータベース サーバーでは、しばらく前から非推奨になっていますが、ほとんどの場合、下位互換性のために引き続きサポートされています。同時に、彼らがそれを廃止したという事実は、彼らがもはやそれを本当にサポートする必要がある機能とは考えていないことを示しているので、それ以上の警告なしにいつでも削除される可能性があります (例えば、その部分にバグが見つかった場合)バグを修正する最善の方法は、その機能を無効にすることであると判断する可能性があります)。


1. この見積もりは、承認された標準ではなく、自由に利用できるドラフトからのものです。このドラフトと標準の最終テキストの間に少なくともいくつかの変更があると確信していますが (標準の 1 つのバージョンと別のバージョンの間は言うまでもありません)、この基本的な何かがドラフトと最終版の間で変更される可能性は低いと思われます。標準。
于 2012-07-05T23:04:22.760 に答える
7

これは「ORDER BY 序数」と呼ばれ、基本的にその位置の列で並べ替えます。Order by 1 は、最初に選択された列による順序を意味します。あなたの例では、それは言うのと同じですORDER BY playerno

ただし、参照している列が明確ではなく、列の順序が変更された場合、クエリは異なる結果を返すため、この方法はお勧めしません。

その他のリソース:

クイック ヒント: 1 つの説明で注文する

蹴る悪い習慣 : ORDER BY 序数

SQL: 並べ替え

于 2012-07-05T23:12:45.467 に答える