【Oracle】SELECT文でデータを取得しよう!

Oracle

前回は、テーブルにデータを追加するINSERT文について説明しました。今回は、データを取得するSELECT文について説明していきます!

データ準備

SELECT文を試すためにテーブルを作成し、データを追加します。

-- テーブルの作成
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'), '入金', '生活費', 50000, 0)
INTO
  household_account1
VALUES
  (2, TO_DATE('2024-03-11', 'YYYY-MM-DD'),  '交際費', '飲み会', 0, 13400) 
INTO
  household_account1
VALUES
  (3, TO_DATE('2024-03-12', 'YYYY-MM-DD'), '交通費', 'バス代支払い', 0, 500)
INTO
   household_account1
VALUES
  (4, TO_DATE('2024-03-13', 'YYYY-MM-DD'), 'レジャー', '映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)', 0,  2000)
INTO
   household_account1
VALUES
  (5, TO_DATE('2024-03-14', 'YYYY-MM-DD'), '食費', '夜食(CoCo壱 たっぷりあさりカレー)', 0, 791)
SELECT
  *
FROM
  DUAL;
日付費目メモ入金額出金額
2024/03/10入金生活費500000
2024/03/11交際費飲み会013400
2024/03/12交通費バス代支払い0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
家計簿テーブルに追加したデータ

SELECT文の使い方

ではSELECT文の使い方を、作成した家計簿テーブルのデータを使って見ていきましょう!

*でデータを取得する

テーブルが持っているデータを全て取得する場合、* を使います。SELECT文は下記のように記述します。

SELECT * FROM テーブル名

作成した家計簿テーブルからすべてのデータを取得してみましょう。

SELECT * FROM household_account1

全てのデータが取得できました!

IDTRANSACTION_DATEEXPENSEMEMODEPOSITWITHDRAWAL
110-MAR-24入金生活費500000
211-MAR-24交際費飲み会013400
312-MAR-24交通費バス代支払い0500
413-MAR-24レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
514-MAR-24食費夜食(CoCo壱 たっぷりあさりカレー)0791

列を指定してデータを取得する

列を指定してデータを取得するSELECT文は下記のように記述します。

SELECT 列名1,列名2,列名3… FROM テーブル名

作成した家計簿テーブルから費目とメモだけ取得したいと思います。

SELECT expense, memo FROM household_account1
EXPENSEMEMO
入金生活費
交際費飲み会
交通費バス代支払い
レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)
食費夜食(CoCo壱 たっぷりあさりカレー)
費目とメモを取得しました

無事データが取得できています。ただ列名がわかりにくいのでAS句を使いテーブルに別名をつけてデータを取得したいと思います!

AS句で列(カラム)に別名をつける

列(カラム)に別名をつける場合は、AS句を使用します。

SELECT 列名1 AS 別名, 列名2 AS 別名… FROM テーブル名

expenseとmemoに別名をつけて取得してみます。

SELECT expense AS "費目", memo AS "メモ" FROM household_account1
費目メモ
入金生活費
交際費飲み会
交通費バス代支払い
レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)
食費夜食(CoCo壱 たっぷりあさりカレー)
列名を変更し表が取得できました

WHERE句で条件を絞ってデータを取得する

「SELECT文の使い方」でざっくりとしたデータの取得方法については理解ができたと思います。細かいデータを絞って取得するには、WHERE句を使用します。

SELECT 列名
FROM テーブル名
WHERE 条件式

例えば、出金額が10000円以上のデータを取得したいとします。

日付費目メモ入金額出金額
2024/03/10入金生活費500000
2024/03/11交際費飲み会013400
2024/03/12交通費バス代支払い0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
1000円以上の出金額は交際費とレジャー

WHERE句に条件を指定します。

SELECT
  TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
  expense AS "費目",
  memo AS "メモ",
  deposit AS "入金額",
  withdrawal AS "出金額"
FROM
  household_account1
WHERE
  withdrawal >= 1000

出金額が1000円以上のデータを取得できました。

日付費目メモ入金額出金額
2024/03/11交際費飲み会013400
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000

