サーチ…


コンテキスト

SELECTの句には特定の順序があります。

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ...
    ORDER BY ...  -- goes here
    LIMIT ... OFFSET ...;

( SELECT ... ) UNION ( SELECT ... ) ORDER BY ...  -- for ordering the result of the UNION.

SELECT ... GROUP_CONCAT(DISTINCT x ORDER BY ... SEPARATOR ...) ...

ALTER TABLE ... ORDER BY ... -- probably useful only for MyISAM; not for InnoDB

ベーシック

ORDER BY x

xは任意のデータ型です。

  • NULLsNULLs以外のものに先行します。
  • デフォルトはASC (最も低いものから最も高いもの)
  • 文字COLLATIONVARCHARなど)は、宣言のCOLLATIONに従ってCOLLATIONられます
  • ENUMsは、文字列の宣言順に並べられます。

ASCending / DESCending

ORDER BY x ASC  -- same as default
ORDER BY x DESC  -- highest to lowest
ORDER BY lastname, firstname  -- typical name sorting; using two columns
ORDER BY submit_date DESC  -- latest first
ORDER BY submit_date DESC, id ASC  -- latest first, but fully specifying order.
  • ASC = ASCENDINGDESC = DESCENDING
  • DESC場合でもNULLsが最初に来ます。
  • 上記の例では、 INDEX(x)INDEX(lastname, firstname)INDEX(submit_date)はパフォーマンスを大幅に向上させる可能性があります。

しかし、...最後の例のようにASCDESC混在させることは、複合インデックスを使用して利益を得ることはできません。 INDEX(submit_date DESC, id ASC)助けもありません - " DESC "はINDEX宣言で構文的に認識されますが無視されます。

いくつかのトリック

ORDER BY FIND_IN_SET(card_type, "MASTER-CARD,VISA,DISCOVER") -- sort 'MASTER-CARD' first.
ORDER BY x IS NULL, x  -- order by `x`, but put `NULLs` last.

カスタムオーダー

SELECT * FROM some_table WHERE id IN (118, 17, 113, 23, 72) 
ORDER BY FIELD(id, 118, 17, 113, 23, 72);

指定されたIDの順序で結果を返します。

id ...
118 ...
17 ...
113 ...
23 ...
72 ...

IDがすでにソートされていて、行を取得する必要がある場合に便利です。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow