ふりかえり

本記事は、SQLの基本、実務使用例編になります。
SQLの基礎に関しましては、
【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

本編に入ります!
min関数の基本構文

まずは、基本構文から見ていきましょう!
select min(列名) from テーブル名;

minとfromだね!

はい、そうです!
構文的には、max関数にかなり似てます!
min() 関数は、指定した列の中で最も小さい値を取得する集計関数(集約関数)です。
例えば、日付の場合は最も古い日付を取得し、数値の場合は最も小さい数を取得します。
実務レベルの使用例を見ていこう!

実際に、SQLを使用してデータを確認していきましょう。
SQLに関しては以下を使用して解説していきます。
create table文、select文、insert文、update文、delete文、
drop table文、につきましては、過去にアップロードした
【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

目次の、「ふりかえり」のところにそれぞれの記事のリンクが
貼ってあるよ!
または、サイドバーのカテゴリーにSQLがあるから、そちらからでも
参照できます!
[事前準備]今回、実行するSQLの一覧
-- 申請管理情報テーブルの作成
create table 申請管理情報 (
STAFF_NO varchar2(10) not null, -- 職員番号 (Staff Number)
APPLI_NO varchar2(10) not null, -- 申請番号 (Application Number)
APPLI_DATE date, -- 申請年月日 (Application Date)
APPROVAL_DATE date, -- 承認日 (Approval Date)
SEND_BACK_DATE date, -- 差戻年月日 (Send Back Date)
APPLICATION_CONTENT varchar2(50), -- 申請内容 (Application Content)
constraint PK_申請管理情報 primary key (STAFF_NO, APPLI_NO)
);
create table 申請内容の詳細 (
職員番号 varchar2(10) not null, -- 親テーブルの STAFF_NO に対応
申請番号 varchar2(10) not null, -- 親テーブルの APPLI_NO に対応
申請内容の詳細 varchar2(100),
constraint PK_申請内容の詳細 primary key (職員番号, 申請番号),
constraint FK_申請内容の詳細 foreign key (職員番号, 申請番号)
references 申請管理情報 (STAFF_NO, APPLI_NO)
);
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE)
values ('1001', 'A001', TO_DATE('2024-02-25', 'YYYY-MM-DD'));
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE)
values ('1001', 'A002', TO_DATE('2024-02-26', 'YYYY-MM-DD'));
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE)
values ('1001', 'A003', TO_DATE('2024-02-27', 'YYYY-MM-DD'));
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE)
values ('1001', 'a003', TO_DATE('2024-01-27', 'YYYY-MM-DD'));
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE)
values ('1001', 'A004', TO_DATE('2024-02-28', 'YYYY-MM-DD'));
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1001', 'A001', 'レギュラーとハイオク間違えたので、もう一回入れに行きたいです。');
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1001', 'A002', 'ガソリン高いから、もっと補助してほしい');
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1001', 'A003', 'ハイオク満タンにしちゃった');
insert into 申請内容の詳細 (職員番号, 申請番号, 申請内容の詳細)
values ('1001', 'a003', 'レギュラー満タンにしちゃった');
特定の職員の最も古い申請日を取得する
select min(APPLI_DATE) as 最古の申請日
from 申請管理情報
where STAFF_NO = '1001';

min(APPLI_DATE) を使うことで、STAFF_NO='1001' の職員が行った申請の中で、一番古い APPLI_DATE を取得できます。
where STAFF_NO = '1001' によって、特定の職員(1001)のデータに限定しています。
最も古い申請日に対応する申請番号を取得する
select APPLI_NO, APPLI_DATE
from 申請管理情報
where APPLI_DATE = (
select min(APPLI_DATE)
from 申請管理情報
where STAFF_NO = '1001'
);

min(APPLI_DATE) を取得するサブクエリを使い、その日付と一致する APPLI_NO を 申請管理情報 テーブルから取得します。
サブクエリでは、その結果を使って、APPLI_DATE = '2024-01-27' のレコードを 申請管理情報 テーブルから探し、APPLI_NO を取得します。
最も古い申請に関する詳細を取得する
select d.申請内容の詳細
from 申請内容の詳細 d
join 申請管理情報 m
on d.職員番号 = m.STAFF_NO and d.申請番号 = m.APPLI_NO
where m.APPLI_DATE = (
select min(APPLI_DATE)
from 申請管理情報
where STAFF_NO = '1001'
);

申請管理情報 テーブルの APPLI_DATE を基準にして、一番古い申請日をサブクエリで取得します。
その申請番号と 申請内容の詳細 テーブルを結合し、該当する詳細情報を取得します。
各職員ごとに最も古い申請を取得する
select STAFF_NO, min(APPLI_DATE) as 最古の申請日
from 申請管理情報
group by STAFF_NO;

group by STAFF_NO を使うことで、職員ごとに min(APPLI_DATE) を求めます。
これにより、それぞれの職員の最も古い申請日が分かります。
各職員ごとに最も古い申請の内容を取得する
select m.STAFF_NO, m.APPLI_NO, m.APPLI_DATE, d.申請内容の詳細
from 申請管理情報 m
join 申請内容の詳細 d
on m.STAFF_NO = d.職員番号 and m.APPLI_NO = d.申請番号
where m.APPLI_DATE = (
select min(APPLI_DATE)
from 申請管理情報
where STAFF_NO = m.STAFF_NO
);

申請管理情報 テーブルの最も古い APPLI_DATE を取得し、それと一致する APPLI_NO を取得します。その APPLI_NO を使って 申請内容の詳細 テーブルと結合し、詳細情報を取得します。
まとめ

min関数について解説しました。
次回もお楽しみに!










コメント