比較演算子(=, <, >, <=, >=, <>)

比較演算子(>=)を使ってデータを取得したのですが、主な比較演算子は下記です。

比較演算子意味
=左右の値が等しい
<左辺は右辺より小さい
>左辺は右辺より大きい
<=左辺は右辺の値以下
>=左辺は右辺の値以上
<>左右の値が等しくない
主な比較演算子

比較演算子を使っていろんな方法でデータを取得してみましょう。

日付費目メモ入金額出金額
2024/03/10入金生活費500000
WHERE deposit <> 0 (入金額が0じゃないデータの取得)
日付費目メモ入金額出金額
2024/03/11交際費飲み会013400
2024/03/12交通費バス代支払い0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
WHERE deposit = 0 (入金額が0のデータの取得)
日付費目メモ入金額出金額
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
WHERE expense = ‘レジャー’ (費目がレジャーのデータを取得)

IS NULL / IS NOT NULL 演算子

テーブルに具体的な値「0」や「食費」などの値を入れていない状態を意味するのがNULLです。

テーブルの値がNULLかNULLじゃないかを判定するのが、IS NULL 演算子IS NOT NULL 演算子です。下記のように記述します。

-- NULLであることを判定する。
列名 IS NULL

-- NULLでないことを判定する。
列名 IS NOT NULL

では具体的な使い方を見ていきましょう!

日付費目メモ入金額出金額
2024/03/10入金生活費500000
2024/03/11交際費飲み会013400
2024/03/12交通費バス代支払い0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
NULLがないデータ

上記のデータにはNULLがないため、まずは入金額と出金額が0円のものをNULLに更新したいと思います。

-- 入金額の値が0のデータをNULLに更新
UPDATE household_account1 SET deposit = NULL WHERE deposit <> 0

-- 出金額の値が0のデータをNULLに更新
UPDATE household_account1 SET withdrawal = NULL WHERE withdrawal = 0
日付費目メモ入金額出金額
2024/03/10入金生活費50000
2024/03/11交際費飲み会13400
2024/03/12交通費バス代支払い500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)2000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)791
NULLを含むデータ

では、出金額がNULLのデータを取得したいと思います。

日付費目メモ入金額出金額
2024/03/10入金生活費50000
WHERE withdrawal IS NULL (出金額がNULLのデータを取得)

入金額がNULLじゃないデータを取得するには?

日付費目メモ入金額出金額
2024/03/10入金生活費50000
WHERE deposit IS NOT NULL (入金額がNULLじゃないデータを取得)

LIKE 演算子

文字列があるパターンに一致しているデータを取得したい場合に使用するのが LIKE 演算子 です。LIKE 演算子は下記のように記述します。

列名 LIKE パターン文字列 
パターン文字意味
%任意の0文字以上の文字列
_(アンダースコア)任意の1文字
LIKE 演算子に使えるパターン文字列

LIKE 演算子 を使うためにデータを少し更新します。

-- データを更新
UPDATE household_account1 SET memo = '3月の生活費' WHERE id = 1
UPDATE household_account1 SET memo = '飲み会(3月に4回あるうちの1回)' WHERE id = 2
UPDATE household_account1 SET memo = 'バス代1回払い(分割なんてない)' WHERE id = 3 
日付費目メモ入金額出金額
2024/03/10入金3月の生活費50000
2024/03/11交際費飲み会(3月に4回あるうちの1回)13400
2024/03/12交通費バス代1回払い(分割なんてない)500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)2000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)791

では、LIKE 演算子を使っていろんな方法でデータを取得してみましょう!

日付費目メモ入金額出金額
2024/03/11交際費飲み会(3月に4回あるうちの1回)13400
2024/03/12交通費バス代1回払い(分割なんてない)500
WHERE memo LIKE ‘%1回%’

メモに「1回」が含まれるデータだけが取得できました。

日付費目メモ入金額出金額
2024/03/10入金3月の生活費50000
WHERE memo LIKE ‘3月%’

メモが「3月」から始めるデータだけが取得できました。

日付費目メモ入金額出金額
2024/03/11交際費飲み会(3月に4回あるうちの1回)13400
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)2000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)791
WHERE memo LIKE ‘%)’

