【初学者必見!】SQLの基本、実務使用例を徹底解説!HAVING編

サムネイル SQL

※この記事にはプロモーションが含まれています。

ふりかえり

筆者
筆者

本記事は、SQLの基本、実務使用例編になります。

SQLの基礎に関しましては、

【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

A子
A子

本編に入ります!

HAVINGの基本構文

筆者
筆者

まずは、基本構文から見ていきましょう!

SELECT 列名, 集計関数(列名)
FROM テーブル名
GROUP BY グループにしたい列
HAVING 集計関数による条件;

A子
A子

havingは最後にあるね。

筆者
筆者

はい、そうです!

HAVING の構文の流れ(全体のイメージ)は以下になります!

  1. FROM → データをどこから取るか
  2. WHERE → 個々の行の条件(※必要に応じて使います)
  3. GROUP BY → グループにまとめる
  4. HAVING → グループごとの条件

実務レベルの使用例を見ていこう!

筆者
筆者

実際に、SQLを使用してデータを確認していきましょう。

SQLに関しては以下を使用して解説していきます。

create table文、select文、insert文、update文、delete文、

drop table文、につきましては、過去にアップロードした

【初学者必見!】SQLの超基礎編の記事をご覧くださいませ。

A子
A子

目次の、「ふりかえり」のところにそれぞれの記事のリンクが

貼ってあるよ!

または、サイドバーのカテゴリーに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) 
    DEPARTMENT varchar2(10),          -- 部署名(Department)
    constraint PK_申請管理情報 primary key (STAFF_NO, APPLI_NO)

);

insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1001', 'A001', TO_DATE('2024-02-25', 'YYYY-MM-DD'),'営業');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1001', 'A002', TO_DATE('2024-02-26', 'YYYY-MM-DD'),'営業');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1002', 'A003', TO_DATE('2024-02-27', 'YYYY-MM-DD'),'開発');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1002', 'a003', TO_DATE('2024-01-27', 'YYYY-MM-DD'),'開発');
insert into 申請管理情報 (STAFF_NO, APPLI_NO, APPLI_DATE, DEPARTMENT) 
values ('1003', 'A004', TO_DATE('2024-02-28', 'YYYY-MM-DD'),'営業');

部署ごとの申請件数が2件以上の部署を取得する

select department, count(*) as 申請件数
from 申請管理情報
group by department
having count(*) >= 2;

GROUP BY department によって、department ごとにレコードをグループ化しています。

count(*) を使い、各部署ごとの申請件数を算出しています。

HAVING count(*) >= 2 で、申請件数が2件以上の部署のみを取得しています。

申請件数が1件のみの職員を取得する

select staff_no, count(*) as 申請件数
from 申請管理情報
group by staff_no
having count(*) = 1;

GROUP BY staff_no により staff_no ごとにグループ化しています。

count(*) で職員ごとの申請件数を算出しています。

HAVING count(*) = 1 で、申請件数がちょうど1件の職員を取得しています。

各職員の最新の申請日が2024年2月以降である職員を取得する

select staff_no, max(appli_date) as 最新申請日
from 申請管理情報
group by staff_no
having max(appli_date) >= TO_DATE('2024-02-01', 'YYYY-MM-DD');

GROUP BY staff_no で職員ごとにグループ化。

MAX(appli_date) を使い、各職員の最新の申請日を取得。

HAVING max(appli_date) >= TO_DATE('2024-02-01', 'YYYY-MM-DD') で、最新申請日が2024年2月以降の職員を抽出。

まとめ

HAVINGGROUP BY の後に使う。

集計関数(COUNT, MAX, SUM など)と一緒に使う。

WHERE は個々のレコードをフィルタリングし、HAVING は集計結果に対してフィルタリングする。

HAVING を使うことで、特定の条件に合致した集計結果のみを取得できる。

筆者
筆者

havingについて解説しました。

HAVING は、データの傾向を分析するときに非常に便利です。例えば、「部署ごとの申請件数を調べたい」「2件以上の申請をしている人だけを取得したい」といった条件に活用できます。ぜひ使いこなしてみてください!

次回もお楽しみに!

この記事を書いた人
たくたく

文系出身・3年目のWeb系エンジニアです。
C#とSQLを得意としています。
同棲生活は2年目に入り、日々仲良く楽しく暮らしています。
プライベートではバイクや車で旅行に行くことが趣味です。
サンリオ好きで、中でもシナモン推しです。
お酒好きとして毎週の晩酌をリラックスタイムにしています。

たくたくをフォローする
SQLエンジニア
シェアする

コメント

タイトルとURLをコピーしました