前回は、重複行を除外するDISTINCTについて説明しました。今回は、検索結果を並び替える ORDER BY について説明していきます!
データ準備
ORDER BY を試すためにテーブルを作成し、データを追加します。
-- テーブルの作成
CREATE TABLE household_account1 (
id INT PRIMARY KEY,
transaction_date DATE,
expense VARCHAR2(20),
memo VARCHAR2(80),
deposit INT,
withdrawal INT
);
-- データの登録
INSERT
ALL INTO household_account1
VALUES
(1, TO_DATE('2024-03-10', 'YYYY-MM-DD'), '給料', '3月分', 150000, 0)
INTO
household_account1
VALUES
(2, TO_DATE('2024-03-15', 'YYYY-MM-DD'), '食費', '昼食(スシロー)', 0, 1380)
INTO
household_account1
VALUES
(3, TO_DATE('2024-03-17', 'YYYY-MM-DD'), '交通費', 'バス代', 0, 500)
INTO
household_account1
VALUES
(4, TO_DATE('2024-03-14', 'YYYY-MM-DD'), '食費', '夜食(とんかつ濱かつ)', 0, 2000)
INTO
household_account1
VALUES
(5, TO_DATE('2024-03-20', 'YYYY-MM-DD'), '通信費', 'スマホ代', 0, 3300)
INTO
household_account1
VALUES
(6, TO_DATE('2024-03-25', 'YYYY-MM-DD'), '交際費', 'デート', 0, 8000)
INTO
household_account1
VALUES
(7, TO_DATE('2024-03-21', 'YYYY-MM-DD'), '美容費', '美容室(パーマ)', 0, 10000)
INTO
household_account1
VALUES
(8, TO_DATE('2024-03-19', 'YYYY-MM-DD'), '交際費', '飲み会', 0, 13000)
INTO
household_account1
VALUES
(9, TO_DATE('2024-03-18', 'YYYY-MM-DD'), '趣味費', 'ゲーム', 0, 5000)
INTO
household_account1
VALUES
(10, TO_DATE('2024-03-25', 'YYYY-MM-DD'), '住居費', '3月分', 0, 55000)
SELECT
*
FROM
DUAL;
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 給料 | 3月分 | 150000 | 0 |
2024/03/15 | 食費 | 昼食(スシロー) | 0 | 1380 |
2024/03/17 | 交通費 | バス代 | 0 | 500 |
2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | 2000 |
2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
2024/03/25 | 交際費 | デート | 0 | 8000 |
2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
2024/03/18 | 趣味費 | ゲーム | 0 | 5000 |
2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
ORDER BYの使い方
指定した列の値を基準として並び替えた検索結果(データ)を取得する ORDER BY は下記のように記述します。
SELECT 列名… FROM テーブル名
ORDER BY 列名 並び順(ASC or DESC)
並び順はASCまたはDESCと指定します。ASCは昇順でDESCは降順になります。0RDER BY の初期値は昇順なので、並び順を指定しない場合は昇順でソートされます。
家計簿テーブルのidを並び順を指定せずにソートしてみました。
SELECT
id AS "No",
TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
expense AS "費目",
memo AS "メモ",
deposit AS "入金額",
withdrawal AS "出金額"
FROM
household_account1
ORDER BY
id
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | 0 | 1380 |
3 | 2024/03/17 | 交通費 | バス代 | 0 | 500 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | 2000 |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
6 | 2024/03/25 | 交際費 | デート | 0 | 8000 |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
9 | 2024/03/18 | 趣味費 | ゲーム | 0 | 5000 |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
では、日付を降順で並び替えてみたいと思います。
SELECT
id AS "No",
TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
expense AS "費目",
memo AS "メモ",
deposit AS "入金額",
withdrawal AS "出金額"
FROM
household_account1
ORDER BY
transaction_date DESC
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
6 | 2024/03/25 | 交際費 | デート | 0 | 8000 |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
9 | 2024/03/18 | 趣味費 | ゲーム | 0 | 5000 |
3 | 2024/03/17 | 交通費 | バス代 | 0 | 500 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | 0 | 1380 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | 2000 |
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
複数の列を並び替える
複数の列を並び替える場合は下記のように記述します。
SELECT 列名… FROM テーブル名
ORDER BY 列名1 並び順, 列名2 並び順 …
入金額は降順、出金額は昇順で絞ってデータを取得してみます。
SELECT
id AS "No",
TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
expense AS "費目",
memo AS "メモ",
deposit AS "入金額",
withdrawal AS "出金額"
FROM
household_account1
ORDER BY
deposit DESC, withdrawal ASC
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
3 | 2024/03/17 | 交通費 | バス代 | 0 | 500 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | 0 | 1380 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | 2000 |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
9 | 2024/03/18 | 趣味費 | ゲーム | 0 | 5000 |
6 | 2024/03/25 | 交際費 | デート | 0 | 8000 |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
NULLを最後に指定するには?
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | – | 1380 |
3 | 2024/03/17 | 交通費 | バス代 | – | 500 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | – |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
6 | 2024/03/25 | 交際費 | デート | 0 | – |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
9 | 2024/03/18 | 趣味費 | ゲーム | – | 5000 |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
データにNULLが含まれる場合、NULLの位置を最初(NULLS FIRST)にするか最後(NULLS LAST)にするか指定することができます。例えば、入金額をDESC(降順)に並べた時にNULLの位置を指定しない場合はNULLが先頭にきてしまします。NULLは最後に確認したいんだよな…そう思いませんでしたか?
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
9 | 2024/03/18 | 趣味費 | ゲーム | – | 5000 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | – | 1380 |
3 | 2024/03/17 | 交通費 | バス代 | – | 500 |
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
6 | 2024/03/25 | 交際費 | デート | 0 | – |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | – |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
そこで、NULLを最後に確認する場合は NULLS LAST を使用します。
SELECT 列名… FROM テーブル名
ORDER BY 列名 並び順 NULLS LAST
実際に使ってみましょう!
SELECT
id AS "No",
TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
expense AS "費目",
memo AS "メモ",
deposit AS "入金額",
withdrawal AS "出金額"
FROM
household_account1
ORDER BY
deposit DESC NULLS LAST
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | – |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
6 | 2024/03/25 | 交際費 | デート | 0 | – |
9 | 2024/03/18 | 趣味費 | ゲーム | – | 5000 |
3 | 2024/03/17 | 交通費 | バス代 | – | 500 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | – | 1380 |
NULLが1番下にきてることがわかります。逆にNULLを先頭に出したい場合は NULLS FIRST を使用します。
SELECT 列名… FROM テーブル名
ORDER BY 列名 並び順 NULLS FIRST
上の表とは真逆に NULL 〜 昇順(ASC)で並び替えてみたいと思います。
SELECT
id AS "No",
TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
expense AS "費目",
memo AS "メモ",
deposit AS "入金額",
withdrawal AS "出金額"
FROM
household_account1
ORDER BY
deposit ASC NULLS FIRST , withdrawal ASC NULLS FIRST
No | 日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|---|
3 | 2024/03/17 | 交通費 | バス代 | – | 500 |
2 | 2024/03/15 | 食費 | 昼食(スシロー) | – | 1380 |
9 | 2024/03/18 | 趣味費 | ゲーム | – | 5000 |
4 | 2024/03/14 | 食費 | 夜食(とんかつ濱かつ) | 0 | – |
6 | 2024/03/25 | 交際費 | デート | 0 | – |
5 | 2024/03/20 | 通信費 | スマホ代 | 0 | 3300 |
7 | 2024/03/21 | 美容費 | 美容室(パーマ) | 0 | 10000 |
8 | 2024/03/19 | 交際費 | 飲み会 | 0 | 13000 |
10 | 2024/03/25 | 住居費 | 3月分 | 0 | 55000 |
1 | 2024/03/10 | 給料 | 3月分 | 150000 | 0 |
どうでしょうか?NULLの位置を指定することにより、表がより見やすくなったと思います。
まとめ
検索結果(データ)の順番を変更し取得するには ORDER BY を使って並び替えられることがわかりました。複数のデータで並び替える場合は、データの値に注意しましょう。
コメント