SQLでデータ(レコード)を取得する際には、SELECTステートメントを使用します。
本ブログでも以前に以下の記事でSELECTステートメントを使用したデータの取得についてご紹介しました。
上記の記事では、データを取得する際に特にデータの並び順について指定していませんが、データを一覧で表示する場合など、複数のデータを取得する際にはデータの並び順を指定したい場合があります。
例えば、IDと名称を取得する場合にIDの小さい順に並べて取得したい場合や、名前の五十音順で取得したい場合などです。
そこで今回は、SELECTステートメントを使用してデータを取得する際に、特定の列のデータ(値)をもとに並べ替えを行う方法について紹介します。
目次
データの取得に使用するサンプルテーブル
本記事では、データを取得するためのサンプルテーブルとして、以下のテーブルを使用します。
テーブル定義
サンプルテーブルは、顧客情報を管理するための「顧客」テーブルと、売上情報を管理するための「売上」テーブルを作成します。
顧客テーブルには、顧客情報を一意に判別するための主キー(プライマリーキー)となる「顧客ID」、氏名を管理するための「顧客名」、顧客の連絡先の「電話番号」の3つの列を作成します。
列名 | データ型 | 主キー |
---|---|---|
顧客ID | int | ○ |
顧客名 | nvarchar(50) | |
電話番号 | varchar(20) |
売上テーブルには、売上情報の主キーとなる「売上ID」、どの顧客に対する売上かを示す「顧客ID」、売上額を登録する「金額」の3つの列を作成します。
列名 | データ型 | 主キー |
---|---|---|
売上ID | int | ○ |
顧客ID | int | |
金額 | decimal(10, 0) |
テーブルを作成するCREATE文のSQL
顧客テーブルを作成するSQLは次のようになります。
1 2 3 4 5 6 |
CREATE TABLE [顧客] ( [顧客ID] int NOT NULL PRIMARY KEY, [顧客名] nvarchar(50) NOT NULL, [電話番号] varchar(20) NULL ); |
売上テーブル作成するSQLは次のようになります。
1 2 3 4 5 6 |
CREATE TABLE [売上] ( [売上ID] int NOT NULL PRIMARY KEY, [顧客ID] int NOT NULL, [金額] decimal(10, 0) NOT NULL ); |
テーブルにレコードを挿入するINSERT文のSQL
顧客テーブルにはサンプルデータとして以下のレコードを挿入します。
1 2 3 4 5 6 7 8 9 |
INSERT INTO [顧客] ([顧客ID], [顧客名], [電話番号]) VALUES (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'); |
売上テーブルにはサンプルデータとして以下のレコードを挿入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
INSERT INTO [売上] ([売上ID], [顧客ID], [金額]) VALUES (1, 2, 10000), (2, 5, 5000), (3, 4, 3500), (4, 3, 15000), (5, 2, 8000), (6, 1, 12000), (7, 5, 7000), (8, 1, 6500), (9, 2, 7000), (10, 3, 8500), (11, 5, 9000), (12, 1, 2500); |
顧客テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括で挿入する方法については、以下の記事を参照してください。
並び順を指定する「ORDER BY」
SELECTステートメントで取得するデータの並び順(ソート順)を指定する際は、「ORDER BY」というキーワードを使用します。
ORDER BYは、SELECTステートメントの一番最後に記述します。
ORDER BYを指定したデータの取得例
ここでは、SELECTステートメントを使用して顧客テーブルからデータを取得する例を示します。
顧客IDの昇順にデータを取得する
顧客テーブルのデータを顧客IDの昇順(小さいもの順)に取得するSQLは以下のようになります。
1 2 3 4 5 6 7 8 |
SELECT [顧客ID], [顧客名], [電話番号] FROM [顧客] ORDER BY [顧客ID]; |
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の昇順にデータを取得しましたが、今度は降順(大きいもの順)にデータを取得します。
1 2 3 4 5 6 7 8 |
SELECT [顧客ID], [顧客名], [電話番号] FROM [顧客] ORDER BY [顧客ID] DESC; |
データを昇順に取得する場合は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」キーワードを指定します。
1 2 3 4 5 6 7 8 |
SELECT [顧客ID], [顧客名], [電話番号] FROM [顧客] ORDER BY [顧客ID] 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ごとにグループ化して金額の合計を取得します。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT [顧客ID], SUM([金額]) AS [売上金額合計] FROM [売上] WHERE [金額] > 5000 GROUP BY [顧客ID] ORDER BY SUM([金額]) DESC; |
上記の例ではORDER BY句にSUM関数を結果を指定しています。
このように、ORDER BY句には列名だけではなく、関数や式の結果を指定することもできます。
顧客ID | 売上金額合計 |
---|---|
2 | 25000 |
3 | 23500 |
1 | 18500 |
5 | 16000 |