SQLのorder by についてまとめています。
order byはselect文で抽出したレコードを、指定したキーに従った昇順または降順にソートします。
SQL order byの構文
以下は、employees(社員)テーブルをbirth_date(誕生日)でソートする例です。
mysql> select * from employees order by birth_date limit 10; +--------+------------+------------+--------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+--------------+--------+------------+ | 207658 | 1952-02-01 | Kiyokazu | Whitcomb | M | 1988-07-26 | | 87461 | 1952-02-01 | Moni | Decaestecker | M | 1986-10-06 | | 65308 | 1952-02-01 | Jouni | Pocchiola | M | 1985-03-10 | | 406121 | 1952-02-01 | Supot | Remmele | M | 1989-01-27 | | 91374 | 1952-02-01 | Eishiro | Kuzuoka | M | 1992-02-12 | | 237571 | 1952-02-01 | Ronghao | Schaad | M | 1988-07-10 | | 33131 | 1952-02-02 | Reinhold | Savasere | M | 1998-01-30 | | 51486 | 1952-02-02 | Jianwen | Sigstam | F | 1989-07-20 | | 61382 | 1952-02-02 | Kristof | Ranft | M | 1989-04-21 | | 59884 | 1952-02-02 | Fan | Przulj | M | 1991-09-25 | +--------+------------+------------+--------------+--------+------------+ 10 rows in set (0.13 sec)
また、desc指定で降順、asc指定で昇順ソートになります。無指定だとデフォルトで、昇順ソートになります。
mysql> select * from employees order by birth_date asc limit 10; +--------+------------+------------+--------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+--------------+--------+------------+ | 207658 | 1952-02-01 | Kiyokazu | Whitcomb | M | 1988-07-26 | | 87461 | 1952-02-01 | Moni | Decaestecker | M | 1986-10-06 | | 65308 | 1952-02-01 | Jouni | Pocchiola | M | 1985-03-10 | | 406121 | 1952-02-01 | Supot | Remmele | M | 1989-01-27 | | 91374 | 1952-02-01 | Eishiro | Kuzuoka | M | 1992-02-12 | : : mysql> select * from employees order by birth_date desc limit 10; +--------+------------+------------+-----------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------------+--------+------------+ | 500000 | 1970-01-04 | TARO | Yamada | M | 2001-04-07 | | 60091 | 1965-02-01 | Surveyors | Bade | F | 1988-05-01 | | 66702 | 1965-02-01 | Deniz | Thibadeau | F | 1986-03-11 | | 33293 | 1965-02-01 | Adamantios | Vanwelkenhuysen | M | 1987-12-12 | | 59869 | 1965-02-01 | Zsolt | Riefers | M | 1987-09-25 | : :
【関連記事】
▶SQLで昇順・降順でデータをソート!SQLの並び替えをマスターする |
SQLのorder byで、抽出条件が異なる複数のselect文をソート
order byとサブクエリ、union allを組み合わせて、条件が異なるselect文の結果をorder byでソートすることができます。
select * from (select emp_no, first_name, last_name, hire_date from employees where birth_date > 1970-01-01 and gender = 'F' union all select emp_no, first_name, last_name, hire_date from employees where birth_date < 1960-01-01 and gender = 'M' ) t1 order by last_name, emp_no limit 100; +--------+------------+-----------+------------+ | emp_no | first_name | last_name | hire_date | +--------+------------+-----------+------------+ | 12516 | Sreenivas | Aamodt | 1990-03-06 | | 12982 | Sachem | Aamodt | 1992-01-11 | | 17400 | Basim | Aamodt | 1991-09-15 | | 18182 | Dekang | Aamodt | 1988-05-25 | | 27188 | Vasilii | Aamodt | 1996-10-12 | | 27413 | Phuoc | Aamodt | 1987-08-28 | | 28387 | Nahla | Aamodt | 1997-02-15 | | 29182 | Arumugam | Aamodt | 1986-01-09 | : :
【関連記事】
▶SQLのorder byで複数条件を指定する union allとサブクエリで複雑な条件にも対応 |
Oracleのorder byの構文
ORDER BY <Attr|Exp> [ASC|DESC] [,<Attr|Exp> [ASC|DESC]]*
以下は、Oracleでの実行例です。employee(社員)テーブルから、hire_date(雇用日)の降順にレコードを抽出しています。
SQL> select first_name, last_name, hire_date, salary 2 from employee 3 ORDER BY hire_date DESC; FIRST_NAME LAST_NAME HIRE_DATE SALARY ——————————— ————————————————— ———————————————— ———————— Roger Friedli 16-MAY-07 60000 Betsy James 16-MAY-07 60000 Matthew Michaels 16-MAY-07 70000 Donald Newton 24-SEP-06 80000 Frances Newton 14-SEP-05 75000 Emily Eckhardt 07-JUL-04 100000 6 rows selected.
SQL Serverのorder byの構文
以下は、SQL Serverでのorder byの例です。Production.Productテーブルから、Nameが「Lock Washer」で始まるレコードのProductID(製品ID)を昇順にソートして抽出します。
USE AdventureWorks2012; GO SELECT ProductID, Name FROM Production.Product WHERE Name LIKE 'Lock Washer%' ORDER BY ProductID;
参考)ORDER BY 句 (Transact-SQL) – SQL Server | Microsoft Docs
MySQLのorder byの構文
MySQLでgroup byを指定したときの自動ソートを無効化するには、order by NULLを指定します。insert into ~ selectを使用する際など、ソートを無視したい場合に利用できます。
INSERT INTO foo SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
関連)MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.2.1.15 ORDER BY の最適化
PostgreSQLのorder byの構文
PostgreSQLのorder byの機能拡張は2つあります。一つは、order byに式を指定できる点。
SELECT a, b FROM table1 ORDER BY a + b;
もうひとつは、asでつけた別名をorder byで使用できる点です。
SELECT a AS b FROM table1 ORDER BY a;
上記は、標準SQLではエラーとなります。
まとめ
- order byは抽出結果をソートする。昇順、降順の指定が可能
- 複数のselect文の結果を、union allとサブクエリを使ってソートすることが可能
- 一部のDBMSでは、カラム名だけではなく式や別名でのソート指定が可能