プロが教える店舗&オフィスのセキュリティ対策術

情報処理初心者です。SQLの
GROUP BY の時の HAVINGの使い方が
イマイチよくわかりません。
問題によっては HAVINGの後にCOUNTなどが
あったり、なかったりします。この違いが
全くわかりません。

例えばこんな問題です。
履修者数が25名以上の科目名を抽出する場合SSELECT 科目名 COUNT (*) AS 履修者数
FROM 選択科目表A, 履修表B
WHERE A.科目コード= B.科目コード
GROUP BY 科目名
HAVING COUNT(*)>=25

となります。
しかし、別の問題は

男子の通学時間が一番長い時間を求める
SSELECT 性別 MAX (通学時間) AS 最高通学時間
FROM 生徒表
GROUP BY 性別
HAVING 性別=′男′

というようにHAVINGの後に何も
きていません。HAVING MAXではダメ
なんでしょうか…? そもそもHAVING MAX
なんて存在するのでしょうか?笑
なにもかもが、全くわかりません。

HAVINGの後にどんな関数
ならあってもいいのでしょうか?

HAVINGの後に関数がある時と
無い時との違いは…?

この二つを初心者の馬鹿な私でもわかりやすく
教えて頂けたら嬉しいです!
宜しくお願いします!
長文失礼しました!

A 回答 (1件)

> HAVINGの後にどんな関数


> ならあってもいいのでしょうか?

・ グループ化によって結果が決まる関数です。

> HAVINGの後に関数がある時と
> 無い時との違いは…

・判定に集計関数の結果を使いたいかどうかです。



WHERE も HAVING も、「条件に一致するものだけ抽出」という機能です。
違いは
・WHERE は グループ化の前に判定する。
・HAVINGはグループ化の後に判定する。
です。

雑に言うとこんな感じ
・JOINで結合されたテーブルを作る
・Where で合致する行を抽出
・GROUP BYでまとめる。COUNT等の集計関数の計算をする
・HAVINGで合致する行を抽出


「グループ化の後に判定する」ので、 HAVING では COUNT等の集計関数の結果を使って判定できる、という特徴があります。
HAVING COUNT(*)>=25
というのは、「グループ化して集計計算されたCOUNT(*) の値」が25以上、ということです。

ここで気をつけなければいけないのが
「集計関数の結果を使うことができる」
であって
「集計関数の結果を**使*わ*な*け*れ*ば*な*ら*な*い**」
ではない、という点です。

SELECT
 性別,
 MAX (通学時間) AS 最高通学時間
FROM 生徒表
GROUP BY 性別
HAVING 性別=′男′

の場合、グループ化後にも「性別」という列が有ります。
その、「グループ化後の『性別』列」の値が'男'である、というのが この HAVING の意味です。
※ この例では WHEREでも同様のことができます。

> HAVING MAXではダメなんでしょうか…?

例えば
・MAX (通学時間)が 1時間以上
とかいう条件なら、HAVINGで MAX関数を使って判定します。
ですが、これは、元のSQLとは目的が違います。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!