メモが「)」で終わるデータだけ取得できました。

_も使い方は一緒ですが、使いにくいかもれません。

従業員IDメールアドレス
1太郎taro.yamada@example.com
2花子鈴木hanako.suzuki@example.com
3健太山中kenta.yamanaka@example.com
4麻子伊藤asako.ito@example.com
5渡辺takashi.watanabe@example.com
従業員テーブル

例えば、従業員テーブルがあったとして苗字(姓)が山で始まる人だけでデータを取得する場合は ‘山_’ を使い

従業員IDメールアドレス
1太郎taro.yamada@example.com
3健太kenta.yamanaka@example.com
WHERE last_name LIKE ‘山_’

名前(名)が子で終わる人のデータを取得する場合は ‘_子’ と記述します。

従業員IDメールアドレス
2鈴木hanako.suzuki@example.com
4伊藤asako.ito@example.com
WHERE last_name LIKE ‘_子’

_は任意の1文字なので、名前に3文字で最後に子で終わる人がいたとしても ‘_子’ では取得できません。 その人のデータを取得する場合は ‘__子’になります。

従業員IDメールアドレス
6もえ子桜田moeko.sakurada@example.com
WHERE last_name LIKE ‘__子’

BETWEEN 演算子

範囲を指定してデータを取得したい場合は BETWEEN 演算子 を使います。BETWEEN 演算子は下記のように記述します。

列名 BETWEEN 開始値(以上) AND 終了値(以下)

例えば、下記の表から出金額が0〜2000までのデータを取得したいとします。

日付費目メモ入金額出金額
2024/03/10入金3月の生活費50000
2024/03/11交際費飲み会(3月に4回あるうちの1回)13400
2024/03/12交通費バス代1回払い(分割なんてない)500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)2000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)791

BETWEEN 0 AND 2000 でデータを取得すると3レコード分のデータが取得できます。

日付費目メモ入金額出金額
2024/03/12交通費バス代1回払い(分割なんてない)500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)2000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)791
WHERE withdrawal BETWEEN 0 AND 2000

開始値は 0 以上 、 終了値が 2000 以下なのでレジャーまで含まれています。

IN / NOT IN 演算子

カッコ内に列挙した複数の値をいずれかにデータが一致するか判定する演算子が IN / NOT IN 演算子です。IN / NOT IN 演算子は下記のように記述します。

列名 IN / NOT IN (値1, 値2, 値3…)

ちょっとデータが足りないので下記のデータを追加し、説明したいと思います。

-- データの追加
INSERT
  ALL INTO household_account1
VALUES
  (
    6,
    TO_DATE('2024-03-15', 'YYYY-MM-DD'),
    '入金',
    '会社支給の交通費',
    48000,
    0
  ) INTO household_account1
VALUES
  (
    7,
    TO_DATE('2024-03-16', 'YYYY-MM-DD'),
    '交通費',
    '東京出張(飛行機)',
    0,
    44000
  ) INTO household_account1
VALUES
  (
    8,
    TO_DATE('2024-03-17', 'YYYY-MM-DD'),
    '交通費',
    '電車(JR山手線)',
    0,
    580
  ) INTO household_account1
VALUES
  (
    9,
    TO_DATE('2024-03-18', 'YYYY-MM-DD'),
    'レジャー',
    'ゲームセンター(クレーンゲーム)',
    0,
    5000
  ) INTO household_account1
VALUES
  (
    10,
    TO_DATE('2024-03-19', 'YYYY-MM-DD'),
    '食費',
    '夜食(ケンタッキー とくとくパック♡4ピース)',
    0,
    1540
  )
SELECT
  *
FROM
  DUAL;
日付費目メモ入金額出金額
2024/03/10入金3月の生活費500000
2024/03/11交際費飲み会(3月に4回あるうちの1回)013400
2024/03/12交通費バス代1回払い(分割なんてない)0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
2024/03/15入金会社支給の交通費480000
2024/03/16交通費東京出張(飛行機)044000
2024/03/17交通費電車(JR山手線)0580
2024/03/18レジャーゲームセンター(クレーンゲーム)05000
2024/03/19食費夜食(ケンタッキー とくとくパック♡4ピース)01540

