前回は、テーブルにデータを追加する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 | 入金 | 生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会 | 0 | 13400 |
2024/03/12 | 交通費 | バス代支払い | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
SELECT文の使い方
ではSELECT文の使い方を、作成した家計簿テーブルのデータを使って見ていきましょう!
*でデータを取得する
テーブルが持っているデータを全て取得する場合、* を使います。SELECT文は下記のように記述します。
SELECT * FROM テーブル名
作成した家計簿テーブルからすべてのデータを取得してみましょう。
SELECT * FROM household_account1
全てのデータが取得できました!
ID | TRANSACTION_DATE | EXPENSE | MEMO | DEPOSIT | WITHDRAWAL |
---|---|---|---|---|---|
1 | 10-MAR-24 | 入金 | 生活費 | 50000 | 0 |
2 | 11-MAR-24 | 交際費 | 飲み会 | 0 | 13400 |
3 | 12-MAR-24 | 交通費 | バス代支払い | 0 | 500 |
4 | 13-MAR-24 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
5 | 14-MAR-24 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
列を指定してデータを取得する
列を指定してデータを取得するSELECT文は下記のように記述します。
SELECT 列名1,列名2,列名3… FROM テーブル名
作成した家計簿テーブルから費目とメモだけ取得したいと思います。
SELECT expense, memo FROM household_account1
EXPENSE | MEMO |
---|---|
入金 | 生活費 |
交際費 | 飲み会 |
交通費 | バス代支払い |
レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) |
食費 | 夜食(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 | 入金 | 生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会 | 0 | 13400 |
2024/03/12 | 交通費 | バス代支払い | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
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 | 交際費 | 飲み会 | 0 | 13400 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
比較演算子(=, <, >, <=, >=, <>)
比較演算子(>=)を使ってデータを取得したのですが、主な比較演算子は下記です。
比較演算子 | 意味 |
= | 左右の値が等しい |
< | 左辺は右辺より小さい |
> | 左辺は右辺より大きい |
<= | 左辺は右辺の値以下 |
>= | 左辺は右辺の値以上 |
<> | 左右の値が等しくない |
比較演算子を使っていろんな方法でデータを取得してみましょう。
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 生活費 | 50000 | 0 |
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/11 | 交際費 | 飲み会 | 0 | 13400 |
2024/03/12 | 交通費 | バス代支払い | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
IS NULL / IS NOT NULL 演算子
テーブルに具体的な値「0」や「食費」などの値を入れていない状態を意味するのがNULLです。
テーブルの値がNULLかNULLじゃないかを判定するのが、IS NULL 演算子、IS NOT NULL 演算子です。下記のように記述します。
-- NULLであることを判定する。
列名 IS NULL
-- NULLでないことを判定する。
列名 IS NOT NULL
では具体的な使い方を見ていきましょう!
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会 | 0 | 13400 |
2024/03/12 | 交通費 | バス代支払い | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
上記のデータには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のデータを取得したいと思います。
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 生活費 | 50000 | – |
入金額がNULLじゃないデータを取得するには?
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 生活費 | 50000 | – |
LIKE 演算子
文字列があるパターンに一致しているデータを取得したい場合に使用するのが LIKE 演算子 です。LIKE 演算子は下記のように記述します。
列名 LIKE パターン文字列
パターン文字 | 意味 |
% | 任意の0文字以上の文字列 |
_(アンダースコア) | 任意の1文字 |
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 |
メモに「1回」が含まれるデータだけが取得できました。
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 3月の生活費 | 50000 | – |
メモが「3月」から始めるデータだけが取得できました。
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/11 | 交際費 | 飲み会(3月に4回あるうちの1回) | – | 13400 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | – | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | – | 791 |
メモが「)」で終わるデータだけ取得できました。
_も使い方は一緒ですが、使いにくいかもれません。
従業員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 |
名前(名)が子で終わる人のデータを取得する場合は ‘_子’ と記述します。
従業員ID | 名 | 姓 | メールアドレス |
---|---|---|---|
2 | 花子 | 鈴木 | hanako.suzuki@example.com |
4 | 麻子 | 伊藤 | asako.ito@example.com |
_は任意の1文字なので、名前に3文字で最後に子で終わる人がいたとしても ‘_子’ では取得できません。 その人のデータを取得する場合は ‘__子’になります。
従業員ID | 名 | 姓 | メールアドレス |
---|---|---|---|
6 | もえ子 | 桜田 | moeko.sakurada@example.com |
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 |
開始値は 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月の生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会(3月に4回あるうちの1回) | 0 | 13400 |
2024/03/12 | 交通費 | バス代1回払い(分割なんてない) | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
2024/03/15 | 入金 | 会社支給の交通費 | 48000 | 0 |
2024/03/16 | 交通費 | 東京出張(飛行機) | 0 | 44000 |
2024/03/17 | 交通費 | 電車(JR山手線) | 0 | 580 |
2024/03/18 | レジャー | ゲームセンター(クレーンゲーム) | 0 | 5000 |
2024/03/19 | 食費 | 夜食(ケンタッキー とくとくパック♡4ピース) | 0 | 1540 |
上記のデータから費目の食費と交通費だけ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回払い(分割なんてない) | 0 | 500 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
2024/03/16 | 交通費 | 東京出張(飛行機) | 0 | 44000 |
2024/03/17 | 交通費 | 電車(JR山手線) | 0 | 580 |
2024/03/19 | 食費 | 夜食(ケンタッキー とくとくパック♡4ピース) | 0 | 1540 |
では NOT IN にするとどうなるのか…
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 3月の生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会(3月に4回あるうちの1回) | 0 | 13400 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/15 | 入金 | 会社支給の交通費 | 48000 | 0 |
2024/03/18 | レジャー | ゲームセンター(クレーンゲーム) | 0 | 5000 |
入金、交際費、レジャーだけのレコードが取得されました。
論理演算子(AND 演算子/ OR 演算子)
AND 演算子
下記の表から費目がレジャーかつ出金額が5000円未満のデータを取得したい。
この場合は2つの条件を使用しないとデータが取得できません。そこで AND 演算子 を使います。
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 3月の生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会(3月に4回あるうちの1回) | 0 | 13400 |
2024/03/12 | 交通費 | バス代1回払い(分割なんてない) | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
2024/03/15 | 入金 | 会社支給の交通費 | 48000 | 0 |
2024/03/16 | 交通費 | 東京出張(飛行機) | 0 | 44000 |
2024/03/17 | 交通費 | 電車(JR山手線) | 0 | 580 |
2024/03/18 | レジャー | ゲームセンター(クレーンゲーム) | 0 | 5000 |
2024/03/19 | 食費 | 夜食(ケンタッキー とくとくパック♡4ピース) | 0 | 1540 |
AND 演算子は下記のように記述します。
-- 2つの条件式の両方が真の場合、真となる
条件式1 AND 条件式2
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
5000円未満ということで1レコードだけがしっかりと取得できました。
OR 演算子
下記の表から入金額が40000以上または出金額が10000以上のデータを取得したい。
この場合は2つの条件を使用しないとデータが取得できません。そこで OR 演算子 を使います。
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 3月の生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会(3月に4回あるうちの1回) | 0 | 13400 |
2024/03/12 | 交通費 | バス代1回払い(分割なんてない) | 0 | 500 |
2024/03/13 | レジャー | 映画鑑賞(劇場版ハイキュー‼ ゴミ捨て場の決戦) | 0 | 2000 |
2024/03/14 | 食費 | 夜食(CoCo壱 たっぷりあさりカレー) | 0 | 791 |
2024/03/15 | 入金 | 会社支給の交通費 | 48000 | 0 |
2024/03/16 | 交通費 | 東京出張(飛行機) | 0 | 44000 |
2024/03/17 | 交通費 | 電車(JR山手線) | 0 | 580 |
2024/03/18 | レジャー | ゲームセンター(クレーンゲーム) | 0 | 5000 |
2024/03/19 | 食費 | 夜食(ケンタッキー とくとくパック♡4ピース) | 0 | 1540 |
OR 演算子は下記のように記述します。
-- 2つの条件式のどちらかが真の場合、真となる
条件式1 OR 条件式2
日付 | 費目 | メモ | 入金額 | 出金額 |
---|---|---|---|---|
2024/03/10 | 入金 | 3月の生活費 | 50000 | 0 |
2024/03/11 | 交際費 | 飲み会(3月に4回あるうちの1回) | 0 | 13400 |
2024/03/15 | 入金 | 会社支給の交通費 | 48000 | 0 |
2024/03/16 | 交通費 | 東京出張(飛行機) | 0 | 44000 |
入金額が40000以上 または 出金額が 10000以上のデータが取得できました。
まとめ
長くなってしまいましたが、SELECT文の使い方がなんとなくわかったんじゃないでしょうか。WHERE句をうまく使って欲しいデータを取得しましょう!
コメント