2013-03-26 15 views
16

prod_priceprod_nameという2つの列で商品表を並べ替えるとします。SQL ORDER BY複数の列

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_price, prod_name; 

ここでソートはどのように行われますか?私はそれが最初にprod_priceによって起こり、次にprod_nameによって起こると思います。また、どのようにこの1と異なる上記のクエリは、次のように

SELECT prod_id, prod_price, prod_name 
FROM Products 
ORDER BY prod_name; 

マイproductsテーブルがある:

CREATE TABLE Products 
(
    prod_id char(10)  NOT NULL , 
    vend_id char(10)  NOT NULL , 
    prod_name char(255)  NOT NULL , 
    prod_price decimal(8,2) NOT NULL , 
    prod_desc text   NULL 
); 

答えて

29

ORDER BYでのソートは、最初の列で、指定されたステートメント内の各追加列によって行われます。

は例えば、以下のデータを考慮してください。

Column1 Column2 
======= ======= 
1   Smith 
2   Jones 
1   Anderson 
3   Andrews 

クエリを

SELECT Column1, Column2 FROM thedata ORDER BY Column1, Column2 

だろう最初のソートColumn1

のすべての値によって、その後にColumn2して列を並べ替えます

Column1 Column2 
======= ======= 
1   Anderson 
1   Smith 
2   Jones 
3   Andrews 

つまり、データは最初にColumn1の順序でソートされ、次に各サブセット(Column1の値として1を持つ行)が2番目の列の順にソートされます。

あなたが投稿した2つのステートメントの違いは、最初の行の行が最初にprod_price(価格順、最低から最高)、次に名前の順番でソートされるということです。同じ価格、名前のアルファ値の低いものが最初に表示されます)、2番目のものは名前順のみで並べ替えられます(価格は価格に関係なくprod_nameに基づいて順番に表示されます)。

+0

楽しいだけでなく、面白​​いのですが、ウィンドウ構文をサポートするDBMSのデータを並べ替えるもう1つの方法があります: 'select *、count(*)over(Column1、Column2順) – Abelisto

0

はい、ソートが異なっています。

ORDER BYの項目は、順番に適用されます。
後の項目は、前の手順で残った同輩のみを注文します。

なぜあなたはを試してみてくださいを試してみませんか?

+0

私はprod_price列が同じ値を持っていれば、prod_nameでソートすることができます。そうでなければ、prod_nameでソートされます。私が正しいかどうかを教えてください – user2201462

+0

@ user2201462:それは* peer *という言葉の意味です。これらの行は、特定の「ORDER BY」項目に関してすべて同じです。それらのみが次の項目の対象となります。 –

1

データベースのサイズによって異なります。

SQLは、SET理論に基づいています。テーブルをクエリするときに本質的に使用される順序はありません。

最初のクエリを実行すると、最初に商品価格と商品名で注文されます。たとえば、価格カテゴリに重複があるとしたら、例えば20ドルとします。したがって、常にクエリを実行すると、同じ順序で同じ結果セットが返されます。

2番目のクエリを実行した場合、その名前でのみ注文するので、同じ名前の商品が2つあった場合(奇妙な理由で)、クエリ。

5

結果は、ORDER BY句と同数の列に対して、最初の列、次に2番目の列などの順序で並べられます。結果が降順でソートされるようにするには、ORDER BY句で、関連する列の名前または番号の直後にDESCキーワードを使用する必要があります。

それが連続して注文します

SELECT first_name, last_name, hire_date, salary 
FROM employee 
ORDER BY hire_date DESC,last_name ASC; 

この例をチェックしてください。最初にHire_Dateを注文し、次にHire_DateでLAST_NAMEを注文します。

1

はい、並べ替えの処理が異なります。 最初のシナリオでは、列1に基づいた注文、さらに列1に基づいてcolmun2を並べ替えることによってさらに処理が行われます。 2番目のシナリオでは、列1のみに基づいて完全に注文します...