上記のデータから費目の食費と交通費だけIN演算子を使って取得したいと思います。

SELECT
  TO_CHAR(transaction_date, 'YYYY/MM/DD') AS "日付",
  expense AS "費目",
  memo AS "メモ",
  deposit AS "入金額",
  withdrawal AS "出金額"
FROM
  household_account1
WHERE
  expense IN ('交通費', '食費')

食費と交通費だけのレコードが取得されました。

日付費目メモ入金額出金額
2024/03/12交通費バス代1回払い(分割なんてない)0500
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
2024/03/16交通費東京出張(飛行機)044000
2024/03/17交通費電車(JR山手線)0580
2024/03/19食費夜食(ケンタッキー とくとくパック♡4ピース)01540
WHERE expense IN (‘交通費’, ‘食費’)

では NOT IN にするとどうなるのか…

日付費目メモ入金額出金額
2024/03/10入金3月の生活費500000
2024/03/11交際費飲み会(3月に4回あるうちの1回)013400
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/15入金会社支給の交通費480000
2024/03/18レジャーゲームセンター(クレーンゲーム)05000
WHERE expense NOT IN (‘交通費’ , ‘食費’)

入金、交際費、レジャーだけのレコードが取得されました。

論理演算子(AND 演算子/ OR 演算子)

AND 演算子

下記の表から費目がレジャーかつ出金額が5000円未満のデータを取得したい。

この場合は2つの条件を使用しないとデータが取得できません。そこで AND 演算子 を使います。

日付費目メモ入金額出金額
2024/03/10入金3月の生活費500000
2024/03/11交際費飲み会(3月に4回あるうちの1回)013400
2024/03/12交通費バス代1回払い(分割なんてない)0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
2024/03/15入金会社支給の交通費480000
2024/03/16交通費東京出張(飛行機)044000
2024/03/17交通費電車(JR山手線)0580
2024/03/18レジャーゲームセンター(クレーンゲーム)05000
2024/03/19食費夜食(ケンタッキー とくとくパック♡4ピース)01540

AND 演算子は下記のように記述します。

-- 2つの条件式の両方が真の場合、真となる
条件式1 AND 条件式2
日付費目メモ入金額出金額
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
WHERE expense = ‘レジャー’ AND withdrawal < 5000

5000円未満ということで1レコードだけがしっかりと取得できました。

OR 演算子

下記の表から入金額が40000以上または出金額が10000以上のデータを取得したい。

この場合は2つの条件を使用しないとデータが取得できません。そこで OR 演算子 を使います。

日付費目メモ入金額出金額
2024/03/10入金3月の生活費500000
2024/03/11交際費飲み会(3月に4回あるうちの1回)013400
2024/03/12交通費バス代1回払い(分割なんてない)0500
2024/03/13レジャー映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦)02000
2024/03/14食費夜食(CoCo壱 たっぷりあさりカレー)0791
2024/03/15入金会社支給の交通費480000
2024/03/16交通費東京出張(飛行機)044000
2024/03/17交通費電車(JR山手線)0580
2024/03/18レジャーゲームセンター(クレーンゲーム)05000
2024/03/19食費夜食(ケンタッキー とくとくパック♡4ピース)01540

OR 演算子は下記のように記述します。

-- 2つの条件式のどちらかが真の場合、真となる
条件式1 OR 条件式2
日付費目メモ入金額出金額
2024/03/10入金3月の生活費500000
2024/03/11交際費飲み会(3月に4回あるうちの1回)013400
2024/03/15入金会社支給の交通費480000
2024/03/16交通費東京出張(飛行機)044000
WHERE deposit >= 40000 OR withdrawal >= 10000

入金額が40000以上 または 出金額が 10000以上のデータが取得できました。

まとめ

長くなってしまいましたが、SELECT文の使い方がなんとなくわかったんじゃないでしょうか。WHERE句をうまく使って欲しいデータを取得しましょう!

コメント