SQLのSELECT文でレコードを取得する順番を指定して検索(抽出)する ORDER BY

SQLでデータ(レコード)を取得する際には、SELECTステートメントを使用します。
本ブログでも以前に以下の記事でSELECTステートメントを使用したデータの取得についてご紹介しました。

SQLのSELECT文でデータ(レコード)を取得(抽出)する
SQLを使用すると、データベースに対して様々な命令を与えることができます。データ(レコード)を抽出したり、データを追加・変更・削除したり、デ...

上記の記事では、データを取得する際に特にデータの並び順について指定していませんが、データを一覧で表示する場合など、複数のデータを取得する際にはデータの並び順を指定したい場合があります。
例えば、IDと名称を取得する場合にIDの小さい順に並べて取得したい場合や、名前の五十音順で取得したい場合などです。

そこで今回は、SELECTステートメントを使用してデータを取得する際に、特定の列のデータ(値)をもとに並べ替えを行う方法について紹介します。

データの取得に使用するサンプルテーブル

本記事では、データを取得するためのサンプルテーブルとして、以下のテーブルを使用します。

テーブル定義

サンプルテーブルは、顧客情報を管理するための「顧客」テーブルと、売上情報を管理するための「売上」テーブルを作成します。

顧客テーブルには、顧客情報を一意に判別するための主キー(プライマリーキー)となる「顧客ID」、氏名を管理するための「顧客名」、顧客の連絡先の「電話番号」の3つの列を作成します。

列名 データ型 主キー
顧客ID int
顧客名 nvarchar(50)
電話番号 varchar(20)

売上テーブルには、売上情報の主キーとなる「売上ID」、どの顧客に対する売上かを示す「顧客ID」、売上額を登録する「金額」の3つの列を作成します。

列名 データ型 主キー
売上ID int
顧客ID int
金額 decimal(10, 0)

テーブルを作成するCREATE文のSQL

顧客テーブルを作成するSQLは次のようになります。

売上テーブル作成するSQLは次のようになります。

テーブルにレコードを挿入するINSERT文のSQL

顧客テーブルにはサンプルデータとして以下のレコードを挿入します。

売上テーブルにはサンプルデータとして以下のレコードを挿入します。

顧客テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードをINSERT文使用して追加するには、通常は以下のように記述します。 ...

並び順を指定する「ORDER BY」

SELECTステートメントで取得するデータの並び順(ソート順)を指定する際は、「ORDER BY」というキーワードを使用します。

ORDER BYは、SELECTステートメントの一番最後に記述します。

ORDER BYを指定したデータの取得例

ここでは、SELECTステートメントを使用して顧客テーブルからデータを取得する例を示します。

顧客IDの昇順にデータを取得する

顧客テーブルのデータを顧客IDの昇順(小さいもの順)に取得するSQLは以下のようになります。

ORDER BY句を使用したデータの並べ替えでは、「ORDER BY」に続けて並べ替えを行う列の名前を指定します。

データの取得結果

顧客ID 顧客名 電話番号
1 顧客1 000-0000-0000
2 顧客2 111-1111-1111
3 顧客3 222-2222-2222
4 顧客4 333-3333-3333
5 顧客5 444-4444-4444
6 顧客6 555-5555-5555

顧客IDの降順にデータを取得する

上記の例では顧客IDの昇順にデータを取得しましたが、今度は降順(大きいもの順)にデータを取得します。

データを昇順に取得する場合はORDER BY句に列名のみ指定していましたが、降順に取得する場合は列名の後に「DESC」というキーワードを付加します。

データの取得結果

顧客ID 顧客名 電話番号
6 顧客6 555-5555-5555
5 顧客5 444-4444-4444
4 顧客4 333-3333-3333
3 顧客3 222-2222-2222
2 顧客2 111-1111-1111
1 顧客1 000-0000-0000

降順にデータを取得する場合は「DESC」キーワードを指定しますが、昇順にデータを取得する場合に指定するキーワードも用意されています。
昇順にデータを取得したい場合は「ASC」キーワードを指定します。

ORDER BY句ではデフォルトの動作が昇順(ASC)になっていますので、省略した場合と同じ結果を得ることができます。

データの取得結果

顧客ID 顧客名 電話番号
1 顧客1 000-0000-0000
2 顧客2 111-1111-1111
3 顧客3 222-2222-2222
4 顧客4 333-3333-3333
5 顧客5 444-4444-4444
6 顧客6 555-5555-5555

WHERE句やGROUP BY句を指定する場合

ORDER BY句はSELECTステートメントの最後に指定しますので、WHERE句やGROUP BY句を指定する場合は、ORDER BY句の前に指定します。

以下にWHERE句とGROUP BY句を指定した場合のSQLの記述例を示します。
ここでは、売上テーブルから金額5000円を超えるレコードのみ対象にして、顧客IDごとにグループ化して金額の合計を取得します。

上記の例ではORDER BY句にSUM関数を結果を指定しています。
このように、ORDER BY句には列名だけではなく、関数や式の結果を指定することもできます。

データの取得結果

顧客ID 売上金額合計
2 25000
3 23500
1 18500
5 16000