【Oracle】ORDER BY で検索結果を並び替えよう!

Oracle

前回は、重複行を除外する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月分1500000
2024/03/15食費昼食(スシロー)01380
2024/03/17交通費バス代0500
2024/03/14食費夜食(とんかつ濱かつ)02000
2024/03/20通信費スマホ代03300
2024/03/25交際費デート08000
2024/03/21美容費美容室(パーマ)010000
2024/03/19交際費飲み会013000
2024/03/18趣味費ゲーム05000
2024/03/25住居費3月分055000
家計簿テーブル

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日付費目メモ入金額出金額
12024/03/10給料3月分1500000
22024/03/15食費昼食(スシロー)01380
32024/03/17交通費バス代0500
42024/03/14食費夜食(とんかつ濱かつ)02000
52024/03/20通信費スマホ代03300
62024/03/25交際費デート08000
72024/03/21美容費美容室(パーマ)010000
82024/03/19交際費飲み会013000
92024/03/18趣味費ゲーム05000
102024/03/25住居費3月分055000
家計簿テーブル id(No) を昇順で並び替え

では、日付を降順で並び替えてみたいと思います。

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日付費目メモ入金額出金額
62024/03/25交際費デート08000
102024/03/25住居費3月分055000
72024/03/21美容費美容室(パーマ)010000
52024/03/20通信費スマホ代03300
82024/03/19交際費飲み会013000
92024/03/18趣味費ゲーム05000
32024/03/17交通費バス代0500
22024/03/15食費昼食(スシロー)01380
42024/03/14食費夜食(とんかつ濱かつ)02000
12024/03/10給料3月分1500000
家計簿テーブル transaction_date(日付) を降順で並び替え

複数の列を並び替える

複数の列を並び替える場合は下記のように記述します。

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日付費目メモ入金額出金額
12024/03/10給料3月分1500000
32024/03/17交通費バス代0500
22024/03/15食費昼食(スシロー)01380
42024/03/14食費夜食(とんかつ濱かつ)02000
52024/03/20通信費スマホ代03300
92024/03/18趣味費ゲーム05000
62024/03/25交際費デート08000
72024/03/21美容費美容室(パーマ)010000
82024/03/19交際費飲み会013000
102024/03/25住居費3月分055000
複数の列を指定してソート

NULLを最後に指定するには?

No日付費目メモ入金額出金額
12024/03/10給料3月分1500000
22024/03/15食費昼食(スシロー)1380
32024/03/17交通費バス代500
42024/03/14食費夜食(とんかつ濱かつ)0
52024/03/20通信費スマホ代03300
62024/03/25交際費デート0
72024/03/21美容費美容室(パーマ)010000
82024/03/19交際費飲み会013000
92024/03/18趣味費ゲーム5000
102024/03/25住居費3月分055000
NULLが含まれるデータ

データにNULLが含まれる場合、NULLの位置を最初(NULLS FIRST)にするか最後(NULLS LAST)にするか指定することができます。例えば、入金額をDESC(降順)に並べた時にNULLの位置を指定しない場合はNULLが先頭にきてしまします。NULLは最後に確認したいんだよな…そう思いませんでしたか?

No日付費目メモ入金額出金額
92024/03/18趣味費ゲーム5000
22024/03/15食費昼食(スシロー)1380
32024/03/17交通費バス代500
12024/03/10給料3月分1500000
82024/03/19交際費飲み会013000
72024/03/21美容費美容室(パーマ)010000
62024/03/25交際費デート0
102024/03/25住居費3月分055000
42024/03/14食費夜食(とんかつ濱かつ)0
52024/03/20通信費スマホ代03300
入金金額をDESC(降順)で並び替え表

そこで、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日付費目メモ入金額出金額
12024/03/10給料3月分1500000
52024/03/20通信費スマホ代03300
82024/03/19交際費飲み会013000
72024/03/21美容費美容室(パーマ)010000
42024/03/14食費夜食(とんかつ濱かつ)0
102024/03/25住居費3月分055000
62024/03/25交際費デート0
92024/03/18趣味費ゲーム5000
32024/03/17交通費バス代500
22024/03/15食費昼食(スシロー)1380
NULLS LAST でNULLを最後に指定

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日付費目メモ入金額出金額
32024/03/17交通費バス代500
22024/03/15食費昼食(スシロー)1380
92024/03/18趣味費ゲーム5000
42024/03/14食費夜食(とんかつ濱かつ)0
62024/03/25交際費デート0
52024/03/20通信費スマホ代03300
72024/03/21美容費美容室(パーマ)010000
82024/03/19交際費飲み会013000
102024/03/25住居費3月分055000
12024/03/10給料3月分1500000
NULLS FIRST でNULLを最初に指定

どうでしょうか?NULLの位置を指定することにより、表がより見やすくなったと思います。

まとめ

検索結果(データ)の順番を変更し取得するには ORDER BY を使って並び替えられることがわかりました。複数のデータで並び替える場合は、データの値に注意しましょう。

コメント