Home実験室 − No.0064


        No.0064(SQL)
        グループ関数を使用した場合の条件式(HAVING)

■環境
  □OS: Windows XP Professional SP3
  □Oracle: Oracle Database 11g R2 (Standard)
  □OSログインユーザ: ORA_DBAグループ
  □Oracleユーザ: dicdic(実験用ユーザー) → 実験環境構築スクリプト

■実験
  0. 実験ユーザー「dicdic」でコネクトする。

SQL> conn dicdic/Oracle11g 接続されました。 SQL>



  1. 全学科の、学科ごとの人数を出すのであれば下のようなSQLになる。

SQL> SELECT 学科コード,COUNT(*) FROM TT01_学生 Group by 学科コード; 学科コード COUNT(*) ---------- ---------- 2703 139 1407 225 2531 242 1578 190 2273 211 1521 255 2445 216 2789 225 2875 101 2359 165 2015 171 2101 222 1293 221 2187 206 1464 151 2617 219 1635 129 1350 141 18行が選択されました。 SQL>



  2. さてこの中から、200名以上の学科だけに絞って表示させたい場合どうするか。
まずは、where句をつける方法に飛びつくけど。。。where句ではダメらしい。

SQL> SELECT 学科コード,COUNT(*) FROM TT01_学生 group by 学科コード where COUNT(*) >= 200; SELECT 学科コード,COUNT(*) FROM TT01_学生 group by 学科コード where COUNT(*) >= 200 * 行1でエラーが発生しました。: ORA-00933: SQLコマンドが正しく終了されていません。 SQL>



  3. 【HAVING句】
グループ関数を使用しているときには、条件式にはwhere句ではなく、HAVING句を用いる。
HAVING句の中に「200人以上」の条件を書いてあげる。

SQL> SELECT 学科コード,COUNT(*) FROM TT01_学生 group by 学科コード HAVING COUNT(*) >= 200; 学科コード COUNT(*) ---------- ---------- 1407 225 2531 242 2273 211 1521 255 2445 216 2789 225 2101 222 1293 221 2187 206 2617 219 10行が選択されました。 SQL>



  4. 「group byのときはWHENじゃなくてHAVING」と覚えておきましょう。
ちなみにgroup byとHAVINGはなかなか仲がよくて、「どっちが先だ」と争わない。
group by句とHAVING句を入れ替えても、同じ結果が得られる。

SQL> SELECT 学科コード,COUNT(*) FROM TT01_学生 group by 学科コード HAVING COUNT(*) >= 200; 学科コード COUNT(*) ---------- ---------- 1407 225 2531 242 2273 211 1521 255 2445 216 2789 225 2101 222 1293 221 2187 206 2617 219 10行が選択されました。 SQL> SELECT 学科コード,COUNT(*) FROM TT01_学生 HAVING COUNT(*) >= 200 group by 学科コード; 学科コード COUNT(*) ---------- ---------- 1407 225 2531 242 2273 211 1521 255 2445 216 2789 225 2101 222 1293 221 2187 206 2617 219 10行が選択されました。 SQL>



  5. ちなみに、誤解のないようにしておくと、whereを使えないのはグループ化した列だけ。
その他の列についてはWhere条件を使用可能。
下の例では、女子の(where 性別=1)の人数が50名以上(HAVING COUNT(*) >= 50)の学科を表示。

SQL> SELECT 学科コード,COUNT(*) FROM TT01_学生 where 性別=1 HAVING COUNT(*) >= 50 group by 学科コード; 学科コード COUNT(*) ---------- ---------- 1407 64 2531 72 1578 64 2273 58 2445 63 1521 70 2789 56 2101 57 1293 69 2617 69 2187 66 11行が選択されました。 SQL>



  6. おまけ。上記はCOUNT関数ばっかりだったので、MAX関数を使った例を。
学科内のTOEIC最高点が990点に達しない学科の一覧。

SQL> SELECT 学科コード,MAX(TOEIC) 学科内最高点 FROM TT01_学生 group by 学科コード HAVING MAX(TOEIC) < 990; 学科コード 学科内最高点 ---------- ------------ 2789 989 2875 963 2015 982 2187 983 1635 983 SQL>





    【PR】    Oracle実験室監修  『Oracleアーキテクチャ鳥瞰図』 PDF  (Oracleのアーキテクチャを一目で俯瞰できるイラスト)  


Home実験室 − No.0064

© 2011-2011   Amateur Laboratory of ORACLE
inserted by FC2 system