English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL ORDER BY句

このチュートリアルでは、SELECT SQLクエリから返されるデータをソートする方法を学びます。

結果セットのソート

通常、SELECT文を使用してテーブルからデータを取得する場合、結果セットの行には特定の順序がありません。特定の順序で結果セットを並べ替えたい場合は、文の末尾にORDER BY句を指定することができます。この句はプログラムに対してデータのソート方法を指示します。デフォルトのソート順序は昇順です。

文法

ORDER BY句は、クエリから返されるデータを昇順または降順にソートするために使用されます。この句の基本的な文法は以下のように示されます:

SELECT column_list FROM table_name ORDER BY column_name ASC|DESC;

ここでは、column_list値を取得するデータベースのテーブル名前年齢などの列/のフィールド名前、そしてcolumn_nameソートする列の名前です。実際の動作方法を示すいくつかの例を見てみましょう。

データベースにemployeesテーブルに以下のレコードが含まれています:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

単列ソート

以下のSQLステートメントは、以下のemployeesすべてのemployeeを返し、以下にemp_name列の昇順に結果セットをソートします。

SELECT * FROM employees 
ORDER BY emp_name ASC;

ASCオプションを省略して以下の構文を使用することもできます。これは、SQLのデフォルトのソート順が昇順であるため、前のステートメントと同じ結果セットが返されます:

SELECT * FROM employees 
ORDER BY emp_name;

上記のコマンドを実行すると、以下のような出力が得られます:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
+--------+--------------+------------+--------+---------+

同様に、DESCオプションを使用して降順にソートを実行できます。以下のステートメントは、数字の降順でソートします:給与(salary)列の降順に並べ替えた結果セットです。

SELECT * FROM employees 
ORDER BY salary DESC;

この場合、以下のような結果セットが得られます:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
+--------+--------------+------------+--------+---------+

多列ソート

ソート時には、複数の列を指定することもできます。ただし、テーブルに重複値がある場合を除き、結果セットの変更は見られません。それでは、以下を見てみましょう:

多列ソートをよりよく理解するために、データベースに「Traineesのテーブルに以下のレコードが含まれています:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
+----+------------+------------+-------------+--------+

テーブルを詳しく見ると、いくつかの重複値が見つかります。しかし、トレーニングのPeter ParkerとPeter Panは全名が異なるが、名前が同じです。

以下のコマンドを実行すると、以下のようにfirst_name列を結果セットに排序

SELECT * FROM trainees 
ORDER BY first_name;

実行後、以下のような出力が得られます:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
+----+------------+------------+-------------+--------+

このステートメントを実行すると、以下のようにfirst_nameおよびlast_name列を結果セットに排序

SELECT * FROM trainees 
ORDER BY first_name, last_name;
+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
+----+------------+------------+-------------+--------+

以前の結果セットと現在の結果セットの違いに気づきましたか?-この度、受講生「Peter Parker」の記録が「Peter Pan」の次に記録されます。

2人の訓練生の名前が「Peter」であるため、この2人の訓練生のlast_name列が2次ソートを実行します。これが原因で、訓練生「Peter Parker」の記録が「Peter Pan」の後ろにあることになります。

注意:複数の並び替え列を指定した場合、結果セットはまず最初の列でソートされ、その後、ソートされたリストに対して2列目でソートが行われます。その後、順に続きます。