【Oracle】HAVING でグループ化して条件を指定する

グループ化して条件を指定するHAVING

OracleでGROUP BYでグループ化した結果に条件指定するには「HAVING」を使用します。

WHEREとの違い

同じく条件指定する「WHERE」がありますが、データを抽出する順番が違います。

  • WHERE・・・「WHERE」→「GROUP BY」の順
  • HAVING・・・「GROUP BY」→「HAVING」の順

SQLの実行順序としては、「WHERE」の条件を最初に抽出します。その結果をGROUP BYでグループ化します。

たいして「HAVING」はGROUP BYでグループ化したあとにHAVING条件で抽出します。

 

例1. グループ化して件数指定するHAVINGパターン

--EMPテーブルを取得 
SELECT emp_name FROM emp 
WHERE address = '沖縄';
emp_name
佐藤
佐藤
佐藤
加藤
加藤
吉田
井上
--同じ名前の人を取得する 
SELECT emp_name,COUNT(emp_name) emp_count FROM emp
WHERE address = '沖縄' 
GROUP BY emp_name 
HAVING COUNT(*) > 1;
emp_name emp_count
佐藤 3
加藤 2

ここでは「GROUP BY emp_name」で名前でグループ化しました。

さらに「HAVING COUNT(*) > 1」という条件によって、グループ化した「名前」の件数が1件より大きい、つまり複数ある名前の人を抽出しました。

例2. グループ化して合計指定するHAVINGパターン

--SCOREテーブルを取得 
SELECT s_name,subject,point FROM score WHERE team = 'CLASS1';
s_name subject point
佐藤太郎 英語 100
佐藤太郎 数学 90
井上花子 英語 70
井上花子 数学 60

 

--合計を取得
SELECT S_NAME,SUM(POINT) FROM SCORE 
WHERE TEAM = 'CLASS1' 
GROUP BY S_NAME 
HAVING SUM(POINT) > 180;
s_name sum(point)
佐藤太郎 190

ここでは「GROUP BY s_name」で生徒ごとにグループ化し、「HAVING SUM(POINT) > 180」で英数の点数合計が180点以上の人を抽出しました。

これでHAVINGをつかってグループ化して条件を指定して取得することができました。

以上、Oracleでグループ化して条件を指定するHAVINGの使い方でした。

コメント