MySQL: レコードを昇順・降順にソートして出力 – ORDER BY句

前回はUPDATE文とDELETE文を扱いました。今回は下記のレコードを含むテーブルに対して、SELECT文のORDER BY句を用いて任意のレコードをソートして出力する例を示します。

mysql> SELECT * FROM book_list_auto;
+----+------------------------------------+---------+-------+------------+
| id | title                              | author  | price | date       |
+----+------------------------------------+---------+-------+------------+
|  1 | eu,                                | Brody   | 2330  | 2004-06-09 |
|  2 | rutrum. Fusce dolor quam,          | James   | 2150  | 2006-02-25 |
|  3 | ultrices sit amet, risus.          | Wang    | 2495  | 2009-11-12 |
|  4 | placerat, augue. Sed molestie.     | Lev     | 2752  | 2005-05-02 |
|  5 | Proin mi.                          | Dante   | 1155  | 2004-07-23 |
|  6 | sed,                               | Porter  | 4566  | 2006-05-14 |
|  7 | onec sollicitudin adipiscing       | Sader   | 2503  | 2004-04-28 |
|  8 | tortor. Integer aliquam adipiscing | Desiree | 2810  | 2002-08-24 |
|  9 | Mauris eu                          | Maggy   | 3843  | 2001-04-21 |
| 10 | eget metus. In nec orci.           | Rhea    | 4820  | 2002-11-05 |
+----+------------------------------------+---------+-------+------------+

ランダムに生成した10レコード(ブックリスト)を使います。
まず、値段の安い順、すなわちpriceフィールドを昇順で出力するSQL文は下のようになります。

mysql> SELECT title, price
    -> FROM book_list_auto
    -> ORDER BY price;
+------------------------------------+-------+
| title                              | price |
+------------------------------------+-------+
| Proin mi.                          | 1155  |
| rutrum. Fusce dolor quam,          | 2150  |
| eu,                                | 2330  |
| ultrices sit amet, risus.          | 2495  |
| onec sollicitudin adipiscing       | 2503  |
| placerat, augue. Sed molestie.     | 2752  |
| tortor. Integer aliquam adipiscing | 2810  |
| Mauris eu                          | 3843  |
| sed,                               | 4566  |
| eget metus. In nec orci.           | 4820  |
+------------------------------------+-------+

<SELECT文の前半(FROM, WHERE句など)>
ORDER BY <列名1> [, <列名2>, …]

ORDER BYの後ろにフィールド名を指定することで、そのフィールド基準にソートしたレコードを返します。デフォルトでは昇順(ascending)ソートでそれを明示的に示す場合は、ASCキーワードをフィールド名の後ろに付け足します。上の例では、最終行をORDER BY price ASC;しても結果は同じです。
対して、あるフィールドを降順(descending)にソートする場合はフィールド名の後ろにDESCキーワードを付け足します。以下の例で確認してみましょう。

mysql> SELECT title, price
    -> FROM book_list_auto
    -> ORDER BY price DESC
    -> LIMIT 3;
+--------------------------+-------+
| title                    | price |
+--------------------------+-------+
| eget metus. In nec orci. | 4820  |
| sed,                     | 4566  |
| Mauris eu                | 3843  |
+--------------------------+-------+

確かに、降順、ここで例では値段の高い順にソートされていますね。

LIMIT句で表示行数を指定

さて、ここで使われているLIMIT句は出力する行数を指定することが出来ます。上の例では

LIMIT <表示行数>

より3行(値段の高い本ベスト3)を表示しています。LIMIT句には他にも、

LIMIT <表示開始インデックス>,<表示行数>

という書き方があり、以下のSQL文は上と同じ結果を出力します。ちなみにインデックスは0から数え始めます。

mysql> SELECT title, price
    -> FROM book_list_auto
    -> ORDER BY price DESC
    -> LIMIT 0, 3;

最後に、ORDER BY句では複数のフィールドを指定できますが、その際のソートの適応順序は指定した順(書いた順)になります。次の例で確認してみましょう。

mysql> SELECT title, author, date
    -> FROM book_list_auto
    -> ORDER BY date DESC, author ASC
    -> LIMIT 5;
+--------------------------------+--------+------------+
| title                          | author | date       |
+--------------------------------+--------+------------+
| ultrices sit amet, risus.      | Wang   | 2009-11-12 |
| sed,                           | Porter | 2006-05-14 |
| rutrum. Fusce dolor quam,      | James  | 2006-02-25 |
| placerat, augue. Sed molestie. | Lev    | 2005-05-02 |
| Proin mi.                      | Dante  | 2004-07-23 |
+--------------------------------+--------+------------+

上の例では、dateフィールドでソートして、その中で同じ値があった場合はauthorをソートして順序を決めています。うーん、このレコード集ではちょっと分かり難いですね。

リファレンス

コメント

  1. links for 2009-09-11 | ウェブル より:

    […] MySQL: レコードを昇順・降順にソートして出力 – ORDER BY句 – Yukun's Blog (tags: MySQL) […]

  2. mysql — Azucarala Blog より:

    […] レコードを昇順・降順にソートして出力 – ORDER BY句 […]