English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、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列目でソートが行われます。その後、順に続きます。