- ベストアンサー
WHERE句とHAVING句の違いとは?
- WHERE句とHAVING句は、SQL文において行の抽出条件を指定するために使用されます。
- WHERE句は、表から取り出す行の条件を指定するために使用されます。
- 一方、HAVING句は、グループ化した結果から取り出す行の条件を指定するために使用されます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
たとえば select col,sum(col2) from table1 having col3 = 10 group by col1 having sum(col2) > 10 こんなSQLを書くってことでしょうか? 自分的にはわかりずらいです・・
その他の回答 (4)
- root139
- ベストアンサー率60% (488/809)
分かりやすい違いとしてはHAVING句では集約関数が使えます。 下記の様な条件はWHERE句では書けません。 SELECT col_a, SUM(col_b) FROM tbl GROUP BY col_a HAVING SUM(col_b) > 3 HAVING句の使い方次第では歯抜けを調べたり、中央値を取得することもできます。 http://codezine.jp/article/detail/652
お礼
丁寧な解説ありがとうございました。 今回の回答を糧にして、さらに学んでいきたいと思います。
補足
なるほど、具体的な機能の違いは分りました。 では、なぜSQLを作った昔の人は、HAVING句にWHERE句の機能を統合しなかったのでしょうか? 例えば、 (1)仮に、HAVING句にWHERE句の機能を統合したとします。 (2)機能統合により、HAVING句で「表」も「グループ」も関係なくの抽出条件を指定できるようになる。 (3)結果、SQLがシンプルになる。(抽出条件には何でもHAVING=条件とつければよくなるから) 「仮定の話をいくらしてもムダ。現にこういう規則なんだからそれに従え」という向きもあると思いますが、なぜ、機能統合して1つの句にしなかったのか。然るべき理由があるのか。 そこが、どうしても疑問です。
- nda23
- ベストアンサー率54% (777/1415)
・WHERE句 単一のレコードで条件が確定するもの 例えば、顧客レコードに性別フィールドがあるとして、 「性別=男」というのは、別にグループ化して平均を 取ったり、合計しなくても判別できる条件ですね。 ・HAVING句 集計した結果は条件になるもの 例えば、地域別個人情報があるとします。 「平均年齢>60」とは個別レコードを見ても判定 出来ない話で、特定の条件でグループ化して、始めて そのグループが抽出条件になるか否かが判定できます。 このような違いがあります。 もっと具体的にはWHERE句が先に作用して抽出が行われ、 その後に集計されます。集計結果はHAVING句で判定され、 最終的にクエリの結果が出力されます。
お礼
WHERE句が先に作用するというの件は存じ上げませんでした。 明瞭なご回答ありがとうございます。
- yorozu_ya
- ベストアンサー率54% (76/140)
例を挙げます。 WHERE句→金額がプラスのものだけを抽出して集計する。 HAVING句→集計結果がプラスのものだけを抽出する。
- SaKaKashi
- ベストアンサー率24% (755/3136)
あなたの質問中に答えが書いてあると思うけど。 >・WHERE句 → 表から取り出す行の条件を指定 >・HAVING句 → グループ化した結果から取り出す行の条件を指定 表から取り出す行の条件を指定 と グループ化した結果から取り出す行の条件を指定 明らかに違いがあるじゃないですか。 「取り出す条件」と「取り出してグループ化した結果から取り出す条件」は違いますよね。
補足
そうなんですか? どちらも、表もグループ化した結果も、結局のところ「行の固まり」であり、同じではないのですか? 確かに、説明文は違いますが、差異が分りません。 例えば、 SELECT 列名 FROM 表名 WHERE 条件; SELECT 列名 FROM 表名 HAVING 条件; は、一緒の動きですよね? じゃあ、WHEREとHAVINGはどっちかに統一すればいいじゃん。両方無いと不都合あるの? その具体的なケースはどのようなものがあるのだろう? と、思い質問させていただきました。
お礼
ん~…。そうですか~。 言われてみれば、たしかに分かりづらいやも。 だからWHERE句とHAVING句を分けているのかな。 ありがとうございます。 私の求めていた答えが見つかりました。