グループ化して条件を指定する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の使い方でした。
コメント