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>
|
|